blob: 94a271a7259de4ac41c5ab274da17e5a52beea7a [file] [log] [blame]
// 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<RefCell<FenceState>>,
}
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);
}