summary refs log tree commit diff
path: root/gpu_renderer/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'gpu_renderer/src/lib.rs')
-rw-r--r--gpu_renderer/src/lib.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/gpu_renderer/src/lib.rs b/gpu_renderer/src/lib.rs
index be8c17a..1c8461c 100644
--- a/gpu_renderer/src/lib.rs
+++ b/gpu_renderer/src/lib.rs
@@ -6,8 +6,10 @@
 
 mod command_buffer;
 mod generated;
+mod vsnprintf;
 
 use std::cell::RefCell;
+use std::ffi::CString;
 use std::fmt::{self, Display};
 use std::fs::File;
 use std::marker::PhantomData;
@@ -22,7 +24,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,6 +33,7 @@ use crate::generated::p_format::PIPE_FORMAT_B8G8R8X8_UNORM;
 use crate::generated::virglrenderer::*;
 
 pub use crate::command_buffer::CommandBufferBuilder;
+pub use crate::vsnprintf::vsnprintf;
 
 /// Arguments used in `Renderer::create_resource`..
 pub type ResourceCreateArgs = virgl_renderer_resource_create_args;
@@ -245,6 +248,8 @@ impl Renderer {
             fence_state: Rc::clone(&fence_state),
         }));
 
+        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 {
@@ -468,6 +473,27 @@ impl Renderer {
         #[cfg(not(feature = "virtio-gpu-next"))]
         Err(Error::Unsupported)
     }
+
+    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.