Skip to main content

krun_display/
lib.rs

1mod rust_to_c;
2pub use rust_to_c::*;
3mod c_to_rust;
4pub use c_to_rust::*;
5
6use bitflags::bitflags;
7use thiserror::Error;
8
9#[allow(
10    non_upper_case_globals,
11    non_snake_case,
12    non_camel_case_types,
13    dead_code,
14    unused_variables
15)]
16mod header {
17    include!(concat!(env!("OUT_DIR"), "/display_header.rs"));
18}
19
20bitflags! {
21    pub struct DisplayFeatures: u64 {
22        const BASIC_FRAMEBUFFER = header::KRUN_DISPLAY_FEATURE_BASIC_FRAMEBUFFER as u64;
23    }
24}
25
26pub const MAX_DISPLAYS: usize = 16;
27
28#[derive(Error, Debug)]
29#[repr(i32)]
30pub enum DisplayBackendError {
31    #[error("Backend implementation error")]
32    InternalError = header::KRUN_DISPLAY_ERR_INTERNAL,
33    #[error("Method not supported")]
34    MethodNotSupported = header::KRUN_DISPLAY_ERR_METHOD_UNSUPPORTED,
35    #[error("Invalid scanout id")]
36    InvalidScanoutId = header::KRUN_DISPLAY_ERR_INVALID_SCANOUT_ID,
37    #[error("Invalid parameter")]
38    InvalidParam = header::KRUN_DISPLAY_ERR_INVALID_PARAM,
39    #[error("Maximum number of buffers has been allocated")]
40    OutOfBuffers = header::KRUN_DISPLAY_ERR_OUT_OF_BUFFERS,
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq)]
44#[repr(u32)]
45pub enum ResourceFormat {
46    BGRA = header::KRUN_DISPLAY_FORMAT_B8G8R8A8_UNORM,
47    BGRX = header::KRUN_DISPLAY_FORMAT_B8G8R8X8_UNORM,
48    ARGB = header::KRUN_DISPLAY_FORMAT_A8R8G8B8_UNORM,
49    XRGB = header::KRUN_DISPLAY_FORMAT_X8R8G8B8_UNORM,
50    RGBA = header::KRUN_DISPLAY_FORMAT_R8G8B8A8_UNORM,
51    XBGR = header::KRUN_DISPLAY_FORMAT_X8B8G8R8_UNORM,
52    ABGR = header::KRUN_DISPLAY_FORMAT_A8B8G8R8_UNORM,
53    RGBX = header::KRUN_DISPLAY_FORMAT_R8G8B8X8_UNORM,
54}
55
56impl ResourceFormat {
57    pub const BYTES_PER_PIXEL: usize = 4;
58}
59
60impl TryFrom<u32> for ResourceFormat {
61    type Error = ();
62
63    fn try_from(value: u32) -> std::result::Result<Self, Self::Error> {
64        match value {
65            header::KRUN_DISPLAY_FORMAT_B8G8R8A8_UNORM => Ok(Self::BGRA),
66            header::KRUN_DISPLAY_FORMAT_B8G8R8X8_UNORM => Ok(Self::BGRX),
67            header::KRUN_DISPLAY_FORMAT_A8R8G8B8_UNORM => Ok(Self::ARGB),
68            header::KRUN_DISPLAY_FORMAT_X8R8G8B8_UNORM => Ok(Self::XRGB),
69            header::KRUN_DISPLAY_FORMAT_R8G8B8A8_UNORM => Ok(Self::RGBA),
70            header::KRUN_DISPLAY_FORMAT_X8B8G8R8_UNORM => Ok(Self::XBGR),
71            header::KRUN_DISPLAY_FORMAT_A8B8G8R8_UNORM => Ok(Self::ABGR),
72            header::KRUN_DISPLAY_FORMAT_R8G8B8X8_UNORM => Ok(Self::RGBX),
73            _ => Err(()),
74        }
75    }
76}
77
78pub type DisplayVtable = header::krun_display_vtable;
79pub type DisplayBasicFramebufferVtable = header::krun_display_basic_framebuffer_vtable;
80pub type Rect = header::krun_rect;