• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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