1 // Copyright 2020 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 //! renderer_utils: Utility functions and structs used by virgl_renderer and gfxstream.
6
7 #[cfg(feature = "virgl_renderer_next")]
8 use std::os::raw::c_int;
9 use std::os::raw::c_void;
10 use std::panic::catch_unwind;
11 use std::process::abort;
12
13 #[cfg(feature = "virgl_renderer_next")]
14 use crate::rutabaga_os::IntoRawDescriptor;
15 use crate::rutabaga_os::SafeDescriptor;
16 use crate::rutabaga_utils::RutabagaError;
17 use crate::rutabaga_utils::RutabagaFence;
18 use crate::rutabaga_utils::RutabagaFenceHandler;
19 use crate::rutabaga_utils::RutabagaResult;
20 use crate::rutabaga_utils::RUTABAGA_FLAG_FENCE;
21 #[cfg(feature = "gfxstream")]
22 use crate::rutabaga_utils::RUTABAGA_FLAG_INFO_RING_IDX;
23
24 #[repr(C)]
25 #[derive(Debug, Copy, Clone)]
26 pub struct VirglBox {
27 pub x: u32,
28 pub y: u32,
29 pub z: u32,
30 pub w: u32,
31 pub h: u32,
32 pub d: u32,
33 }
34
ret_to_res(ret: i32) -> RutabagaResult<()>35 pub fn ret_to_res(ret: i32) -> RutabagaResult<()> {
36 match ret {
37 0 => Ok(()),
38 _ => Err(RutabagaError::ComponentError(ret)),
39 }
40 }
41
42 pub struct VirglCookie {
43 pub render_server_fd: Option<SafeDescriptor>,
44 pub fence_handler: Option<RutabagaFenceHandler>,
45 }
46
write_fence(cookie: *mut c_void, fence: u32)47 pub unsafe extern "C" fn write_fence(cookie: *mut c_void, fence: u32) {
48 catch_unwind(|| {
49 assert!(!cookie.is_null());
50 let cookie = &*(cookie as *mut VirglCookie);
51
52 // Call fence completion callback
53 if let Some(handler) = &cookie.fence_handler {
54 handler.call(RutabagaFence {
55 flags: RUTABAGA_FLAG_FENCE,
56 fence_id: fence as u64,
57 ctx_id: 0,
58 ring_idx: 0,
59 });
60 }
61 })
62 .unwrap_or_else(|_| abort())
63 }
64
65 #[cfg(feature = "gfxstream")]
write_context_fence( cookie: *mut c_void, fence_id: u64, ctx_id: u32, ring_idx: u8, )66 pub extern "C" fn write_context_fence(
67 cookie: *mut c_void,
68 fence_id: u64,
69 ctx_id: u32,
70 ring_idx: u8,
71 ) {
72 catch_unwind(|| {
73 assert!(!cookie.is_null());
74 let cookie = unsafe { &*(cookie as *mut VirglCookie) };
75 if let Some(handler) = &cookie.fence_handler {
76 handler.call(RutabagaFence {
77 flags: RUTABAGA_FLAG_FENCE | RUTABAGA_FLAG_INFO_RING_IDX,
78 fence_id,
79 ctx_id,
80 ring_idx,
81 });
82 }
83 })
84 .unwrap_or_else(|_| abort())
85 }
86
87 #[cfg(feature = "virgl_renderer_next")]
get_server_fd(cookie: *mut c_void, version: u32) -> c_int88 pub unsafe extern "C" fn get_server_fd(cookie: *mut c_void, version: u32) -> c_int {
89 catch_unwind(|| {
90 assert!(!cookie.is_null());
91 let cookie = &mut *(cookie as *mut VirglCookie);
92
93 if version != 0 {
94 return -1;
95 }
96
97 // Transfer the fd ownership to virglrenderer.
98 cookie
99 .render_server_fd
100 .take()
101 .map(SafeDescriptor::into_raw_descriptor)
102 .unwrap_or(-1)
103 })
104 .unwrap_or_else(|_| abort())
105 }
106