From 593e71fce1f0a9596af9adbb4159ff364fd881cc Mon Sep 17 00:00:00 2001 From: Matej Hrica Date: Tue, 9 Dec 2025 18:31:11 +0100 Subject: [PATCH] gpu/virgl: Update to new context management API Change context handling to use the new virglrenderer API where contexts are managed internally by the renderer instead of being tracked in a separate BTreeMap. Signed-off-by: Matej Hrica --- vhost-device-gpu/src/backend/virgl.rs | 42 ++++++++++----------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/vhost-device-gpu/src/backend/virgl.rs b/vhost-device-gpu/src/backend/virgl.rs index 1fbd9d7..12bf3e3 100644 --- a/vhost-device-gpu/src/backend/virgl.rs +++ b/vhost-device-gpu/src/backend/virgl.rs @@ -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}; @@ -134,7 +134,6 @@ pub struct VirglRendererAdapter { gpu_backend: GpuBackend, fence_state: Arc>, resources: BTreeMap, - contexts: BTreeMap, scanouts: [Option; VIRTIO_GPU_MAX_SCANOUTS as usize], } @@ -166,7 +165,6 @@ impl VirglRendererAdapter { gpu_backend, fence_state, resources: BTreeMap::new(), - contexts: BTreeMap::new(), scanouts: Default::default(), } } @@ -347,41 +345,34 @@ impl Renderer for VirglRendererAdapter { context_init: u32, context_name: Option<&str>, ) -> VirtioGpuResult { - if self.contexts.contains_key(&ctx_id) { - return Err(ErrUnspec); - } + trace!("Creating context ctx_id={ctx_id}, '{context_name:?}', context_init={context_init}"); - // Create the VirglContext using virglrenderer - let ctx = virglrenderer::VirglContext::create_context(ctx_id, context_init, context_name) + // Create the context using virglrenderer (contexts are now managed internally) + 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); Ok(OkNoData) } fn destroy_context(&mut self, ctx_id: u32) -> VirtioGpuResult { - self.contexts.remove(&ctx_id).ok_or(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.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.resources.contains_key(&resource_id) { + return Err(ErrInvalidResourceId); + } + self.renderer.ctx_detach_resource(ctx_id, resource_id); Ok(OkNoData) } @@ -391,9 +382,8 @@ 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) + self.renderer + .submit_cmd(ctx_id, commands, fence_ids) .map(|()| OkNoData) .map_err(|_| ErrUnspec) }