mirror of
https://github.com/rust-vmm/vhost-device.git
synced 2025-12-27 23:48:55 +00:00
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:
parent
8d7873a699
commit
bc8b9b54dc
8
Cargo.lock
generated
8
Cargo.lock
generated
@ -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",
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user