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