mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-05 10:10:41 +00:00
gpu: add new gfxstream initialization flags
BUG=b:233676779 TEST=presubmit Change-Id: I02103077006c2ac4bc8b3b21bf186de9743530e7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3668930 Auto-Submit: Kaiyi Li <kaiyili@google.com> Reviewed-by: Jason Macnak <natsu@google.com> Commit-Queue: Kaiyi Li <kaiyili@google.com> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
parent
1575e1c2f3
commit
bf7a2f37b2
7 changed files with 70 additions and 1 deletions
|
@ -1025,6 +1025,7 @@ impl Gpu {
|
|||
.set_use_vulkan(gpu_parameters.use_vulkan)
|
||||
.set_use_syncfd(gpu_parameters.gfxstream_use_syncfd)
|
||||
.set_use_guest_angle(gpu_parameters.gfxstream_use_guest_angle)
|
||||
.set_wsi(gpu_parameters.wsi.as_ref())
|
||||
.set_use_external_blob(external_blob)
|
||||
.set_use_render_server(render_server_fd.is_some());
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
//! Definitions and utilities for GPU related parameters.
|
||||
|
||||
use super::GpuMode;
|
||||
use rutabaga_gfx::RutabagaWsi;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
|
@ -37,6 +38,8 @@ pub struct GpuParameters {
|
|||
pub gfxstream_use_guest_angle: bool,
|
||||
pub gfxstream_use_syncfd: bool,
|
||||
pub use_vulkan: bool,
|
||||
pub gfxstream_support_gles31: bool,
|
||||
pub wsi: Option<RutabagaWsi>,
|
||||
pub udmabuf: bool,
|
||||
pub mode: GpuMode,
|
||||
pub cache_path: Option<String>,
|
||||
|
@ -60,6 +63,8 @@ impl Default for GpuParameters {
|
|||
} else {
|
||||
GpuMode::Mode2D
|
||||
},
|
||||
gfxstream_support_gles31: true,
|
||||
wsi: None,
|
||||
cache_path: None,
|
||||
cache_size: None,
|
||||
udmabuf: false,
|
||||
|
|
|
@ -21,6 +21,7 @@ base = { path = "../base" }
|
|||
remain = "*"
|
||||
sync = { path = "../common/sync" }
|
||||
thiserror = "*"
|
||||
serde = { version = "1", features = [ "derive" ] }
|
||||
#vulkano = {git = "https:/github.com/vulkano-rs/vulkano.git", optional = true}
|
||||
|
||||
[build-dependencies]
|
||||
|
|
|
@ -855,6 +855,12 @@ impl RutabagaBuilder {
|
|||
self
|
||||
}
|
||||
|
||||
/// Use the Vulkan swapchain to draw on the host window for gfxstream.
|
||||
pub fn set_wsi(mut self, v: Option<&RutabagaWsi>) -> RutabagaBuilder {
|
||||
self.gfxstream_flags = self.gfxstream_flags.set_wsi(v);
|
||||
self
|
||||
}
|
||||
|
||||
/// Set rutabaga channels for the RutabagaBuilder
|
||||
pub fn set_rutabaga_channels(
|
||||
mut self,
|
||||
|
|
|
@ -13,6 +13,7 @@ use std::str::Utf8Error;
|
|||
use base::{Error as BaseError, ExternalMappingError, SafeDescriptor};
|
||||
use data_model::VolatileMemoryError;
|
||||
use remain::sorted;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use thiserror::Error;
|
||||
|
||||
#[cfg(feature = "vulkano")]
|
||||
|
@ -409,12 +410,18 @@ const GFXSTREAM_RENDERER_FLAGS_USE_GLES: u32 = 1 << 4;
|
|||
const GFXSTREAM_RENDERER_FLAGS_NO_VK_BIT: u32 = 1 << 5;
|
||||
const GFXSTREAM_RENDERER_FLAGS_NO_SYNCFD_BIT: u32 = 1 << 20;
|
||||
const GFXSTREAM_RENDERER_FLAGS_GUEST_USES_ANGLE: u32 = 1 << 21;
|
||||
const GFXSTREAM_RENDERER_FLAGS_VULKAN_NATIVE_SWAPCHAIN_BIT: u32 = 1 << 22;
|
||||
pub const GFXSTREAM_RENDERER_FLAGS_ASYNC_FENCE_CB: u32 = 1 << 23;
|
||||
|
||||
/// gfxstream flag struct.
|
||||
#[derive(Copy, Clone, Default)]
|
||||
pub struct GfxstreamFlags(u32);
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
pub enum RutabagaWsi {
|
||||
Vulkan,
|
||||
}
|
||||
|
||||
impl GfxstreamFlags {
|
||||
/// Create new gfxstream flags.
|
||||
pub fn new() -> GfxstreamFlags {
|
||||
|
@ -468,6 +475,15 @@ impl GfxstreamFlags {
|
|||
pub fn use_async_fence_cb(self, v: bool) -> GfxstreamFlags {
|
||||
self.set_flag(GFXSTREAM_RENDERER_FLAGS_ASYNC_FENCE_CB, v)
|
||||
}
|
||||
|
||||
/// Use the Vulkan swapchain to draw on the host window.
|
||||
pub fn set_wsi(self, v: Option<&RutabagaWsi>) -> GfxstreamFlags {
|
||||
let use_vulkan_swapchain = matches!(v, Some(RutabagaWsi::Vulkan));
|
||||
self.set_flag(
|
||||
GFXSTREAM_RENDERER_FLAGS_VULKAN_NATIVE_SWAPCHAIN_BIT,
|
||||
use_vulkan_swapchain,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<GfxstreamFlags> for u32 {
|
||||
|
|
40
src/main.rs
40
src/main.rs
|
@ -72,7 +72,8 @@ use vm_control::{
|
|||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
use x86_64::{set_enable_pnp_data_msr_config, set_itmt_msr_config};
|
||||
|
||||
use rutabaga_gfx::calculate_context_mask;
|
||||
#[cfg(feature = "gpu")]
|
||||
use rutabaga_gfx::{calculate_context_mask, RutabagaWsi};
|
||||
|
||||
const ONE_MB: u64 = 1 << 20;
|
||||
const MB_ALIGNED: u64 = ONE_MB - 1;
|
||||
|
@ -389,6 +390,17 @@ fn parse_gpu_options(s: Option<&str>, gpu_params: &mut GpuParameters) -> argumen
|
|||
}
|
||||
}
|
||||
}
|
||||
"wsi" => match v {
|
||||
"vk" => {
|
||||
gpu_params.wsi = Some(RutabagaWsi::Vulkan);
|
||||
}
|
||||
_ => {
|
||||
return Err(argument::Error::InvalidValue {
|
||||
value: v.to_string(),
|
||||
expected: String::from("gpu parameter 'wsi' should be vk"),
|
||||
});
|
||||
}
|
||||
},
|
||||
"width" => {
|
||||
let width = v
|
||||
.parse::<u32>()
|
||||
|
@ -3850,6 +3862,32 @@ mod tests {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "gpu")]
|
||||
#[test]
|
||||
fn parse_gpu_options_gfxstream_with_wsi_specified() {
|
||||
let mut gpu_params: GpuParameters = Default::default();
|
||||
assert!(parse_gpu_options(Some("backend=virglrenderer,wsi=vk"), &mut gpu_params).is_ok());
|
||||
assert!(matches!(gpu_params.wsi, Some(RutabagaWsi::Vulkan)));
|
||||
|
||||
let mut gpu_params: GpuParameters = Default::default();
|
||||
assert!(parse_gpu_options(Some("wsi=vk,backend=virglrenderer"), &mut gpu_params).is_ok());
|
||||
assert!(matches!(gpu_params.wsi, Some(RutabagaWsi::Vulkan)));
|
||||
|
||||
let mut gpu_params: GpuParameters = Default::default();
|
||||
assert!(parse_gpu_options(
|
||||
Some("backend=virglrenderer,wsi=invalid_value"),
|
||||
&mut gpu_params
|
||||
)
|
||||
.is_err());
|
||||
|
||||
let mut gpu_params: GpuParameters = Default::default();
|
||||
assert!(parse_gpu_options(
|
||||
Some("wsi=invalid_value,backend=virglrenderer"),
|
||||
&mut gpu_params
|
||||
)
|
||||
.is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_battery_vaild() {
|
||||
parse_battery_options(Some("type=goldfish")).expect("parse should have succeded");
|
||||
|
|
|
@ -218,6 +218,8 @@ pub fn get_arguments() -> Vec<Argument> {
|
|||
|
||||
vulkan[=true|=false] - If the backend should support vulkan
|
||||
|
||||
wsi=vk - If the gfxstream backend should use the Vulkan swapchain to draw on a window
|
||||
|
||||
cache-path=PATH - The path to the virtio-gpu device shader cache.
|
||||
|
||||
cache-size=SIZE - The maximum size of the shader cache."),
|
||||
|
|
Loading…
Reference in a new issue