From dbe50063b0f78ecbcb14ade65e16c5c74ad9abe1 Mon Sep 17 00:00:00 2001 From: hachem Date: Thu, 10 Sep 2026 07:17:15 +0200 Subject: feat: basic framebuffer --- boot/limine.zig | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'boot/limine.zig') diff --git a/boot/limine.zig b/boot/limine.zig index e9aac9c..ef08867 100644 --- a/boot/limine.zig +++ b/boot/limine.zig @@ -25,3 +25,44 @@ pub const RequestsEndMarker = extern struct { m0: u64 = 0xadc0e0531bb10d03, m1: u64 = 0x9572709f31764c62, }; + +// Every request id starts with this common magic, then two request-specific +// words. Limine scans .limine_requests for these and fills in `response`. +fn requestId(a: u64, b: u64) [4]u64 { + return .{ 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, a, b }; +} + +// --- Framebuffer feature: ask Limine for a linear framebuffer --- + +pub const Framebuffer = extern struct { + address: [*]u8, + width: u64, + height: u64, + pitch: u64, // bytes per row (not always width*bpp/8) + bpp: u16, // bits per pixel + memory_model: u8, // 1 = RGB + red_mask_size: u8, + red_mask_shift: u8, + green_mask_size: u8, + green_mask_shift: u8, + blue_mask_size: u8, + blue_mask_shift: u8, + // 7 bytes of padding land here (extern-struct alignment before edid_size) + edid_size: u64, + edid: ?*anyopaque, + // response revision 1 and up — unused for now: + mode_count: u64, + modes: ?*anyopaque, +}; + +pub const FramebufferResponse = extern struct { + revision: u64, + framebuffer_count: u64, + framebuffers: ?[*]*Framebuffer, +}; + +pub const FramebufferRequest = extern struct { + id: [4]u64 = requestId(0x9d5827dcd881dd75, 0xa3148604f6fab11b), + revision: u64 = 0, + response: ?*FramebufferResponse = null, +}; -- cgit v1.3