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 <mhrica@redhat.com>
This commit is contained in:
Matej Hrica 2025-12-09 18:31:11 +01:00
parent a6a0138661
commit 593e71fce1

View File

@ -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<Mutex<FenceState>>,
resources: BTreeMap<u32, GpuResource>,
contexts: BTreeMap<u32, VirglContext>,
scanouts: [Option<VirtioGpuScanout>; 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)
}