// 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. //! renderer_utils: Utility functions and structs used by virgl_renderer and gfxstream. use std::cell::RefCell; use std::os::raw::c_void; use std::rc::Rc; use crate::generated::virgl_renderer_bindings::__va_list_tag; use crate::rutabaga_utils::{RutabagaError, RutabagaResult}; #[repr(C)] #[derive(Debug, Copy, Clone)] pub struct VirglBox { pub x: u32, pub y: u32, pub z: u32, pub w: u32, pub h: u32, pub d: u32, } /* * automatically generated by rust-bindgen * $ bindgen /usr/include/stdio.h \ * --no-layout-tests \ * --whitelist-function vsnprintf \ * -o vsnprintf.rs */ #[allow(non_snake_case, non_camel_case_types)] #[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; } pub fn ret_to_res(ret: i32) -> RutabagaResult<()> { match ret { 0 => Ok(()), _ => Err(RutabagaError::ComponentError(ret)), } } pub struct FenceState { pub latest_fence: u32, } impl FenceState { pub fn write(&mut self, latest_fence: u32) { if latest_fence > self.latest_fence { self.latest_fence = latest_fence; } } } pub struct VirglCookie { pub fence_state: Rc>, } pub extern "C" fn write_fence(cookie: *mut c_void, fence: u32) { assert!(!cookie.is_null()); let cookie = unsafe { &*(cookie as *mut VirglCookie) }; // Track the most recent fence. let mut fence_state = cookie.fence_state.borrow_mut(); fence_state.write(fence); }