Something went wrong. Try again.
A successor to xv0, a from scratch rust OS
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354use limine::request::FramebufferRequest;
use crate::serial;
pub struct FbData { pub base: *mut u8,
pub pitch: usize, pub width: usize, pub height: usize,
pub red_mask_shift: u8, pub green_mask_shift: u8, pub blue_mask_shift: u8,}
pub fn set_fb_data(fb_request: &FramebufferRequest) -> FbData {
let fb = fb_request.response().expect("No FB response :(").framebuffers().first().expect("No FB :("); serial!("framebuffer: {}x{} pitch={} bpp={}", fb.width, fb.height, fb.pitch, fb.bpp);
assert_eq!(fb.bpp, 32, "failed framebuffer check: need a 32-bit-per-pixel framebuffer"); assert_eq!(fb.memory_model, limine::framebuffer::FRAMEBUFFER_RGB, "failed framebuffer check: need an RGB framebuffer");
for (size, shift) in [ (fb.red_mask_size, fb.red_mask_shift), (fb.green_mask_size, fb.green_mask_shift), (fb.blue_mask_size, fb.blue_mask_shift), ] { assert_eq!(size, 8, "failed framebuffer check: need 8-bit color channels"); assert!(shift % 8 == 0 && shift <= 24, "failed framebuffer check: color channel not on a byte boundary"); } assert!( fb.red_mask_shift != fb.green_mask_shift && fb.red_mask_shift != fb.blue_mask_shift && fb.green_mask_shift != fb.blue_mask_shift, "failed framebuffer check: overlapping color channels" ); assert!(fb.width > 0 && fb.height > 0, "failed framebuffer check: framebuffer has 0 size");
let base = fb.address() as *mut u8; assert!(!base.is_null(), "failed framebuffer check: address is null"); assert!((base as usize) % 4 == 0, "failed framebuffer check: buffer must be 4-bit aligned"); let (pitch, width, height) = (fb.pitch as usize, fb.width as usize, fb.height as usize); assert!(pitch % 4 == 0, "failed framebuffer check: pitch must keep every row 4-byte aligned"); let row_bytes = width.checked_mul(4).expect("failed framebuffer check: width overflows usize"); assert!(pitch >= row_bytes, "failed framebuffer check: pitch smaller than one row of pixels"); assert!(pitch.checked_mul(height - 1).and_then(|rows| rows.checked_add(row_bytes)).is_some(), "failed framebuffer check: geometry overflows usize");
let (red_mask_shift, green_mask_shift, blue_mask_shift) = (fb.red_mask_shift, fb.green_mask_shift, fb.blue_mask_shift); FbData { base, pitch, width, height, red_mask_shift, green_mask_shift, blue_mask_shift }}