summary refs log tree commit diff
path: root/gpu_renderer
diff options
context:
space:
mode:
authorGurchetan Singh <gurchetansingh@chromium.org>2019-04-30 10:22:15 -0700
committerCommit Bot <commit-bot@chromium.org>2019-10-01 07:53:34 +0000
commit719f2831ed394bf4f3fd777938261bda493b05fc (patch)
tree9397041cb0b3db2df13fee96dec621db7a691d14 /gpu_renderer
parent5b636babc1e83b7187ef72bd85b3a3bdc2e5d03f (diff)
downloadcrosvm-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.rs56
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.