diff options
author | Gurchetan Singh <gurchetansingh@chromium.org> | 2019-04-30 10:22:15 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-01 07:53:34 +0000 |
commit | 719f2831ed394bf4f3fd777938261bda493b05fc (patch) | |
tree | 9397041cb0b3db2df13fee96dec621db7a691d14 /gpu_renderer | |
parent | 5b636babc1e83b7187ef72bd85b3a3bdc2e5d03f (diff) | |
download | crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar.gz crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar.bz2 crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar.lz crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar.xz crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.tar.zst crosvm-719f2831ed394bf4f3fd777938261bda493b05fc.zip |
virtio-gpu: handle VIRTIO_GPU_CMD_RESOURCE_CREATE_V2
BUG=chromium:924405 TEST=compile Change-Id: I57379452f6805aaf429c268b95ddd3aecd07e90e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1591463 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
Diffstat (limited to 'gpu_renderer')
-rw-r--r-- | gpu_renderer/src/lib.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs index 42df26a..f04ee66 100644 --- a/gpu_renderer/src/lib.rs +++ b/gpu_renderer/src/lib.rs @@ -410,6 +410,62 @@ impl Renderer { #[cfg(not(feature = "virtio-gpu-next"))] Err(Error::Unsupported) } + + #[allow(unused_variables)] + pub fn resource_create_v2( + &self, + resource_id: u32, + guest_memory_type: u32, + guest_caching_type: u32, + size: u64, + mem: &GuestMemory, + iovecs: &[(GuestAddress, usize)], + args: &[u8], + ) -> Result<Resource> { + #[cfg(feature = "virtio-gpu-next")] + { + if iovecs + .iter() + .any(|&(addr, len)| mem.get_slice(addr.offset(), len as u64).is_err()) + { + return Err(Error::InvalidIovec); + } + + let mut vecs = Vec::new(); + for &(addr, len) in iovecs { + // Unwrap will not panic because we already checked the slices. + let slice = mem.get_slice(addr.offset(), len as u64).unwrap(); + vecs.push(VirglVec { + base: slice.as_ptr() as *mut c_void, + len, + }); + } + + let ret = unsafe { + virgl_renderer_resource_create_v2( + resource_id, + guest_memory_type, + guest_caching_type, + size, + vecs.as_ptr() as *const iovec, + vecs.len() as u32, + args.as_ptr() as *const c_void, + args.len() as u32, + ) + }; + + ret_to_res(ret)?; + + Ok(Resource { + id: resource_id, + backing_iovecs: vecs, + backing_mem: None, + no_sync_send: PhantomData, + }) + } + #[cfg(not(feature = "virtio-gpu-next"))] + Err(Error::Unsupported) + } } /// A context in which resources can be attached/detached and commands can be submitted. |