mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-16 09:48:16 +02:00
This is intended to a Rust analog to "src/util", which has
many utilities used by Mesa developers. This is mostly
a copy of ${crosvm} rutabaga_gfx/src/rutabaga_os (which will
be deleted in favor of this crate).
Key constructs include:
- SharedMemory
- MemoryMapping
- Tube (sockets, essentially)
- OwnedDescriptor (HANDLE or fd-based)
- WaitContext (epoll, ..)
As one would expect, Linux implementations are the most complete.
Acked-by: Aaron Ruby <aruby@qnx.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35210>
117 lines
3.1 KiB
Rust
117 lines
3.1 KiB
Rust
// Copyright 2025 Google
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
use std::fmt;
|
|
use std::time::Duration;
|
|
|
|
use crate::error::MesaError;
|
|
use crate::error::MesaResult;
|
|
use crate::OwnedDescriptor;
|
|
|
|
/// Mapped memory caching flags (see virtio_gpu spec)
|
|
pub const MESA_MAP_CACHE_MASK: u32 = 0x0f;
|
|
pub const MESA_MAP_CACHE_CACHED: u32 = 0x01;
|
|
pub const MESA_MAP_CACHE_UNCACHED: u32 = 0x02;
|
|
pub const MESA_MAP_CACHE_WC: u32 = 0x03;
|
|
/// Access flags (not in virtio_gpu spec)
|
|
pub const MESA_MAP_ACCESS_MASK: u32 = 0xf0;
|
|
pub const MESA_MAP_ACCESS_READ: u32 = 0x10;
|
|
pub const MESA_MAP_ACCESS_WRITE: u32 = 0x20;
|
|
pub const MESA_MAP_ACCESS_RW: u32 = 0x30;
|
|
|
|
/// Mesa handle types (memory and sync in same namespace)
|
|
pub const MESA_HANDLE_TYPE_MEM_OPAQUE_FD: u32 = 0x0001;
|
|
pub const MESA_HANDLE_TYPE_MEM_DMABUF: u32 = 0x0002;
|
|
pub const MESA_HANDLE_TYPE_MEM_OPAQUE_WIN32: u32 = 0x0003;
|
|
pub const MESA_HANDLE_TYPE_MEM_SHM: u32 = 0x0004;
|
|
pub const MESA_HANDLE_TYPE_MEM_ZIRCON: u32 = 0x0005;
|
|
|
|
pub const MESA_HANDLE_TYPE_SIGNAL_OPAQUE_FD: u32 = 0x0010;
|
|
pub const MESA_HANDLE_TYPE_SIGNAL_SYNC_FD: u32 = 0x0020;
|
|
pub const MESA_HANDLE_TYPE_SIGNAL_OPAQUE_WIN32: u32 = 0x0030;
|
|
pub const MESA_HANDLE_TYPE_SIGNAL_ZIRCON: u32 = 0x0040;
|
|
pub const MESA_HANDLE_TYPE_SIGNAL_EVENT_FD: u32 = 0x0050;
|
|
|
|
/// Handle to OS-specific memory or synchronization objects.
|
|
pub struct MesaHandle {
|
|
pub os_handle: OwnedDescriptor,
|
|
pub handle_type: u32,
|
|
}
|
|
|
|
impl MesaHandle {
|
|
/// Clones an existing Mesahandle, by using OS specific mechanisms.
|
|
pub fn try_clone(&self) -> MesaResult<MesaHandle> {
|
|
let clone = self
|
|
.os_handle
|
|
.try_clone()
|
|
.map_err(|_| MesaError::InvalidMesaHandle)?;
|
|
Ok(MesaHandle {
|
|
os_handle: clone,
|
|
handle_type: self.handle_type,
|
|
})
|
|
}
|
|
}
|
|
|
|
#[repr(C)]
|
|
#[derive(Copy, Clone, Debug)]
|
|
pub struct MesaMapping {
|
|
pub ptr: u64,
|
|
pub size: u64,
|
|
}
|
|
|
|
impl fmt::Debug for MesaHandle {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.debug_struct("Handle debug").finish()
|
|
}
|
|
}
|
|
|
|
pub enum TubeType {
|
|
Stream,
|
|
Packet,
|
|
}
|
|
|
|
pub enum WaitTimeout {
|
|
Finite(Duration),
|
|
NoTimeout,
|
|
}
|
|
|
|
pub struct WaitEvent {
|
|
pub connection_id: u64,
|
|
pub hung_up: bool,
|
|
pub readable: bool,
|
|
}
|
|
|
|
#[allow(dead_code)]
|
|
pub const WAIT_CONTEXT_MAX: usize = 16;
|
|
|
|
pub enum DescriptorType {
|
|
Unknown,
|
|
Memory(u32),
|
|
WritePipe,
|
|
}
|
|
|
|
/// # Safety
|
|
///
|
|
/// Caller must ensure that MappedRegion's lifetime contains the lifetime of
|
|
/// pointer returned.
|
|
pub unsafe trait MappedRegion: Send + Sync {
|
|
/// Returns a pointer to the beginning of the memory region. Should only be
|
|
/// used for passing this region to ioctls for setting guest memory.
|
|
fn as_ptr(&self) -> *mut u8;
|
|
|
|
/// Returns the size of the memory region in bytes.
|
|
fn size(&self) -> usize;
|
|
|
|
/// Returns mesa mapping representation of the region
|
|
fn as_mesa_mapping(&self) -> MesaMapping;
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! log_status {
|
|
($result:expr) => {
|
|
match $result {
|
|
Ok(_) => (),
|
|
Err(e) => error!("Error recieved: {}", e),
|
|
}
|
|
};
|
|
}
|