summary refs log tree commit diff
path: root/gpu_renderer
diff options
context:
space:
mode:
authorGurchetan Singh <gurchetansingh@chromium.org>2020-01-21 20:04:32 -0800
committerCommit Bot <commit-bot@chromium.org>2020-03-23 20:37:11 +0000
commit151af70ac9778f5247f6fd58fe8b20c089604429 (patch)
tree6005dd8571b877189b154ff203a3f1f063d5f66a /gpu_renderer
parent911e21e3925634833cf91ca1dd688c6047dc4b47 (diff)
downloadcrosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar.gz
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar.bz2
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar.lz
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar.xz
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.tar.zst
crosvm-151af70ac9778f5247f6fd58fe8b20c089604429.zip
devices: gpu: modify resource v2
Rebase of zero-copy virtio-gpu flow:

    * Removes guest_memory_type/guest_caching_type in favor of a bitmask
    * Removes ALLOCATION_METADATA, since ideally we'd just read from
      guest memory to get guest responses
    * Renames HOST_COHERENT to HOST_VISIBLE
    * Adds a few more feature flags

BUG=chromium:924405
TEST=compile

Change-Id: I0d5a84b66cfa6d09f7e2d07ed8e761e7ba850284
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2013767
Tested-by: Gurchetan Singh <gurchetansingh@chromium.org>
Commit-Queue: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Lingfeng Yang <lfy@google.com>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'gpu_renderer')
-rw-r--r--gpu_renderer/src/generated/virglrenderer.rs27
-rw-r--r--gpu_renderer/src/lib.rs59
2 files changed, 32 insertions, 54 deletions
diff --git a/gpu_renderer/src/generated/virglrenderer.rs b/gpu_renderer/src/generated/virglrenderer.rs
index 01bf219..020d69f 100644
--- a/gpu_renderer/src/generated/virglrenderer.rs
+++ b/gpu_renderer/src/generated/virglrenderer.rs
@@ -307,24 +307,21 @@ extern "C" {
         execute_size: u32,
     ) -> ::std::os::raw::c_int;
 }
-extern "C" {
-    pub fn virgl_renderer_allocation_metadata(
-        request: *const ::std::os::raw::c_void,
-        response: *mut ::std::os::raw::c_void,
-        request_size: u32,
-        response_size: u32,
-    ) -> ::std::os::raw::c_int;
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct virgl_renderer_resource_create_v2_args {
+    pub version: u32,
+    pub res_handle: u32,
+    pub ctx_id: u32,
+    pub flags: u32,
+    pub size: u64,
+    pub memory_id: u64,
+    pub iovecs: *mut iovec,
+    pub num_iovs: u32,
 }
 extern "C" {
     pub fn virgl_renderer_resource_create_v2(
-        resource_id: u32,
-        guest_memory_type: u32,
-        guest_caching_type: u32,
-        size: u64,
-        iovec: *const iovec,
-        num_iovs: u32,
-        args: *const ::std::os::raw::c_void,
-        args_size: u32,
+        args: *mut virgl_renderer_resource_create_v2_args,
     ) -> ::std::os::raw::c_int;
 }
 pub type __builtin_va_list = [__va_list_tag; 1usize];
diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs
index d75add1..5e5ab95 100644
--- a/gpu_renderer/src/lib.rs
+++ b/gpu_renderer/src/lib.rs
@@ -37,7 +37,7 @@ pub use crate::command_buffer::CommandBufferBuilder;
 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
 pub use crate::vsnprintf::vsnprintf;
 
-/// Arguments used in `Renderer::create_resource`..
+/// Arguments used in `Renderer::create_resource`.
 pub type ResourceCreateArgs = virgl_renderer_resource_create_args;
 /// Some of the information returned from `Resource::export_query`.
 pub type Query = virgl_renderer_export_query;
@@ -406,71 +406,52 @@ impl Renderer {
     }
 
     #[allow(unused_variables)]
-    pub fn allocation_metadata(&self, request: &[u8], response: &mut Vec<u8>) -> Result<()> {
-        #[cfg(feature = "virtio-gpu-next")]
-        {
-            let ret = unsafe {
-                virgl_renderer_allocation_metadata(
-                    request.as_ptr() as *const c_void,
-                    response.as_mut_ptr() as *mut c_void,
-                    request.len() as u32,
-                    response.len() as u32,
-                )
-            };
-            ret_to_res(ret)
-        }
-        #[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,
+        ctx_id: u32,
+        flags: u32,
         size: u64,
+        memory_id: u64,
+        vecs: &[(GuestAddress, usize)],
         mem: &GuestMemory,
-        iovecs: &[(GuestAddress, usize)],
-        args: &[u8],
     ) -> Result<Resource> {
         #[cfg(feature = "virtio-gpu-next")]
         {
-            if iovecs
+            if vecs
                 .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 {
+            let mut iovecs = Vec::new();
+            for &(addr, len) in vecs {
                 // Unwrap will not panic because we already checked the slices.
                 let slice = mem.get_slice(addr.offset(), len as u64).unwrap();
-                vecs.push(VirglVec {
+                iovecs.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,
-                )
+            let mut resource_create_args = virgl_renderer_resource_create_v2_args {
+                version: 1,
+                res_handle: resource_id,
+                ctx_id,
+                flags,
+                size,
+                memory_id,
+                iovecs: iovecs.as_mut_ptr() as *mut iovec,
+                num_iovs: iovecs.len() as u32,
             };
 
+            let ret = unsafe { virgl_renderer_resource_create_v2(&mut resource_create_args) };
             ret_to_res(ret)?;
 
             Ok(Resource {
                 id: resource_id,
-                backing_iovecs: vecs,
+                backing_iovecs: iovecs,
                 backing_mem: None,
                 no_sync_send: PhantomData,
             })