diff options
Diffstat (limited to 'devices/src/virtio/gpu/mod.rs')
-rw-r--r-- | devices/src/virtio/gpu/mod.rs | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs index aa674a8..8cc211f 100644 --- a/devices/src/virtio/gpu/mod.rs +++ b/devices/src/virtio/gpu/mod.rs @@ -6,10 +6,10 @@ mod protocol; mod virtio_2d_backend; mod virtio_3d_backend; mod virtio_backend; +mod virtio_gfxstream_backend; use std::cell::RefCell; use std::collections::VecDeque; -use std::fs::File; use std::i64; use std::io::Read; use std::mem::{self, size_of}; @@ -40,6 +40,8 @@ use super::{PciCapabilityType, VirtioPciShmCap, VirtioPciShmCapID}; use self::protocol::*; use self::virtio_2d_backend::Virtio2DBackend; use self::virtio_3d_backend::Virtio3DBackend; +#[cfg(feature = "gfxstream")] +use self::virtio_gfxstream_backend::VirtioGfxStreamBackend; use crate::pci::{PciBarConfiguration, PciBarPrefetchable, PciBarRegionType, PciCapability}; use vm_control::VmMemoryControlRequestSocket; @@ -51,6 +53,8 @@ pub const DEFAULT_DISPLAY_HEIGHT: u32 = 1024; pub enum GpuMode { Mode2D, Mode3D, + #[cfg(feature = "gfxstream")] + ModeGfxStream, } #[derive(Debug)] @@ -64,16 +68,6 @@ pub struct GpuParameters { pub mode: GpuMode, } -pub const DEFAULT_GPU_PARAMS: GpuParameters = GpuParameters { - display_width: DEFAULT_DISPLAY_WIDTH, - display_height: DEFAULT_DISPLAY_HEIGHT, - renderer_use_egl: true, - renderer_use_gles: true, - renderer_use_glx: false, - renderer_use_surfaceless: true, - mode: GpuMode::Mode3D, -}; - // First queue is for virtio gpu commands. Second queue is for cursor commands, which we expect // there to be fewer of. const QUEUE_SIZES: &[u16] = &[256, 16]; @@ -83,6 +77,20 @@ const GPU_BAR_NUM: u8 = 4; const GPU_BAR_OFFSET: u64 = 0; const GPU_BAR_SIZE: u64 = 1 << 33; +impl Default for GpuParameters { + fn default() -> Self { + GpuParameters { + display_width: DEFAULT_DISPLAY_WIDTH, + display_height: DEFAULT_DISPLAY_HEIGHT, + renderer_use_egl: true, + renderer_use_gles: true, + renderer_use_glx: false, + renderer_use_surfaceless: true, + mode: GpuMode::Mode3D, + } + } +} + /// A virtio-gpu backend state tracker which supports display and potentially accelerated rendering. /// /// Commands from the virtio-gpu protocol can be submitted here using the methods, and they will be @@ -132,7 +140,7 @@ trait Backend { fn import_event_device(&mut self, event_device: EventDevice, scanout: u32); /// If supported, export the resource with the given id to a file. - fn export_resource(&mut self, id: u32) -> Option<File>; + fn export_resource(&mut self, id: u32) -> ResourceResponse; /// Gets the list of supported display resolutions as a slice of `(width, height)` tuples. fn display_info(&self) -> [(u32, u32); 1]; @@ -301,6 +309,8 @@ trait Backend { enum BackendKind { Virtio2D, Virtio3D, + #[cfg(feature = "gfxstream")] + VirtioGfxStream, } impl BackendKind { @@ -309,6 +319,8 @@ impl BackendKind { match self { BackendKind::Virtio2D => Virtio2DBackend::capsets(), BackendKind::Virtio3D => Virtio3DBackend::capsets(), + #[cfg(feature = "gfxstream")] + BackendKind::VirtioGfxStream => VirtioGfxStreamBackend::capsets(), } } @@ -317,6 +329,8 @@ impl BackendKind { match self { BackendKind::Virtio2D => Virtio2DBackend::features(), BackendKind::Virtio3D => Virtio3DBackend::features(), + #[cfg(feature = "gfxstream")] + BackendKind::VirtioGfxStream => VirtioGfxStreamBackend::features(), } } @@ -350,6 +364,16 @@ impl BackendKind { gpu_device_socket, pci_bar, ), + #[cfg(feature = "gfxstream")] + BackendKind::VirtioGfxStream => VirtioGfxStreamBackend::build( + possible_displays, + display_width, + display_height, + renderer_flags, + event_devices, + gpu_device_socket, + pci_bar, + ), } } } @@ -391,7 +415,7 @@ impl Frontend { } fn process_resource_bridge(&mut self, resource_bridge: &ResourceResponseSocket) { - let request = match resource_bridge.recv() { + let ResourceRequest::GetResource { id } = match resource_bridge.recv() { Ok(msg) => msg, Err(e) => { error!("error receiving resource bridge request: {}", e); @@ -399,13 +423,7 @@ impl Frontend { } }; - let response = match request { - ResourceRequest::GetResource { id } => self - .backend - .export_resource(id) - .map(ResourceResponse::Resource) - .unwrap_or(ResourceResponse::Invalid), - }; + let response = self.backend.export_resource(id); if let Err(e) = resource_bridge.send(&response) { error!("error sending resource bridge request: {}", e); @@ -1029,6 +1047,8 @@ impl Gpu { let backend_kind = match gpu_parameters.mode { GpuMode::Mode2D => BackendKind::Virtio2D, GpuMode::Mode3D => BackendKind::Virtio3D, + #[cfg(feature = "gfxstream")] + GpuMode::ModeGfxStream => BackendKind::VirtioGfxStream, }; Gpu { |