xref: /aosp_15_r20/external/crosvm/rutabaga_gfx/src/rutabaga_utils.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! rutabaga_utils: Utility enums, structs, and implementations needed by the rest of the crate.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use std::ffi::NulError;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::fmt;
9*bb4ee6a4SAndroid Build Coastguard Worker use std::io::Error as IoError;
10*bb4ee6a4SAndroid Build Coastguard Worker use std::num::TryFromIntError;
11*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_char;
12*bb4ee6a4SAndroid Build Coastguard Worker use std::os::raw::c_void;
13*bb4ee6a4SAndroid Build Coastguard Worker use std::path::PathBuf;
14*bb4ee6a4SAndroid Build Coastguard Worker use std::str::Utf8Error;
15*bb4ee6a4SAndroid Build Coastguard Worker use std::sync::Arc;
16*bb4ee6a4SAndroid Build Coastguard Worker 
17*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
18*bb4ee6a4SAndroid Build Coastguard Worker use nix::Error as NixError;
19*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted;
20*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error;
21*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
22*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::device::DeviceCreationError;
23*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
24*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::image::ImageError;
25*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
26*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::instance::InstanceCreationError;
27*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
28*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::memory::DeviceMemoryError;
29*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
30*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::memory::MemoryMapError;
31*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
32*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::LoadingError;
33*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "vulkano")]
34*bb4ee6a4SAndroid Build Coastguard Worker use vulkano::VulkanError;
35*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::AsBytes;
36*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromBytes;
37*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromZeroes;
38*bb4ee6a4SAndroid Build Coastguard Worker 
39*bb4ee6a4SAndroid Build Coastguard Worker use crate::rutabaga_os::OwnedDescriptor;
40*bb4ee6a4SAndroid Build Coastguard Worker 
41*bb4ee6a4SAndroid Build Coastguard Worker /// Represents a buffer.  `base` contains the address of a buffer, while `len` contains the length
42*bb4ee6a4SAndroid Build Coastguard Worker /// of the buffer.
43*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
44*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
45*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaIovec {
46*bb4ee6a4SAndroid Build Coastguard Worker     pub base: *mut c_void,
47*bb4ee6a4SAndroid Build Coastguard Worker     pub len: usize,
48*bb4ee6a4SAndroid Build Coastguard Worker }
49*bb4ee6a4SAndroid Build Coastguard Worker 
50*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: trivially safe
51*bb4ee6a4SAndroid Build Coastguard Worker unsafe impl Send for RutabagaIovec {}
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY: trivially safe
54*bb4ee6a4SAndroid Build Coastguard Worker unsafe impl Sync for RutabagaIovec {}
55*bb4ee6a4SAndroid Build Coastguard Worker 
56*bb4ee6a4SAndroid Build Coastguard Worker /// 3D resource creation parameters.  Also used to create 2D resource.  Constants based on Mesa's
57*bb4ee6a4SAndroid Build Coastguard Worker /// (internal) Gallium interface.  Not in the virtio-gpu spec, but should be since dumb resources
58*bb4ee6a4SAndroid Build Coastguard Worker /// can't work with gfxstream/virglrenderer without this.
59*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_PIPE_TEXTURE_2D: u32 = 2;
60*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_PIPE_BIND_RENDER_TARGET: u32 = 2;
61*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
62*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug)]
63*bb4ee6a4SAndroid Build Coastguard Worker pub struct ResourceCreate3D {
64*bb4ee6a4SAndroid Build Coastguard Worker     pub target: u32,
65*bb4ee6a4SAndroid Build Coastguard Worker     pub format: u32,
66*bb4ee6a4SAndroid Build Coastguard Worker     pub bind: u32,
67*bb4ee6a4SAndroid Build Coastguard Worker     pub width: u32,
68*bb4ee6a4SAndroid Build Coastguard Worker     pub height: u32,
69*bb4ee6a4SAndroid Build Coastguard Worker     pub depth: u32,
70*bb4ee6a4SAndroid Build Coastguard Worker     pub array_size: u32,
71*bb4ee6a4SAndroid Build Coastguard Worker     pub last_level: u32,
72*bb4ee6a4SAndroid Build Coastguard Worker     pub nr_samples: u32,
73*bb4ee6a4SAndroid Build Coastguard Worker     pub flags: u32,
74*bb4ee6a4SAndroid Build Coastguard Worker }
75*bb4ee6a4SAndroid Build Coastguard Worker 
76*bb4ee6a4SAndroid Build Coastguard Worker /// Blob resource creation parameters.
77*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_MEM_GUEST: u32 = 0x0001;
78*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_MEM_HOST3D: u32 = 0x0002;
79*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_MEM_HOST3D_GUEST: u32 = 0x0003;
80*bb4ee6a4SAndroid Build Coastguard Worker 
81*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_FLAG_USE_MAPPABLE: u32 = 0x0001;
82*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_FLAG_USE_SHAREABLE: u32 = 0x0002;
83*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_BLOB_FLAG_USE_CROSS_DEVICE: u32 = 0x0004;
84*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
85*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug)]
86*bb4ee6a4SAndroid Build Coastguard Worker pub struct ResourceCreateBlob {
87*bb4ee6a4SAndroid Build Coastguard Worker     pub blob_mem: u32,
88*bb4ee6a4SAndroid Build Coastguard Worker     pub blob_flags: u32,
89*bb4ee6a4SAndroid Build Coastguard Worker     pub blob_id: u64,
90*bb4ee6a4SAndroid Build Coastguard Worker     pub size: u64,
91*bb4ee6a4SAndroid Build Coastguard Worker }
92*bb4ee6a4SAndroid Build Coastguard Worker 
93*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
94*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug)]
95*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaMapping {
96*bb4ee6a4SAndroid Build Coastguard Worker     pub ptr: u64,
97*bb4ee6a4SAndroid Build Coastguard Worker     pub size: u64,
98*bb4ee6a4SAndroid Build Coastguard Worker }
99*bb4ee6a4SAndroid Build Coastguard Worker 
100*bb4ee6a4SAndroid Build Coastguard Worker /// Metadata associated with a swapchain, video or camera image.
101*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Default, Copy, Clone, Debug)]
102*bb4ee6a4SAndroid Build Coastguard Worker pub struct Resource3DInfo {
103*bb4ee6a4SAndroid Build Coastguard Worker     pub width: u32,
104*bb4ee6a4SAndroid Build Coastguard Worker     pub height: u32,
105*bb4ee6a4SAndroid Build Coastguard Worker     pub drm_fourcc: u32,
106*bb4ee6a4SAndroid Build Coastguard Worker     pub strides: [u32; 4],
107*bb4ee6a4SAndroid Build Coastguard Worker     pub offsets: [u32; 4],
108*bb4ee6a4SAndroid Build Coastguard Worker     pub modifier: u64,
109*bb4ee6a4SAndroid Build Coastguard Worker     /// Whether the buffer can be accessed by the guest CPU.
110*bb4ee6a4SAndroid Build Coastguard Worker     pub guest_cpu_mappable: bool,
111*bb4ee6a4SAndroid Build Coastguard Worker }
112*bb4ee6a4SAndroid Build Coastguard Worker 
113*bb4ee6a4SAndroid Build Coastguard Worker /// A unique identifier for a device.
114*bb4ee6a4SAndroid Build Coastguard Worker #[derive(
115*bb4ee6a4SAndroid Build Coastguard Worker     Copy,
116*bb4ee6a4SAndroid Build Coastguard Worker     Clone,
117*bb4ee6a4SAndroid Build Coastguard Worker     Debug,
118*bb4ee6a4SAndroid Build Coastguard Worker     Default,
119*bb4ee6a4SAndroid Build Coastguard Worker     PartialEq,
120*bb4ee6a4SAndroid Build Coastguard Worker     Eq,
121*bb4ee6a4SAndroid Build Coastguard Worker     PartialOrd,
122*bb4ee6a4SAndroid Build Coastguard Worker     Ord,
123*bb4ee6a4SAndroid Build Coastguard Worker     Hash,
124*bb4ee6a4SAndroid Build Coastguard Worker     FromZeroes,
125*bb4ee6a4SAndroid Build Coastguard Worker     FromBytes,
126*bb4ee6a4SAndroid Build Coastguard Worker     AsBytes,
127*bb4ee6a4SAndroid Build Coastguard Worker )]
128*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
129*bb4ee6a4SAndroid Build Coastguard Worker pub struct DeviceId {
130*bb4ee6a4SAndroid Build Coastguard Worker     pub device_uuid: [u8; 16],
131*bb4ee6a4SAndroid Build Coastguard Worker     pub driver_uuid: [u8; 16],
132*bb4ee6a4SAndroid Build Coastguard Worker }
133*bb4ee6a4SAndroid Build Coastguard Worker 
134*bb4ee6a4SAndroid Build Coastguard Worker /// Memory index and physical device id of the associated VkDeviceMemory.
135*bb4ee6a4SAndroid Build Coastguard Worker #[derive(
136*bb4ee6a4SAndroid Build Coastguard Worker     Copy,
137*bb4ee6a4SAndroid Build Coastguard Worker     Clone,
138*bb4ee6a4SAndroid Build Coastguard Worker     Debug,
139*bb4ee6a4SAndroid Build Coastguard Worker     Default,
140*bb4ee6a4SAndroid Build Coastguard Worker     PartialEq,
141*bb4ee6a4SAndroid Build Coastguard Worker     Eq,
142*bb4ee6a4SAndroid Build Coastguard Worker     PartialOrd,
143*bb4ee6a4SAndroid Build Coastguard Worker     Ord,
144*bb4ee6a4SAndroid Build Coastguard Worker     Hash,
145*bb4ee6a4SAndroid Build Coastguard Worker     FromZeroes,
146*bb4ee6a4SAndroid Build Coastguard Worker     FromBytes,
147*bb4ee6a4SAndroid Build Coastguard Worker     AsBytes,
148*bb4ee6a4SAndroid Build Coastguard Worker )]
149*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
150*bb4ee6a4SAndroid Build Coastguard Worker pub struct VulkanInfo {
151*bb4ee6a4SAndroid Build Coastguard Worker     pub memory_idx: u32,
152*bb4ee6a4SAndroid Build Coastguard Worker     pub device_id: DeviceId,
153*bb4ee6a4SAndroid Build Coastguard Worker }
154*bb4ee6a4SAndroid Build Coastguard Worker 
155*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga context init capset id mask.
156*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CONTEXT_INIT_CAPSET_ID_MASK: u32 = 0x00ff;
157*bb4ee6a4SAndroid Build Coastguard Worker 
158*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga flags for creating fences.
159*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FLAG_FENCE: u32 = 1 << 0;
160*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FLAG_INFO_RING_IDX: u32 = 1 << 1;
161*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FLAG_FENCE_HOST_SHAREABLE: u32 = 1 << 2;
162*bb4ee6a4SAndroid Build Coastguard Worker 
163*bb4ee6a4SAndroid Build Coastguard Worker /// Convenience struct for Rutabaga fences
164*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
165*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
166*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaFence {
167*bb4ee6a4SAndroid Build Coastguard Worker     pub flags: u32,
168*bb4ee6a4SAndroid Build Coastguard Worker     pub fence_id: u64,
169*bb4ee6a4SAndroid Build Coastguard Worker     pub ctx_id: u32,
170*bb4ee6a4SAndroid Build Coastguard Worker     pub ring_idx: u8,
171*bb4ee6a4SAndroid Build Coastguard Worker }
172*bb4ee6a4SAndroid Build Coastguard Worker 
173*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga debug types
174*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_DEBUG_ERROR: u32 = 0x01;
175*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_DEBUG_WARNING: u32 = 0x02;
176*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_DEBUG_INFO: u32 = 0x03;
177*bb4ee6a4SAndroid Build Coastguard Worker 
178*bb4ee6a4SAndroid Build Coastguard Worker /// Convenience struct for debug data
179*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
180*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
181*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaDebug {
182*bb4ee6a4SAndroid Build Coastguard Worker     pub debug_type: u32,
183*bb4ee6a4SAndroid Build Coastguard Worker     pub message: *const c_char,
184*bb4ee6a4SAndroid Build Coastguard Worker }
185*bb4ee6a4SAndroid Build Coastguard Worker 
186*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY:
187*bb4ee6a4SAndroid Build Coastguard Worker // This is sketchy, since `message` is a C-string and there's no locking + atomics.  However,
188*bb4ee6a4SAndroid Build Coastguard Worker // the current use case is to mirror the C-API.  If the `RutabagaDebugHandler` is used with
189*bb4ee6a4SAndroid Build Coastguard Worker // by Rust code, a different struct should be used.
190*bb4ee6a4SAndroid Build Coastguard Worker unsafe impl Send for RutabagaDebug {}
191*bb4ee6a4SAndroid Build Coastguard Worker // SAFETY:
192*bb4ee6a4SAndroid Build Coastguard Worker // This is sketchy, since `message` is a C-string and there's no locking + atomics.  However,
193*bb4ee6a4SAndroid Build Coastguard Worker // the current use case is to mirror the C-API.  If the `RutabagaDebugHandler` is used with
194*bb4ee6a4SAndroid Build Coastguard Worker // by Rust code, a different struct should be used.
195*bb4ee6a4SAndroid Build Coastguard Worker unsafe impl Sync for RutabagaDebug {}
196*bb4ee6a4SAndroid Build Coastguard Worker 
197*bb4ee6a4SAndroid Build Coastguard Worker /// Mapped memory caching flags (see virtio_gpu spec)
198*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_CACHE_MASK: u32 = 0x0f;
199*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_CACHE_CACHED: u32 = 0x01;
200*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_CACHE_UNCACHED: u32 = 0x02;
201*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_CACHE_WC: u32 = 0x03;
202*bb4ee6a4SAndroid Build Coastguard Worker /// Access flags (not in virtio_gpu spec)
203*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_ACCESS_MASK: u32 = 0xf0;
204*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_ACCESS_READ: u32 = 0x10;
205*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_ACCESS_WRITE: u32 = 0x20;
206*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MAP_ACCESS_RW: u32 = 0x30;
207*bb4ee6a4SAndroid Build Coastguard Worker 
208*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga capsets.
209*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_VIRGL: u32 = 1;
210*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_VIRGL2: u32 = 2;
211*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_GFXSTREAM_VULKAN: u32 = 3;
212*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_VENUS: u32 = 4;
213*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_CROSS_DOMAIN: u32 = 5;
214*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_DRM: u32 = 6;
215*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_GFXSTREAM_MAGMA: u32 = 7;
216*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_GFXSTREAM_GLES: u32 = 8;
217*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CAPSET_GFXSTREAM_COMPOSER: u32 = 9;
218*bb4ee6a4SAndroid Build Coastguard Worker 
219*bb4ee6a4SAndroid Build Coastguard Worker /// An error generated while using this crate.
220*bb4ee6a4SAndroid Build Coastguard Worker #[sorted]
221*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug)]
222*bb4ee6a4SAndroid Build Coastguard Worker pub enum RutabagaError {
223*bb4ee6a4SAndroid Build Coastguard Worker     /// Indicates `Rutabaga` was already initialized since only one Rutabaga instance per process
224*bb4ee6a4SAndroid Build Coastguard Worker     /// is allowed.
225*bb4ee6a4SAndroid Build Coastguard Worker     #[error("attempted to use a rutabaga asset already in use")]
226*bb4ee6a4SAndroid Build Coastguard Worker     AlreadyInUse,
227*bb4ee6a4SAndroid Build Coastguard Worker     /// Checked Arithmetic error
228*bb4ee6a4SAndroid Build Coastguard Worker     #[error("arithmetic failed: {}({}) {op} {}({})", .field1.0, .field1.1, .field2.0, .field2.1)]
229*bb4ee6a4SAndroid Build Coastguard Worker     CheckedArithmetic {
230*bb4ee6a4SAndroid Build Coastguard Worker         field1: (&'static str, usize),
231*bb4ee6a4SAndroid Build Coastguard Worker         field2: (&'static str, usize),
232*bb4ee6a4SAndroid Build Coastguard Worker         op: &'static str,
233*bb4ee6a4SAndroid Build Coastguard Worker     },
234*bb4ee6a4SAndroid Build Coastguard Worker     /// Checked Range error
235*bb4ee6a4SAndroid Build Coastguard Worker     #[error("range check failed: {}({}) vs {}({})", .field1.0, .field1.1, .field2.0, .field2.1)]
236*bb4ee6a4SAndroid Build Coastguard Worker     CheckedRange {
237*bb4ee6a4SAndroid Build Coastguard Worker         field1: (&'static str, usize),
238*bb4ee6a4SAndroid Build Coastguard Worker         field2: (&'static str, usize),
239*bb4ee6a4SAndroid Build Coastguard Worker     },
240*bb4ee6a4SAndroid Build Coastguard Worker     /// An internal Rutabaga component error was returned.
241*bb4ee6a4SAndroid Build Coastguard Worker     #[error("rutabaga component failed with error {0}")]
242*bb4ee6a4SAndroid Build Coastguard Worker     ComponentError(i32),
243*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid 2D info
244*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid 2D info")]
245*bb4ee6a4SAndroid Build Coastguard Worker     Invalid2DInfo,
246*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid Capset
247*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid capset")]
248*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCapset,
249*bb4ee6a4SAndroid Build Coastguard Worker     /// A command buffer with insufficient space was submitted.
250*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid command buffer submitted")]
251*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCommandBuffer,
252*bb4ee6a4SAndroid Build Coastguard Worker     /// A command size was submitted that was invalid.
253*bb4ee6a4SAndroid Build Coastguard Worker     #[error("command buffer submitted with invalid size: {0}")]
254*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCommandSize(usize),
255*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid RutabagaComponent
256*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid rutabaga component")]
257*bb4ee6a4SAndroid Build Coastguard Worker     InvalidComponent,
258*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid Context ID
259*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid context id")]
260*bb4ee6a4SAndroid Build Coastguard Worker     InvalidContextId,
261*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid cross domain channel
262*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid cross domain channel")]
263*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCrossDomainChannel,
264*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid cross domain item ID
265*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid cross domain item id")]
266*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCrossDomainItemId,
267*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid cross domain item type
268*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid cross domain item type")]
269*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCrossDomainItemType,
270*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid cross domain state
271*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid cross domain state")]
272*bb4ee6a4SAndroid Build Coastguard Worker     InvalidCrossDomainState,
273*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid gralloc backend.
274*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid gralloc backend")]
275*bb4ee6a4SAndroid Build Coastguard Worker     InvalidGrallocBackend,
276*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid gralloc dimensions.
277*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid gralloc dimensions")]
278*bb4ee6a4SAndroid Build Coastguard Worker     InvalidGrallocDimensions,
279*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid gralloc DRM format.
280*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid gralloc DRM format")]
281*bb4ee6a4SAndroid Build Coastguard Worker     InvalidGrallocDrmFormat,
282*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid GPU type.
283*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid GPU type for gralloc")]
284*bb4ee6a4SAndroid Build Coastguard Worker     InvalidGrallocGpuType,
285*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid number of YUV planes.
286*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid number of YUV planes")]
287*bb4ee6a4SAndroid Build Coastguard Worker     InvalidGrallocNumberOfPlanes,
288*bb4ee6a4SAndroid Build Coastguard Worker     /// The indicated region of guest memory is invalid.
289*bb4ee6a4SAndroid Build Coastguard Worker     #[error("an iovec is outside of guest memory's range")]
290*bb4ee6a4SAndroid Build Coastguard Worker     InvalidIovec,
291*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid Resource ID.
292*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid resource id")]
293*bb4ee6a4SAndroid Build Coastguard Worker     InvalidResourceId,
294*bb4ee6a4SAndroid Build Coastguard Worker     /// Indicates an error in the RutabagaBuilder.
295*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid rutabaga build parameters: {0}")]
296*bb4ee6a4SAndroid Build Coastguard Worker     InvalidRutabagaBuild(&'static str),
297*bb4ee6a4SAndroid Build Coastguard Worker     /// An error with the RutabagaHandle
298*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid rutabaga handle")]
299*bb4ee6a4SAndroid Build Coastguard Worker     InvalidRutabagaHandle,
300*bb4ee6a4SAndroid Build Coastguard Worker     /// Invalid Vulkan info
301*bb4ee6a4SAndroid Build Coastguard Worker     #[error("invalid vulkan info")]
302*bb4ee6a4SAndroid Build Coastguard Worker     InvalidVulkanInfo,
303*bb4ee6a4SAndroid Build Coastguard Worker     /// An input/output error occured.
304*bb4ee6a4SAndroid Build Coastguard Worker     #[error("an input/output error occur: {0}")]
305*bb4ee6a4SAndroid Build Coastguard Worker     IoError(IoError),
306*bb4ee6a4SAndroid Build Coastguard Worker     /// The mapping failed.
307*bb4ee6a4SAndroid Build Coastguard Worker     #[error("The mapping failed with library error: {0}")]
308*bb4ee6a4SAndroid Build Coastguard Worker     MappingFailed(i32),
309*bb4ee6a4SAndroid Build Coastguard Worker     /// Nix crate error.
310*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(any(target_os = "android", target_os = "linux"))]
311*bb4ee6a4SAndroid Build Coastguard Worker     #[error("The errno is {0}")]
312*bb4ee6a4SAndroid Build Coastguard Worker     NixError(NixError),
313*bb4ee6a4SAndroid Build Coastguard Worker     #[error("Nul Error occured {0}")]
314*bb4ee6a4SAndroid Build Coastguard Worker     NulError(NulError),
315*bb4ee6a4SAndroid Build Coastguard Worker     /// Violation of the Rutabaga spec occured.
316*bb4ee6a4SAndroid Build Coastguard Worker     #[error("violation of the rutabaga spec: {0}")]
317*bb4ee6a4SAndroid Build Coastguard Worker     SpecViolation(&'static str),
318*bb4ee6a4SAndroid Build Coastguard Worker     /// An attempted integer conversion failed.
319*bb4ee6a4SAndroid Build Coastguard Worker     #[error("int conversion failed: {0}")]
320*bb4ee6a4SAndroid Build Coastguard Worker     TryFromIntError(TryFromIntError),
321*bb4ee6a4SAndroid Build Coastguard Worker     /// The command is unsupported.
322*bb4ee6a4SAndroid Build Coastguard Worker     #[error("the requested function is not implemented")]
323*bb4ee6a4SAndroid Build Coastguard Worker     Unsupported,
324*bb4ee6a4SAndroid Build Coastguard Worker     /// Utf8 error.
325*bb4ee6a4SAndroid Build Coastguard Worker     #[error("an utf8 error occured: {0}")]
326*bb4ee6a4SAndroid Build Coastguard Worker     Utf8Error(Utf8Error),
327*bb4ee6a4SAndroid Build Coastguard Worker     /// Device creation error
328*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
329*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano device creation failure {0}")]
330*bb4ee6a4SAndroid Build Coastguard Worker     VkDeviceCreationError(DeviceCreationError),
331*bb4ee6a4SAndroid Build Coastguard Worker     /// Device memory error
332*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
333*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano device memory failure {0}")]
334*bb4ee6a4SAndroid Build Coastguard Worker     VkDeviceMemoryError(DeviceMemoryError),
335*bb4ee6a4SAndroid Build Coastguard Worker     /// General Vulkan error
336*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
337*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano failure {0}")]
338*bb4ee6a4SAndroid Build Coastguard Worker     VkError(VulkanError),
339*bb4ee6a4SAndroid Build Coastguard Worker     /// Image creation error
340*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
341*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano image creation failure {0}")]
342*bb4ee6a4SAndroid Build Coastguard Worker     VkImageCreationError(ImageError),
343*bb4ee6a4SAndroid Build Coastguard Worker     /// Instance creation error
344*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
345*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano instance creation failure {0}")]
346*bb4ee6a4SAndroid Build Coastguard Worker     VkInstanceCreationError(InstanceCreationError),
347*bb4ee6a4SAndroid Build Coastguard Worker     /// Loading error
348*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
349*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano loading failure {0}")]
350*bb4ee6a4SAndroid Build Coastguard Worker     VkLoadingError(LoadingError),
351*bb4ee6a4SAndroid Build Coastguard Worker     /// Memory map error
352*bb4ee6a4SAndroid Build Coastguard Worker     #[cfg(feature = "vulkano")]
353*bb4ee6a4SAndroid Build Coastguard Worker     #[error("vulkano memory map failure {0}")]
354*bb4ee6a4SAndroid Build Coastguard Worker     VkMemoryMapError(MemoryMapError),
355*bb4ee6a4SAndroid Build Coastguard Worker }
356*bb4ee6a4SAndroid Build Coastguard Worker 
357*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
358*bb4ee6a4SAndroid Build Coastguard Worker impl From<NixError> for RutabagaError {
from(e: NixError) -> RutabagaError359*bb4ee6a4SAndroid Build Coastguard Worker     fn from(e: NixError) -> RutabagaError {
360*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaError::NixError(e)
361*bb4ee6a4SAndroid Build Coastguard Worker     }
362*bb4ee6a4SAndroid Build Coastguard Worker }
363*bb4ee6a4SAndroid Build Coastguard Worker 
364*bb4ee6a4SAndroid Build Coastguard Worker impl From<NulError> for RutabagaError {
from(e: NulError) -> RutabagaError365*bb4ee6a4SAndroid Build Coastguard Worker     fn from(e: NulError) -> RutabagaError {
366*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaError::NulError(e)
367*bb4ee6a4SAndroid Build Coastguard Worker     }
368*bb4ee6a4SAndroid Build Coastguard Worker }
369*bb4ee6a4SAndroid Build Coastguard Worker 
370*bb4ee6a4SAndroid Build Coastguard Worker impl From<IoError> for RutabagaError {
from(e: IoError) -> RutabagaError371*bb4ee6a4SAndroid Build Coastguard Worker     fn from(e: IoError) -> RutabagaError {
372*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaError::IoError(e)
373*bb4ee6a4SAndroid Build Coastguard Worker     }
374*bb4ee6a4SAndroid Build Coastguard Worker }
375*bb4ee6a4SAndroid Build Coastguard Worker 
376*bb4ee6a4SAndroid Build Coastguard Worker impl From<TryFromIntError> for RutabagaError {
from(e: TryFromIntError) -> RutabagaError377*bb4ee6a4SAndroid Build Coastguard Worker     fn from(e: TryFromIntError) -> RutabagaError {
378*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaError::TryFromIntError(e)
379*bb4ee6a4SAndroid Build Coastguard Worker     }
380*bb4ee6a4SAndroid Build Coastguard Worker }
381*bb4ee6a4SAndroid Build Coastguard Worker 
382*bb4ee6a4SAndroid Build Coastguard Worker impl From<Utf8Error> for RutabagaError {
from(e: Utf8Error) -> RutabagaError383*bb4ee6a4SAndroid Build Coastguard Worker     fn from(e: Utf8Error) -> RutabagaError {
384*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaError::Utf8Error(e)
385*bb4ee6a4SAndroid Build Coastguard Worker     }
386*bb4ee6a4SAndroid Build Coastguard Worker }
387*bb4ee6a4SAndroid Build Coastguard Worker 
388*bb4ee6a4SAndroid Build Coastguard Worker /// The result of an operation in this crate.
389*bb4ee6a4SAndroid Build Coastguard Worker pub type RutabagaResult<T> = std::result::Result<T, RutabagaError>;
390*bb4ee6a4SAndroid Build Coastguard Worker 
391*bb4ee6a4SAndroid Build Coastguard Worker /// Flags for virglrenderer.  Copied from virglrenderer bindings.
392*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_EGL: u32 = 1 << 0;
393*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_THREAD_SYNC: u32 = 1 << 1;
394*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_GLX: u32 = 1 << 2;
395*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_SURFACELESS: u32 = 1 << 3;
396*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_GLES: u32 = 1 << 4;
397*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_EXTERNAL_BLOB: u32 = 1 << 5;
398*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_VENUS: u32 = 1 << 6;
399*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_NO_VIRGL: u32 = 1 << 7;
400*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_USE_ASYNC_FENCE_CB: u32 = 1 << 8;
401*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_RENDER_SERVER: u32 = 1 << 9;
402*bb4ee6a4SAndroid Build Coastguard Worker const VIRGLRENDERER_DRM: u32 = 1 << 10;
403*bb4ee6a4SAndroid Build Coastguard Worker 
404*bb4ee6a4SAndroid Build Coastguard Worker /// virglrenderer flag struct.
405*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone)]
406*bb4ee6a4SAndroid Build Coastguard Worker pub struct VirglRendererFlags(u32);
407*bb4ee6a4SAndroid Build Coastguard Worker 
408*bb4ee6a4SAndroid Build Coastguard Worker impl Default for VirglRendererFlags {
default() -> VirglRendererFlags409*bb4ee6a4SAndroid Build Coastguard Worker     fn default() -> VirglRendererFlags {
410*bb4ee6a4SAndroid Build Coastguard Worker         VirglRendererFlags::new()
411*bb4ee6a4SAndroid Build Coastguard Worker             .use_virgl(true)
412*bb4ee6a4SAndroid Build Coastguard Worker             .use_venus(false)
413*bb4ee6a4SAndroid Build Coastguard Worker             .use_egl(true)
414*bb4ee6a4SAndroid Build Coastguard Worker             .use_surfaceless(true)
415*bb4ee6a4SAndroid Build Coastguard Worker             .use_gles(true)
416*bb4ee6a4SAndroid Build Coastguard Worker             .use_render_server(false)
417*bb4ee6a4SAndroid Build Coastguard Worker     }
418*bb4ee6a4SAndroid Build Coastguard Worker }
419*bb4ee6a4SAndroid Build Coastguard Worker 
420*bb4ee6a4SAndroid Build Coastguard Worker impl From<VirglRendererFlags> for u32 {
from(flags: VirglRendererFlags) -> u32421*bb4ee6a4SAndroid Build Coastguard Worker     fn from(flags: VirglRendererFlags) -> u32 {
422*bb4ee6a4SAndroid Build Coastguard Worker         flags.0
423*bb4ee6a4SAndroid Build Coastguard Worker     }
424*bb4ee6a4SAndroid Build Coastguard Worker }
425*bb4ee6a4SAndroid Build Coastguard Worker 
426*bb4ee6a4SAndroid Build Coastguard Worker impl From<VirglRendererFlags> for i32 {
from(flags: VirglRendererFlags) -> i32427*bb4ee6a4SAndroid Build Coastguard Worker     fn from(flags: VirglRendererFlags) -> i32 {
428*bb4ee6a4SAndroid Build Coastguard Worker         flags.0 as i32
429*bb4ee6a4SAndroid Build Coastguard Worker     }
430*bb4ee6a4SAndroid Build Coastguard Worker }
431*bb4ee6a4SAndroid Build Coastguard Worker 
432*bb4ee6a4SAndroid Build Coastguard Worker impl VirglRendererFlags {
433*bb4ee6a4SAndroid Build Coastguard Worker     /// Create new virglrenderer flags.
new() -> VirglRendererFlags434*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new() -> VirglRendererFlags {
435*bb4ee6a4SAndroid Build Coastguard Worker         VirglRendererFlags(0)
436*bb4ee6a4SAndroid Build Coastguard Worker     }
437*bb4ee6a4SAndroid Build Coastguard Worker 
set_flag(self, bitmask: u32, set: bool) -> VirglRendererFlags438*bb4ee6a4SAndroid Build Coastguard Worker     fn set_flag(self, bitmask: u32, set: bool) -> VirglRendererFlags {
439*bb4ee6a4SAndroid Build Coastguard Worker         if set {
440*bb4ee6a4SAndroid Build Coastguard Worker             VirglRendererFlags(self.0 | bitmask)
441*bb4ee6a4SAndroid Build Coastguard Worker         } else {
442*bb4ee6a4SAndroid Build Coastguard Worker             VirglRendererFlags(self.0 & (!bitmask))
443*bb4ee6a4SAndroid Build Coastguard Worker         }
444*bb4ee6a4SAndroid Build Coastguard Worker     }
445*bb4ee6a4SAndroid Build Coastguard Worker 
446*bb4ee6a4SAndroid Build Coastguard Worker     /// Enable virgl support
use_virgl(self, v: bool) -> VirglRendererFlags447*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_virgl(self, v: bool) -> VirglRendererFlags {
448*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_NO_VIRGL, !v)
449*bb4ee6a4SAndroid Build Coastguard Worker     }
450*bb4ee6a4SAndroid Build Coastguard Worker 
451*bb4ee6a4SAndroid Build Coastguard Worker     /// Enable venus support
use_venus(self, v: bool) -> VirglRendererFlags452*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_venus(self, v: bool) -> VirglRendererFlags {
453*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_VENUS, v)
454*bb4ee6a4SAndroid Build Coastguard Worker     }
455*bb4ee6a4SAndroid Build Coastguard Worker 
456*bb4ee6a4SAndroid Build Coastguard Worker     /// Enable drm native context support
use_drm(self, v: bool) -> VirglRendererFlags457*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_drm(self, v: bool) -> VirglRendererFlags {
458*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_DRM, v)
459*bb4ee6a4SAndroid Build Coastguard Worker     }
460*bb4ee6a4SAndroid Build Coastguard Worker 
461*bb4ee6a4SAndroid Build Coastguard Worker     /// Use EGL for context creation.
use_egl(self, v: bool) -> VirglRendererFlags462*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_egl(self, v: bool) -> VirglRendererFlags {
463*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_EGL, v)
464*bb4ee6a4SAndroid Build Coastguard Worker     }
465*bb4ee6a4SAndroid Build Coastguard Worker 
466*bb4ee6a4SAndroid Build Coastguard Worker     /// Use a dedicated thread for fence synchronization.
use_thread_sync(self, v: bool) -> VirglRendererFlags467*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_thread_sync(self, v: bool) -> VirglRendererFlags {
468*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_THREAD_SYNC, v)
469*bb4ee6a4SAndroid Build Coastguard Worker     }
470*bb4ee6a4SAndroid Build Coastguard Worker 
471*bb4ee6a4SAndroid Build Coastguard Worker     /// Use GLX for context creation.
use_glx(self, v: bool) -> VirglRendererFlags472*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_glx(self, v: bool) -> VirglRendererFlags {
473*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_GLX, v)
474*bb4ee6a4SAndroid Build Coastguard Worker     }
475*bb4ee6a4SAndroid Build Coastguard Worker 
476*bb4ee6a4SAndroid Build Coastguard Worker     /// No surfaces required when creating context.
use_surfaceless(self, v: bool) -> VirglRendererFlags477*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_surfaceless(self, v: bool) -> VirglRendererFlags {
478*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_SURFACELESS, v)
479*bb4ee6a4SAndroid Build Coastguard Worker     }
480*bb4ee6a4SAndroid Build Coastguard Worker 
481*bb4ee6a4SAndroid Build Coastguard Worker     /// Use GLES drivers.
use_gles(self, v: bool) -> VirglRendererFlags482*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_gles(self, v: bool) -> VirglRendererFlags {
483*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_GLES, v)
484*bb4ee6a4SAndroid Build Coastguard Worker     }
485*bb4ee6a4SAndroid Build Coastguard Worker 
486*bb4ee6a4SAndroid Build Coastguard Worker     /// Use external memory when creating blob resources.
use_external_blob(self, v: bool) -> VirglRendererFlags487*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_external_blob(self, v: bool) -> VirglRendererFlags {
488*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_EXTERNAL_BLOB, v)
489*bb4ee6a4SAndroid Build Coastguard Worker     }
490*bb4ee6a4SAndroid Build Coastguard Worker 
491*bb4ee6a4SAndroid Build Coastguard Worker     /// Retire fence directly from sync thread.
use_async_fence_cb(self, v: bool) -> VirglRendererFlags492*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_async_fence_cb(self, v: bool) -> VirglRendererFlags {
493*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_USE_ASYNC_FENCE_CB, v)
494*bb4ee6a4SAndroid Build Coastguard Worker     }
495*bb4ee6a4SAndroid Build Coastguard Worker 
use_render_server(self, v: bool) -> VirglRendererFlags496*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_render_server(self, v: bool) -> VirglRendererFlags {
497*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(VIRGLRENDERER_RENDER_SERVER, v)
498*bb4ee6a4SAndroid Build Coastguard Worker     }
499*bb4ee6a4SAndroid Build Coastguard Worker }
500*bb4ee6a4SAndroid Build Coastguard Worker 
501*bb4ee6a4SAndroid Build Coastguard Worker /// Flags for the gfxstream renderer.
502*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_EGL: u32 = 1 << 0;
503*bb4ee6a4SAndroid Build Coastguard Worker #[allow(dead_code)]
504*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_THREAD_SYNC: u32 = 1 << 1;
505*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_GLX: u32 = 1 << 2;
506*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_SURFACELESS: u32 = 1 << 3;
507*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_GLES: u32 = 1 << 4;
508*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_VK_BIT: u32 = 1 << 5;
509*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_EXTERNAL_BLOB: u32 = 1 << 6;
510*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_USE_SYSTEM_BLOB: u32 = 1 << 7;
511*bb4ee6a4SAndroid Build Coastguard Worker const STREAM_RENDERER_FLAGS_VULKAN_NATIVE_SWAPCHAIN_BIT: u32 = 1 << 8;
512*bb4ee6a4SAndroid Build Coastguard Worker 
513*bb4ee6a4SAndroid Build Coastguard Worker /// gfxstream flag struct.
514*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Default)]
515*bb4ee6a4SAndroid Build Coastguard Worker pub struct GfxstreamFlags(u32);
516*bb4ee6a4SAndroid Build Coastguard Worker 
517*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Debug)]
518*bb4ee6a4SAndroid Build Coastguard Worker pub enum RutabagaWsi {
519*bb4ee6a4SAndroid Build Coastguard Worker     Surfaceless,
520*bb4ee6a4SAndroid Build Coastguard Worker     VulkanSwapchain,
521*bb4ee6a4SAndroid Build Coastguard Worker }
522*bb4ee6a4SAndroid Build Coastguard Worker 
523*bb4ee6a4SAndroid Build Coastguard Worker impl GfxstreamFlags {
524*bb4ee6a4SAndroid Build Coastguard Worker     /// Create new gfxstream flags.
new() -> GfxstreamFlags525*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new() -> GfxstreamFlags {
526*bb4ee6a4SAndroid Build Coastguard Worker         GfxstreamFlags(0)
527*bb4ee6a4SAndroid Build Coastguard Worker     }
528*bb4ee6a4SAndroid Build Coastguard Worker 
set_flag(self, bitmask: u32, set: bool) -> GfxstreamFlags529*bb4ee6a4SAndroid Build Coastguard Worker     fn set_flag(self, bitmask: u32, set: bool) -> GfxstreamFlags {
530*bb4ee6a4SAndroid Build Coastguard Worker         if set {
531*bb4ee6a4SAndroid Build Coastguard Worker             GfxstreamFlags(self.0 | bitmask)
532*bb4ee6a4SAndroid Build Coastguard Worker         } else {
533*bb4ee6a4SAndroid Build Coastguard Worker             GfxstreamFlags(self.0 & (!bitmask))
534*bb4ee6a4SAndroid Build Coastguard Worker         }
535*bb4ee6a4SAndroid Build Coastguard Worker     }
536*bb4ee6a4SAndroid Build Coastguard Worker 
537*bb4ee6a4SAndroid Build Coastguard Worker     /// Use EGL for context creation.
use_egl(self, v: bool) -> GfxstreamFlags538*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_egl(self, v: bool) -> GfxstreamFlags {
539*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_EGL, v)
540*bb4ee6a4SAndroid Build Coastguard Worker     }
541*bb4ee6a4SAndroid Build Coastguard Worker 
542*bb4ee6a4SAndroid Build Coastguard Worker     /// Use GLX for context creation.
use_glx(self, v: bool) -> GfxstreamFlags543*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_glx(self, v: bool) -> GfxstreamFlags {
544*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_GLX, v)
545*bb4ee6a4SAndroid Build Coastguard Worker     }
546*bb4ee6a4SAndroid Build Coastguard Worker 
547*bb4ee6a4SAndroid Build Coastguard Worker     /// No surfaces required when creating context.
use_surfaceless(self, v: bool) -> GfxstreamFlags548*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_surfaceless(self, v: bool) -> GfxstreamFlags {
549*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_SURFACELESS, v)
550*bb4ee6a4SAndroid Build Coastguard Worker     }
551*bb4ee6a4SAndroid Build Coastguard Worker 
552*bb4ee6a4SAndroid Build Coastguard Worker     /// Use GLES drivers.
use_gles(self, v: bool) -> GfxstreamFlags553*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_gles(self, v: bool) -> GfxstreamFlags {
554*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_GLES, v)
555*bb4ee6a4SAndroid Build Coastguard Worker     }
556*bb4ee6a4SAndroid Build Coastguard Worker 
557*bb4ee6a4SAndroid Build Coastguard Worker     /// Support using Vulkan.
use_vulkan(self, v: bool) -> GfxstreamFlags558*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_vulkan(self, v: bool) -> GfxstreamFlags {
559*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_VK_BIT, v)
560*bb4ee6a4SAndroid Build Coastguard Worker     }
561*bb4ee6a4SAndroid Build Coastguard Worker 
562*bb4ee6a4SAndroid Build Coastguard Worker     /// Use the Vulkan swapchain to draw on the host window.
set_wsi(self, v: RutabagaWsi) -> GfxstreamFlags563*bb4ee6a4SAndroid Build Coastguard Worker     pub fn set_wsi(self, v: RutabagaWsi) -> GfxstreamFlags {
564*bb4ee6a4SAndroid Build Coastguard Worker         let use_vulkan_swapchain = matches!(v, RutabagaWsi::VulkanSwapchain);
565*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(
566*bb4ee6a4SAndroid Build Coastguard Worker             STREAM_RENDERER_FLAGS_VULKAN_NATIVE_SWAPCHAIN_BIT,
567*bb4ee6a4SAndroid Build Coastguard Worker             use_vulkan_swapchain,
568*bb4ee6a4SAndroid Build Coastguard Worker         )
569*bb4ee6a4SAndroid Build Coastguard Worker     }
570*bb4ee6a4SAndroid Build Coastguard Worker 
571*bb4ee6a4SAndroid Build Coastguard Worker     /// Use external blob when creating resources.
use_external_blob(self, v: bool) -> GfxstreamFlags572*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_external_blob(self, v: bool) -> GfxstreamFlags {
573*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_EXTERNAL_BLOB, v)
574*bb4ee6a4SAndroid Build Coastguard Worker     }
575*bb4ee6a4SAndroid Build Coastguard Worker 
576*bb4ee6a4SAndroid Build Coastguard Worker     /// Use system blob when creating resources.
use_system_blob(self, v: bool) -> GfxstreamFlags577*bb4ee6a4SAndroid Build Coastguard Worker     pub fn use_system_blob(self, v: bool) -> GfxstreamFlags {
578*bb4ee6a4SAndroid Build Coastguard Worker         self.set_flag(STREAM_RENDERER_FLAGS_USE_SYSTEM_BLOB, v)
579*bb4ee6a4SAndroid Build Coastguard Worker     }
580*bb4ee6a4SAndroid Build Coastguard Worker }
581*bb4ee6a4SAndroid Build Coastguard Worker 
582*bb4ee6a4SAndroid Build Coastguard Worker impl From<GfxstreamFlags> for u32 {
from(flags: GfxstreamFlags) -> u32583*bb4ee6a4SAndroid Build Coastguard Worker     fn from(flags: GfxstreamFlags) -> u32 {
584*bb4ee6a4SAndroid Build Coastguard Worker         flags.0
585*bb4ee6a4SAndroid Build Coastguard Worker     }
586*bb4ee6a4SAndroid Build Coastguard Worker }
587*bb4ee6a4SAndroid Build Coastguard Worker 
588*bb4ee6a4SAndroid Build Coastguard Worker impl From<GfxstreamFlags> for i32 {
from(flags: GfxstreamFlags) -> i32589*bb4ee6a4SAndroid Build Coastguard Worker     fn from(flags: GfxstreamFlags) -> i32 {
590*bb4ee6a4SAndroid Build Coastguard Worker         flags.0 as i32
591*bb4ee6a4SAndroid Build Coastguard Worker     }
592*bb4ee6a4SAndroid Build Coastguard Worker }
593*bb4ee6a4SAndroid Build Coastguard Worker 
594*bb4ee6a4SAndroid Build Coastguard Worker impl From<GfxstreamFlags> for u64 {
from(flags: GfxstreamFlags) -> u64595*bb4ee6a4SAndroid Build Coastguard Worker     fn from(flags: GfxstreamFlags) -> u64 {
596*bb4ee6a4SAndroid Build Coastguard Worker         flags.0 as u64
597*bb4ee6a4SAndroid Build Coastguard Worker     }
598*bb4ee6a4SAndroid Build Coastguard Worker }
599*bb4ee6a4SAndroid Build Coastguard Worker 
600*bb4ee6a4SAndroid Build Coastguard Worker /// Transfers {to, from} 1D buffers, 2D textures, 3D textures, and cubemaps.
601*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C)]
602*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Debug)]
603*bb4ee6a4SAndroid Build Coastguard Worker pub struct Transfer3D {
604*bb4ee6a4SAndroid Build Coastguard Worker     pub x: u32,
605*bb4ee6a4SAndroid Build Coastguard Worker     pub y: u32,
606*bb4ee6a4SAndroid Build Coastguard Worker     pub z: u32,
607*bb4ee6a4SAndroid Build Coastguard Worker     pub w: u32,
608*bb4ee6a4SAndroid Build Coastguard Worker     pub h: u32,
609*bb4ee6a4SAndroid Build Coastguard Worker     pub d: u32,
610*bb4ee6a4SAndroid Build Coastguard Worker     pub level: u32,
611*bb4ee6a4SAndroid Build Coastguard Worker     pub stride: u32,
612*bb4ee6a4SAndroid Build Coastguard Worker     pub layer_stride: u32,
613*bb4ee6a4SAndroid Build Coastguard Worker     pub offset: u64,
614*bb4ee6a4SAndroid Build Coastguard Worker }
615*bb4ee6a4SAndroid Build Coastguard Worker 
616*bb4ee6a4SAndroid Build Coastguard Worker impl Transfer3D {
617*bb4ee6a4SAndroid Build Coastguard Worker     /// Constructs a 2 dimensional XY box in 3 dimensional space with unit depth and zero
618*bb4ee6a4SAndroid Build Coastguard Worker     /// displacement on the Z axis.
new_2d(x: u32, y: u32, w: u32, h: u32, offset: u64) -> Transfer3D619*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new_2d(x: u32, y: u32, w: u32, h: u32, offset: u64) -> Transfer3D {
620*bb4ee6a4SAndroid Build Coastguard Worker         Transfer3D {
621*bb4ee6a4SAndroid Build Coastguard Worker             x,
622*bb4ee6a4SAndroid Build Coastguard Worker             y,
623*bb4ee6a4SAndroid Build Coastguard Worker             z: 0,
624*bb4ee6a4SAndroid Build Coastguard Worker             w,
625*bb4ee6a4SAndroid Build Coastguard Worker             h,
626*bb4ee6a4SAndroid Build Coastguard Worker             d: 1,
627*bb4ee6a4SAndroid Build Coastguard Worker             level: 0,
628*bb4ee6a4SAndroid Build Coastguard Worker             stride: 0,
629*bb4ee6a4SAndroid Build Coastguard Worker             layer_stride: 0,
630*bb4ee6a4SAndroid Build Coastguard Worker             offset,
631*bb4ee6a4SAndroid Build Coastguard Worker         }
632*bb4ee6a4SAndroid Build Coastguard Worker     }
633*bb4ee6a4SAndroid Build Coastguard Worker 
634*bb4ee6a4SAndroid Build Coastguard Worker     /// Returns true if this box represents a volume of zero.
is_empty(&self) -> bool635*bb4ee6a4SAndroid Build Coastguard Worker     pub fn is_empty(&self) -> bool {
636*bb4ee6a4SAndroid Build Coastguard Worker         self.w == 0 || self.h == 0 || self.d == 0
637*bb4ee6a4SAndroid Build Coastguard Worker     }
638*bb4ee6a4SAndroid Build Coastguard Worker }
639*bb4ee6a4SAndroid Build Coastguard Worker 
640*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga channel types
641*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CHANNEL_TYPE_WAYLAND: u32 = 0x0001;
642*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_CHANNEL_TYPE_CAMERA: u32 = 0x0002;
643*bb4ee6a4SAndroid Build Coastguard Worker 
644*bb4ee6a4SAndroid Build Coastguard Worker /// Information needed to open an OS-specific RutabagaConnection (TBD).  Only Linux hosts are
645*bb4ee6a4SAndroid Build Coastguard Worker /// considered at the moment.
646*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone)]
647*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaChannel {
648*bb4ee6a4SAndroid Build Coastguard Worker     pub base_channel: PathBuf,
649*bb4ee6a4SAndroid Build Coastguard Worker     pub channel_type: u32,
650*bb4ee6a4SAndroid Build Coastguard Worker }
651*bb4ee6a4SAndroid Build Coastguard Worker 
652*bb4ee6a4SAndroid Build Coastguard Worker /// Enumeration of possible rutabaga components.
653*bb4ee6a4SAndroid Build Coastguard Worker #[repr(u8)]
654*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
655*bb4ee6a4SAndroid Build Coastguard Worker pub enum RutabagaComponentType {
656*bb4ee6a4SAndroid Build Coastguard Worker     Rutabaga2D,
657*bb4ee6a4SAndroid Build Coastguard Worker     VirglRenderer,
658*bb4ee6a4SAndroid Build Coastguard Worker     Gfxstream,
659*bb4ee6a4SAndroid Build Coastguard Worker     CrossDomain,
660*bb4ee6a4SAndroid Build Coastguard Worker }
661*bb4ee6a4SAndroid Build Coastguard Worker 
662*bb4ee6a4SAndroid Build Coastguard Worker /// Rutabaga handle types (memory and sync in same namespace)
663*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MEM_HANDLE_TYPE_OPAQUE_FD: u32 = 0x0001;
664*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MEM_HANDLE_TYPE_DMABUF: u32 = 0x0002;
665*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MEM_HANDLE_TYPE_OPAQUE_WIN32: u32 = 0x0003;
666*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MEM_HANDLE_TYPE_SHM: u32 = 0x0004;
667*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_MEM_HANDLE_TYPE_ZIRCON: u32 = 0x0005;
668*bb4ee6a4SAndroid Build Coastguard Worker 
669*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FENCE_HANDLE_TYPE_OPAQUE_FD: u32 = 0x0006;
670*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FENCE_HANDLE_TYPE_SYNC_FD: u32 = 0x0007;
671*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FENCE_HANDLE_TYPE_OPAQUE_WIN32: u32 = 0x0008;
672*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FENCE_HANDLE_TYPE_ZIRCON: u32 = 0x0009;
673*bb4ee6a4SAndroid Build Coastguard Worker 
674*bb4ee6a4SAndroid Build Coastguard Worker pub const RUTABAGA_FENCE_HANDLE_TYPE_EVENT_FD: u32 = 0x000a;
675*bb4ee6a4SAndroid Build Coastguard Worker 
676*bb4ee6a4SAndroid Build Coastguard Worker /// Handle to OS-specific memory or synchronization objects.
677*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaHandle {
678*bb4ee6a4SAndroid Build Coastguard Worker     pub os_handle: OwnedDescriptor,
679*bb4ee6a4SAndroid Build Coastguard Worker     pub handle_type: u32,
680*bb4ee6a4SAndroid Build Coastguard Worker }
681*bb4ee6a4SAndroid Build Coastguard Worker 
682*bb4ee6a4SAndroid Build Coastguard Worker impl fmt::Debug for RutabagaHandle {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result683*bb4ee6a4SAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
684*bb4ee6a4SAndroid Build Coastguard Worker         f.debug_struct("Handle debug").finish()
685*bb4ee6a4SAndroid Build Coastguard Worker     }
686*bb4ee6a4SAndroid Build Coastguard Worker }
687*bb4ee6a4SAndroid Build Coastguard Worker 
688*bb4ee6a4SAndroid Build Coastguard Worker impl RutabagaHandle {
689*bb4ee6a4SAndroid Build Coastguard Worker     /// Clones an existing rutabaga handle, by using OS specific mechanisms.
try_clone(&self) -> RutabagaResult<RutabagaHandle>690*bb4ee6a4SAndroid Build Coastguard Worker     pub fn try_clone(&self) -> RutabagaResult<RutabagaHandle> {
691*bb4ee6a4SAndroid Build Coastguard Worker         let clone = self
692*bb4ee6a4SAndroid Build Coastguard Worker             .os_handle
693*bb4ee6a4SAndroid Build Coastguard Worker             .try_clone()
694*bb4ee6a4SAndroid Build Coastguard Worker             .map_err(|_| RutabagaError::InvalidRutabagaHandle)?;
695*bb4ee6a4SAndroid Build Coastguard Worker         Ok(RutabagaHandle {
696*bb4ee6a4SAndroid Build Coastguard Worker             os_handle: clone,
697*bb4ee6a4SAndroid Build Coastguard Worker             handle_type: self.handle_type,
698*bb4ee6a4SAndroid Build Coastguard Worker         })
699*bb4ee6a4SAndroid Build Coastguard Worker     }
700*bb4ee6a4SAndroid Build Coastguard Worker }
701*bb4ee6a4SAndroid Build Coastguard Worker 
702*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone)]
703*bb4ee6a4SAndroid Build Coastguard Worker pub struct RutabagaHandler<S> {
704*bb4ee6a4SAndroid Build Coastguard Worker     closure: Arc<dyn Fn(S) + Send + Sync>,
705*bb4ee6a4SAndroid Build Coastguard Worker }
706*bb4ee6a4SAndroid Build Coastguard Worker 
707*bb4ee6a4SAndroid Build Coastguard Worker impl<S> RutabagaHandler<S>
708*bb4ee6a4SAndroid Build Coastguard Worker where
709*bb4ee6a4SAndroid Build Coastguard Worker     S: Send + Sync + Clone + 'static,
710*bb4ee6a4SAndroid Build Coastguard Worker {
new(closure: impl Fn(S) + Send + Sync + 'static) -> RutabagaHandler<S>711*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(closure: impl Fn(S) + Send + Sync + 'static) -> RutabagaHandler<S> {
712*bb4ee6a4SAndroid Build Coastguard Worker         RutabagaHandler {
713*bb4ee6a4SAndroid Build Coastguard Worker             closure: Arc::new(closure),
714*bb4ee6a4SAndroid Build Coastguard Worker         }
715*bb4ee6a4SAndroid Build Coastguard Worker     }
716*bb4ee6a4SAndroid Build Coastguard Worker 
call(&self, data: S)717*bb4ee6a4SAndroid Build Coastguard Worker     pub fn call(&self, data: S) {
718*bb4ee6a4SAndroid Build Coastguard Worker         (self.closure)(data)
719*bb4ee6a4SAndroid Build Coastguard Worker     }
720*bb4ee6a4SAndroid Build Coastguard Worker }
721*bb4ee6a4SAndroid Build Coastguard Worker 
722*bb4ee6a4SAndroid Build Coastguard Worker impl<S> fmt::Debug for RutabagaHandler<S> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result723*bb4ee6a4SAndroid Build Coastguard Worker     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
724*bb4ee6a4SAndroid Build Coastguard Worker         f.debug_struct("Closure debug").finish()
725*bb4ee6a4SAndroid Build Coastguard Worker     }
726*bb4ee6a4SAndroid Build Coastguard Worker }
727*bb4ee6a4SAndroid Build Coastguard Worker 
728*bb4ee6a4SAndroid Build Coastguard Worker pub type RutabagaFenceHandler = RutabagaHandler<RutabagaFence>;
729*bb4ee6a4SAndroid Build Coastguard Worker 
730*bb4ee6a4SAndroid Build Coastguard Worker pub type RutabagaDebugHandler = RutabagaHandler<RutabagaDebug>;
731