From a0fea29e0bcd6d9b39e1ea8f5abf0655f8ac3c0a Mon Sep 17 00:00:00 2001 From: David Stevens Date: Fri, 6 Mar 2020 14:32:33 +0900 Subject: 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 Reviewed-by: Chirantan Ekbote Commit-Queue: David Stevens --- gpu_renderer/src/lib.rs | 28 +++++++++++++++++++++++++++- gpu_renderer/src/vsnprintf.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 gpu_renderer/src/vsnprintf.rs (limited to 'gpu_renderer') 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, +} -- cgit 1.4.1