summary refs log tree commit diff
path: root/gpu_renderer
diff options
context:
space:
mode:
authorDavid Stevens <stevensd@chromium.org>2020-03-06 14:32:33 +0900
committerCommit Bot <commit-bot@chromium.org>2020-03-10 07:28:03 +0000
commita0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a (patch)
tree788d4020f9e2d97792827b6297bc212362975d4b /gpu_renderer
parent265967bcda2922e688557a69e04c1eec0ba8e990 (diff)
downloadcrosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar.gz
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar.bz2
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar.lz
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar.xz
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.tar.zst
crosvm-a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a.zip
gpu_renderer: add virglrenderer logging callback
BUG=None
TEST=boot ARCVM

Change-Id: Iea6c5ecc2475ec6f78df100b5df62622c41bd88a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2090956
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Commit-Queue: David Stevens <stevensd@chromium.org>
Diffstat (limited to 'gpu_renderer')
-rw-r--r--gpu_renderer/src/lib.rs28
-rw-r--r--gpu_renderer/src/vsnprintf.rs30
2 files changed, 57 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.
diff --git a/gpu_renderer/src/vsnprintf.rs b/gpu_renderer/src/vsnprintf.rs
new file mode 100644
index 0000000..72583c5
--- /dev/null
+++ b/gpu_renderer/src/vsnprintf.rs
@@ -0,0 +1,30 @@
+// 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
+ */
+
+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;
+}
+#[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,
+}