From bc8b9b54dcff19d67afcb5d0354adfd2df4da6b6 Mon Sep 17 00:00:00 2001 From: Dorinda Bassey Date: Mon, 15 Dec 2025 14:29:23 +0100 Subject: [PATCH] vhost-device-gpu: Adapt to updated virglrenderer API the updated virglrenderer crate no longer exposes a VirglContext type. Instead, context management is now handled directly through the VirglRenderer object, hence use the VirglRenderer directly. Signed-off-by: Dorinda Bassey --- Cargo.lock | 8 ++-- vhost-device-gpu/CHANGELOG.md | 1 + vhost-device-gpu/Cargo.toml | 2 +- vhost-device-gpu/src/backend/virgl.rs | 56 +++++++++++++++------------ 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 85f8baf..0d6926c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2292,9 +2292,9 @@ dependencies = [ [[package]] name = "virglrenderer" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14b3ceb5f84adcbd531661a6c6c0883c3d6cd83427886d3179675b19268f4450" +checksum = "6906bec0a34658c4a81933153a784f9f8d8bcdbe67dcf9e58ea7b67fd1f8ec0b" dependencies = [ "libc 1.0.0-alpha.1", "log", @@ -2304,9 +2304,9 @@ dependencies = [ [[package]] name = "virglrenderer-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b62ecfe310dacb7a9cd5b9e4c2e25fa5663a9c860c3396ed3b11ee1e06e4b4" +checksum = "5e1cd0732acd1881433c4689bb2d359d64b9a64ddf64ab7231d9db35edbd181a" dependencies = [ "bindgen", "pkg-config", diff --git a/vhost-device-gpu/CHANGELOG.md b/vhost-device-gpu/CHANGELOG.md index 22a7531..0abc4b8 100644 --- a/vhost-device-gpu/CHANGELOG.md +++ b/vhost-device-gpu/CHANGELOG.md @@ -5,6 +5,7 @@ ### Changed +- [[#916]] (https://github.com/rust-vmm/vhost-device/pull/916) vhost-device-gpu: Adapt to updated virglrenderer API - [[#852]] (https://github.com/rust-vmm/vhost-device/pull/890) vhost-device-gpu: Refactor vhost-device-gpu ### Fixed diff --git a/vhost-device-gpu/Cargo.toml b/vhost-device-gpu/Cargo.toml index 6eae2d6..2c779bf 100644 --- a/vhost-device-gpu/Cargo.toml +++ b/vhost-device-gpu/Cargo.toml @@ -28,7 +28,7 @@ log = "0.4" [target.'cfg(not(target_env = "musl"))'.dependencies] rutabaga_gfx = "0.1.75" thiserror = "2.0.17" -virglrenderer = {version = "0.1.2", optional = true } +virglrenderer = {version = "0.1.3", optional = true } vhost = { version = "0.15.0", features = ["vhost-user-backend"] } vhost-user-backend = "0.21" virtio-bindings = "0.2.5" diff --git a/vhost-device-gpu/src/backend/virgl.rs b/vhost-device-gpu/src/backend/virgl.rs index b1b6279..b6c7b77 100644 --- a/vhost-device-gpu/src/backend/virgl.rs +++ b/vhost-device-gpu/src/backend/virgl.rs @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 or BSD-3-Clause use std::{ - collections::BTreeMap, + collections::{BTreeMap, HashSet}, io::IoSliceMut, os::fd::{AsFd, FromRawFd, IntoRawFd, RawFd}, sync::{Arc, Mutex}, @@ -23,7 +23,7 @@ use vhost::vhost_user::{ }; use vhost_user_backend::{VringRwLock, VringT}; use virglrenderer::{ - FenceHandler, Iovec, VirglContext, VirglRenderer, VirglRendererFlags, VirglResource, + FenceHandler, Iovec, VirglRenderer, VirglRendererFlags, VirglResource, VIRGL_HANDLE_TYPE_MEM_DMABUF, }; use vm_memory::{GuestAddress, GuestMemory, GuestMemoryMmap, VolatileSlice}; @@ -137,7 +137,7 @@ pub struct VirglRendererAdapter { gpu_backend: GpuBackend, fence_state: Arc>, resources: BTreeMap, - contexts: BTreeMap, + context_ids: HashSet, scanouts: [Option; VIRTIO_GPU_MAX_SCANOUTS as usize], } @@ -166,7 +166,7 @@ impl VirglRendererAdapter { gpu_backend, fence_state, resources: BTreeMap::new(), - contexts: BTreeMap::new(), + context_ids: HashSet::new(), scanouts: Default::default(), } } @@ -346,41 +346,45 @@ impl Renderer for VirglRendererAdapter { context_init: u32, context_name: Option<&str>, ) -> VirtioGpuResult { - if self.contexts.contains_key(&ctx_id) { + if self.context_ids.contains(&ctx_id) { return Err(ErrUnspec); } - // Create the VirglContext using virglrenderer - let ctx = virglrenderer::VirglContext::create_context(ctx_id, context_init, context_name) + self.renderer + .create_context(ctx_id, context_init, context_name) .map_err(|_| ErrInvalidContextId)?; - // Insert the newly created context into our local BTreeMap. - self.contexts.insert(ctx_id, ctx); + self.context_ids.insert(ctx_id); Ok(OkNoData) } fn destroy_context(&mut self, ctx_id: u32) -> VirtioGpuResult { - self.contexts.remove(&ctx_id).ok_or(ErrInvalidContextId)?; + if !self.context_ids.remove(&ctx_id) { + return Err(ErrInvalidContextId); + } + self.renderer.destroy_context(ctx_id); Ok(OkNoData) } fn context_attach_resource(&mut self, ctx_id: u32, resource_id: u32) -> VirtioGpuResult { - let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?; - let resource = self - .resources - .get_mut(&resource_id) - .ok_or(ErrInvalidResourceId)?; - ctx.attach(&mut resource.virgl_resource); + if !self.context_ids.contains(&ctx_id) { + return Err(ErrInvalidContextId); + } + if !self.resources.contains_key(&resource_id) { + return Err(ErrInvalidResourceId); + } + self.renderer.ctx_attach_resource(ctx_id, resource_id); Ok(OkNoData) } fn context_detach_resource(&mut self, ctx_id: u32, resource_id: u32) -> VirtioGpuResult { - let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?; - let resource = self - .resources - .get_mut(&resource_id) - .ok_or(ErrInvalidResourceId)?; - ctx.detach(&resource.virgl_resource); + if !self.context_ids.contains(&ctx_id) { + return Err(ErrInvalidContextId); + } + if !self.resources.contains_key(&resource_id) { + return Err(ErrInvalidResourceId); + } + self.renderer.ctx_detach_resource(ctx_id, resource_id); Ok(OkNoData) } @@ -390,9 +394,11 @@ impl Renderer for VirglRendererAdapter { commands: &mut [u8], fence_ids: &[u64], ) -> VirtioGpuResult { - let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?; - - ctx.submit_cmd(commands, fence_ids) + if !self.context_ids.contains(&ctx_id) { + return Err(ErrInvalidContextId); + } + self.renderer + .submit_cmd(ctx_id, commands, fence_ids) .map(|()| OkNoData) .map_err(|_| ErrUnspec) }