summary refs log tree commit diff
path: root/gpu_renderer/src
diff options
context:
space:
mode:
Diffstat (limited to 'gpu_renderer/src')
-rw-r--r--gpu_renderer/src/generated/virglrenderer.rs27
-rw-r--r--gpu_renderer/src/lib.rs93
-rw-r--r--gpu_renderer/src/vsnprintf.rs33
3 files changed, 98 insertions, 55 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 be8c17a..5e5ab95 100644
--- a/gpu_renderer/src/lib.rs
+++ b/gpu_renderer/src/lib.rs
@@ -6,8 +6,11 @@
 
 mod command_buffer;
 mod generated;
+mod vsnprintf;
 
 use std::cell::RefCell;
+#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+use std::ffi::CString;
 use std::fmt::{self, Display};
 use std::fs::File;
 use std::marker::PhantomData;
@@ -22,7 +25,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
 use libc::close;
 
 use data_model::{VolatileMemory, VolatileSlice};
-use sys_util::{GuestAddress, GuestMemory};
+use sys_util::{debug, GuestAddress, GuestMemory};
 
 use crate::generated::p_defines::{
     PIPE_BIND_RENDER_TARGET, PIPE_BIND_SAMPLER_VIEW, PIPE_TEXTURE_1D, PIPE_TEXTURE_2D,
@@ -31,8 +34,10 @@ use crate::generated::p_format::PIPE_FORMAT_B8G8R8X8_UNORM;
 use crate::generated::virglrenderer::*;
 
 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;
@@ -245,6 +250,11 @@ impl Renderer {
             fence_state: Rc::clone(&fence_state),
         }));
 
+        #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+        unsafe {
+            virgl_set_debug_callback(Some(Renderer::debug_callback))
+        };
+
         // Safe because a valid cookie and set of callbacks is used and the result is checked for
         // error.
         let ret = unsafe {
@@ -396,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,
             })
@@ -468,6 +459,28 @@ impl Renderer {
         #[cfg(not(feature = "virtio-gpu-next"))]
         Err(Error::Unsupported)
     }
+
+    #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+    extern "C" fn debug_callback(
+        fmt: *const ::std::os::raw::c_char,
+        ap: *mut generated::virglrenderer::__va_list_tag,
+    ) {
+        let len: u32 = 256;
+        let mut c_str = CString::new(vec![' ' as u8; len as usize]).unwrap();
+        unsafe {
+            let mut varargs = vsnprintf::__va_list_tag {
+                gp_offset: (*ap).gp_offset,
+                fp_offset: (*ap).fp_offset,
+                overflow_arg_area: (*ap).overflow_arg_area,
+                reg_save_area: (*ap).reg_save_area,
+            };
+
+            let raw = c_str.into_raw();
+            vsnprintf(raw, len.into(), fmt, &mut varargs);
+            c_str = CString::from_raw(raw);
+        }
+        debug!("{}", c_str.to_string_lossy());
+    }
 }
 
 /// A context in which resources can be attached/detached and commands can be submitted.
diff --git a/gpu_renderer/src/vsnprintf.rs b/gpu_renderer/src/vsnprintf.rs
new file mode 100644
index 0000000..ec121ad
--- /dev/null
+++ b/gpu_renderer/src/vsnprintf.rs
@@ -0,0 +1,33 @@
+// Copyright 2020 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#![allow(dead_code, non_snake_case, non_camel_case_types)]
+
+/*
+ * automatically generated by rust-bindgen
+ * $ bindgen /usr/include/stdio.h \
+ *       --no-layout-tests \
+ *       --whitelist-function vsnprintf \
+ *       -o vsnprintf.rs
+ */
+
+#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+extern "C" {
+    pub fn vsnprintf(
+        __s: *mut ::std::os::raw::c_char,
+        __maxlen: ::std::os::raw::c_ulong,
+        __format: *const ::std::os::raw::c_char,
+        __arg: *mut __va_list_tag,
+    ) -> ::std::os::raw::c_int;
+}
+
+#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct __va_list_tag {
+    pub gp_offset: ::std::os::raw::c_uint,
+    pub fp_offset: ::std::os::raw::c_uint,
+    pub overflow_arg_area: *mut ::std::os::raw::c_void,
+    pub reg_save_area: *mut ::std::os::raw::c_void,
+}