limine_protocol_for_rust/requests/
framebuffer.rs

1//![Framebuffer Feature](https://codeberg.org/Limine/limine-protocol/src/branch/trunk/PROTOCOL.md#framebuffer-feature)
2
3use crate::requests::LimineRequest;
4use core::mem::MaybeUninit;
5use core::slice::{from_raw_parts};
6use crate::{impl_limine_req, LimineReqId};
7use crate::util::PointerSlice;
8
9#[repr(C, align(8))]
10pub struct FramebufferRequest {
11    id: LimineReqId,
12    revision: u64,
13    resp: MaybeUninit<usize>
14}
15
16impl FramebufferRequest {
17    pub const fn new(revision: u64) -> Self {
18        Self {
19            id: LimineReqId::new([0x9d5827dcd881dd75, 0xa3148604f6fab11b]),
20            revision,
21            resp: MaybeUninit::uninit()
22        }
23    }
24}
25
26impl_limine_req!(FramebufferRequest, FramebufferResponse);
27
28
29#[repr(C, align(8))]
30#[derive(Copy, Clone)]
31pub struct FramebufferResponse {
32    revision: u64,
33    framebuffer_count: u64,
34    framebuffers: *const *const Framebuffer
35}
36
37impl FramebufferResponse {
38    pub fn get_framebuffers(&self) -> PointerSlice<Framebuffer> {
39        PointerSlice::from(unsafe {
40            from_raw_parts(self.framebuffers, self.framebuffer_count as usize)
41        })
42    }
43}
44
45
46#[repr(C, align(8))]
47#[derive(Debug, Copy, Clone)]
48pub struct Framebuffer {
49    pub address: usize,
50    pub width: u64,
51    pub height: u64,
52    pub pitch: u64,
53    pub bpp: u16,
54    pub memory_model: u8,
55    pub red_mask_size: u8,
56    pub red_mask_shift: u8,
57    pub green_mask_size: u8,
58    pub green_mask_shift: u8,
59    pub blue_mask_size: u8,
60    pub blue_mask_shift: u8,
61    _unused: [u8; 7],
62    pub edid_size: u64,
63    pub edid_address: usize,
64
65    //Response revision 1
66    pub video_mode_count: u64,
67    video_modes: *const *const VideoMode
68}
69
70impl Framebuffer {
71    pub fn get_video_mode(&self) -> PointerSlice<VideoMode> {
72        PointerSlice::from(unsafe {
73            from_raw_parts(self.video_modes, self.video_mode_count as usize)
74        })
75    }
76}
77
78#[repr(C, align(8))]
79#[derive(Copy, Clone)]
80pub struct VideoMode {
81    pub pitch: u64,
82    pub width: u64,
83    pub height: u64,
84    pub bpp: u16,
85    pub memory_model: u8,
86    pub red_mask_size: u8,
87    pub red_mask_shift: u8,
88    pub green_mask_size: u8,
89    pub green_mask_shift: u8,
90    pub blue_mask_size: u8,
91    pub blue_mask_shift: u8,
92}