fix: GPU display at correct resolution, clean up diagnostics
- Add GET_DISPLAY_INFO command to query QEMU's preferred resolution (was hardcoded 640x480, QEMU wanted 1280x800) - Allocate framebuffer matching actual display dimensions - Remove debug diagnostic output from display server and snake
This commit is contained in:
@@ -83,6 +83,24 @@ fn write_cmd_header(cmd_va: VirtualAddress, cmd_type: u32) {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_display_info(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDmaAddrs) -> Option<(u32, u32)> {
|
||||
write_cmd_header(dma.cmd_va, 0x0100);
|
||||
let descs = [
|
||||
Descriptor { addr: dma.cmd_pa.raw() as u64, len: 24, writable: false },
|
||||
Descriptor { addr: dma.resp_pa.raw() as u64, len: 408, writable: true },
|
||||
];
|
||||
if !queue.submit(mmio, &descs) { return None; }
|
||||
unsafe {
|
||||
let resp = dma.resp_pa.raw() as usize;
|
||||
let resp_va = dma.cmd_va.raw() + 512;
|
||||
let resp_type = core::ptr::read_volatile(resp_va as *const u32);
|
||||
if resp_type != 0x1101 { return None; }
|
||||
let w = core::ptr::read_volatile((resp_va + 24 + 8) as *const u32);
|
||||
let h = core::ptr::read_volatile((resp_va + 24 + 12) as *const u32);
|
||||
if w > 0 && h > 0 { Some((w, h)) } else { None }
|
||||
}
|
||||
}
|
||||
|
||||
fn submit_cmd(mmio: &impl MmioAccess, queue: &VirtioQueue, dma: &GpuDmaAddrs, cmd_len: u32) -> bool {
|
||||
let descs = [
|
||||
Descriptor { addr: dma.cmd_pa.raw() as u64, len: cmd_len, writable: false },
|
||||
|
||||
Reference in New Issue
Block a user