Skip to content

Commit bc8b9b5

Browse files
Dorinda Basseyepilys
authored andcommitted
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 <[email protected]>
1 parent 8d7873a commit bc8b9b5

File tree

4 files changed

+37
-30
lines changed

4 files changed

+37
-30
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vhost-device-gpu/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
### Changed
77

8+
- [[#916]] (https://github.com/rust-vmm/vhost-device/pull/916) vhost-device-gpu: Adapt to updated virglrenderer API
89
- [[#852]] (https://github.com/rust-vmm/vhost-device/pull/890) vhost-device-gpu: Refactor vhost-device-gpu
910

1011
### Fixed

vhost-device-gpu/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ log = "0.4"
2828
[target.'cfg(not(target_env = "musl"))'.dependencies]
2929
rutabaga_gfx = "0.1.75"
3030
thiserror = "2.0.17"
31-
virglrenderer = {version = "0.1.2", optional = true }
31+
virglrenderer = {version = "0.1.3", optional = true }
3232
vhost = { version = "0.15.0", features = ["vhost-user-backend"] }
3333
vhost-user-backend = "0.21"
3434
virtio-bindings = "0.2.5"

vhost-device-gpu/src/backend/virgl.rs

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
// SPDX-License-Identifier: Apache-2.0 or BSD-3-Clause
66

77
use std::{
8-
collections::BTreeMap,
8+
collections::{BTreeMap, HashSet},
99
io::IoSliceMut,
1010
os::fd::{AsFd, FromRawFd, IntoRawFd, RawFd},
1111
sync::{Arc, Mutex},
@@ -23,7 +23,7 @@ use vhost::vhost_user::{
2323
};
2424
use vhost_user_backend::{VringRwLock, VringT};
2525
use virglrenderer::{
26-
FenceHandler, Iovec, VirglContext, VirglRenderer, VirglRendererFlags, VirglResource,
26+
FenceHandler, Iovec, VirglRenderer, VirglRendererFlags, VirglResource,
2727
VIRGL_HANDLE_TYPE_MEM_DMABUF,
2828
};
2929
use vm_memory::{GuestAddress, GuestMemory, GuestMemoryMmap, VolatileSlice};
@@ -137,7 +137,7 @@ pub struct VirglRendererAdapter {
137137
gpu_backend: GpuBackend,
138138
fence_state: Arc<Mutex<FenceState>>,
139139
resources: BTreeMap<u32, GpuResource>,
140-
contexts: BTreeMap<u32, VirglContext>,
140+
context_ids: HashSet<u32>,
141141
scanouts: [Option<VirtioGpuScanout>; VIRTIO_GPU_MAX_SCANOUTS as usize],
142142
}
143143

@@ -166,7 +166,7 @@ impl VirglRendererAdapter {
166166
gpu_backend,
167167
fence_state,
168168
resources: BTreeMap::new(),
169-
contexts: BTreeMap::new(),
169+
context_ids: HashSet::new(),
170170
scanouts: Default::default(),
171171
}
172172
}
@@ -346,41 +346,45 @@ impl Renderer for VirglRendererAdapter {
346346
context_init: u32,
347347
context_name: Option<&str>,
348348
) -> VirtioGpuResult {
349-
if self.contexts.contains_key(&ctx_id) {
349+
if self.context_ids.contains(&ctx_id) {
350350
return Err(ErrUnspec);
351351
}
352352

353-
// Create the VirglContext using virglrenderer
354-
let ctx = virglrenderer::VirglContext::create_context(ctx_id, context_init, context_name)
353+
self.renderer
354+
.create_context(ctx_id, context_init, context_name)
355355
.map_err(|_| ErrInvalidContextId)?;
356356

357-
// Insert the newly created context into our local BTreeMap.
358-
self.contexts.insert(ctx_id, ctx);
357+
self.context_ids.insert(ctx_id);
359358
Ok(OkNoData)
360359
}
361360

362361
fn destroy_context(&mut self, ctx_id: u32) -> VirtioGpuResult {
363-
self.contexts.remove(&ctx_id).ok_or(ErrInvalidContextId)?;
362+
if !self.context_ids.remove(&ctx_id) {
363+
return Err(ErrInvalidContextId);
364+
}
365+
self.renderer.destroy_context(ctx_id);
364366
Ok(OkNoData)
365367
}
366368

367369
fn context_attach_resource(&mut self, ctx_id: u32, resource_id: u32) -> VirtioGpuResult {
368-
let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?;
369-
let resource = self
370-
.resources
371-
.get_mut(&resource_id)
372-
.ok_or(ErrInvalidResourceId)?;
373-
ctx.attach(&mut resource.virgl_resource);
370+
if !self.context_ids.contains(&ctx_id) {
371+
return Err(ErrInvalidContextId);
372+
}
373+
if !self.resources.contains_key(&resource_id) {
374+
return Err(ErrInvalidResourceId);
375+
}
376+
self.renderer.ctx_attach_resource(ctx_id, resource_id);
374377
Ok(OkNoData)
375378
}
376379

377380
fn context_detach_resource(&mut self, ctx_id: u32, resource_id: u32) -> VirtioGpuResult {
378-
let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?;
379-
let resource = self
380-
.resources
381-
.get_mut(&resource_id)
382-
.ok_or(ErrInvalidResourceId)?;
383-
ctx.detach(&resource.virgl_resource);
381+
if !self.context_ids.contains(&ctx_id) {
382+
return Err(ErrInvalidContextId);
383+
}
384+
if !self.resources.contains_key(&resource_id) {
385+
return Err(ErrInvalidResourceId);
386+
}
387+
self.renderer.ctx_detach_resource(ctx_id, resource_id);
384388
Ok(OkNoData)
385389
}
386390

@@ -390,9 +394,11 @@ impl Renderer for VirglRendererAdapter {
390394
commands: &mut [u8],
391395
fence_ids: &[u64],
392396
) -> VirtioGpuResult {
393-
let ctx = self.contexts.get_mut(&ctx_id).ok_or(ErrInvalidContextId)?;
394-
395-
ctx.submit_cmd(commands, fence_ids)
397+
if !self.context_ids.contains(&ctx_id) {
398+
return Err(ErrInvalidContextId);
399+
}
400+
self.renderer
401+
.submit_cmd(ctx_id, commands, fence_ids)
396402
.map(|()| OkNoData)
397403
.map_err(|_| ErrUnspec)
398404
}

0 commit comments

Comments
 (0)