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;