limine_protocol_for_rust/requests/
framebuffer.rs1use 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 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}