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 <dbassey@redhat.com>
This commit is contained in:
Dorinda Bassey 2025-12-15 14:29:23 +01:00 committed by Manos Pitsidianakis
parent 8d7873a699
commit bc8b9b54dc
4 changed files with 37 additions and 30 deletions

8
Cargo.lock generated
View File

@ -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",

View File

@ -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

View File

@ -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"

View File

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