fix: DRM backend wire format — match redox-drm scheme structs exactly

- DrmConnector: explicit field names (no _rsvd padding guess)
- DrmSetCrtc: connectors array [u32; 8] instead of invalid u64 pointer
- DrmCreateDumb/DrmMapDumb/DrmAddFb: fields match scheme wire types
- SETCRTC: pass actual connector 0 in connectors array
- ModeInfo: remove underscore prefixes, align with scheme

All structs now match redox-drm scheme.rs wire definitions
This commit is contained in:
2026-05-06 13:01:38 +01:00
parent 7213524efc
commit 6453405159
@@ -60,18 +60,18 @@ mod drm_backend {
}
#[repr(C)]
struct DrmConnector { connector_id: u32, connection: u32, _rsvd: [u32; 4], mode_count: u32, modes: [DrmModeInfo; 1], }
struct DrmConnector { connector_id: u32, connection: u32, connector_type: u32, mm_width: u32, mm_height: u32, encoder_id: u32, mode_count: u32, }
#[repr(C)]
#[derive(Clone, Copy)]
struct DrmModeInfo { clock: u32, hdisplay: u16, hsync_start: u16, hsync_end: u16, htotal: u16, _hskew: u16, vdisplay: u16, vsync_start: u16, vsync_end: u16, vtotal: u16, _vscan: u16, _vrefresh: u32, _flags: u32, _type_: u32, }
struct DrmModeInfo { clock: u32, hdisplay: u16, hsync_start: u16, hsync_end: u16, htotal: u16, hskew: u16, vdisplay: u16, vsync_start: u16, vsync_end: u16, vtotal: u16, vscan: u16, vrefresh: u32, flags: u32, type_: u32, }
#[repr(C)]
struct DrmCreateDumb { _height: u32, width: u32, bpp: u32, _flags: u32, handle: u32, pitch: u32, size: u64, }
struct DrmCreateDumb { height: u32, width: u32, bpp: u32, flags: u32, handle: u32, pitch: u32, size: u64, }
#[repr(C)]
struct DrmMapDumb { handle: u32, _pad: u32, offset: u64, }
struct DrmMapDumb { handle: u32, pad: u32, offset: u64, }
#[repr(C)]
struct DrmAddFb { _width: u32, _height: u32, _pitch: u32, handle: u32, _depth: u32, _bpp: u32, fb_id: u32, }
struct DrmAddFb { width: u32, height: u32, pitch: u32, bpp: u32, depth: u32, handle: u32, fb_id: u32, }
#[repr(C)]
struct DrmSetCrtc { crtc_id: u32, fb_id: u32, x: u32, y: u32, connector_count: u32, connector_ids: u64, mode_valid: u32, mode: DrmModeInfo, }
struct DrmSetCrtc { crtc_id: u32, fb_handle: u32, connector_count: u32, connectors: [u32; 8], mode: DrmModeInfo, }
pub struct DrmOutput {
pub width: u32,
@@ -111,7 +111,10 @@ mod drm_backend {
let mut fb_ids = Vec::new();
let mut stride = 0u32;
for _ in 0..2 {
let mut dumb = DrmCreateDumb { _height: height, width, bpp: 32, _flags: 0, handle: 0, pitch: 0, size: 0 };
let mut dumb: DrmCreateDumb = unsafe { std::mem::zeroed() };
dumb.height = height;
dumb.width = width;
dumb.bpp = 32;
let mut dumb_req = vec![0u8; std::mem::size_of::<DrmCreateDumb>()];
unsafe { std::ptr::copy_nonoverlapping(&dumb as *const DrmCreateDumb as *const u8, dumb_req.as_mut_ptr(), dumb_req.len()); }
let mut dumb_resp = vec![0u8; std::mem::size_of::<DrmCreateDumb>()];
@@ -121,7 +124,7 @@ mod drm_backend {
stride = dumb.pitch;
// Map dumb buffer
let mut map = DrmMapDumb { handle: dumb.handle, _pad: 0, offset: 0 };
let mut map = DrmMapDumb { handle: dumb.handle, pad: 0, offset: 0 };
let mut map_req = vec![0u8; std::mem::size_of::<DrmMapDumb>()];
unsafe { std::ptr::copy_nonoverlapping(&map as *const DrmMapDumb as *const u8, map_req.as_mut_ptr(), map_req.len()); }
let mut map_resp = vec![0u8; std::mem::size_of::<DrmMapDumb>()];
@@ -130,7 +133,7 @@ mod drm_backend {
buffers.push(vec![0u8; buf_size]);
// Add framebuffer
let mut addfb = DrmAddFb { _width: width, _height: height, _pitch: stride, handle: dumb.handle, _depth: 24, _bpp: 32, fb_id: 0 };
let mut addfb = DrmAddFb { width, height, pitch: stride, bpp: 32, depth: 24, handle: dumb.handle, fb_id: 0 };
let mut addfb_req = vec![0u8; std::mem::size_of::<DrmAddFb>()];
unsafe { std::ptr::copy_nonoverlapping(&addfb as *const DrmAddFb as *const u8, addfb_req.as_mut_ptr(), addfb_req.len()); }
let mut addfb_resp = vec![0u8; std::mem::size_of::<DrmAddFb>()];
@@ -140,9 +143,13 @@ mod drm_backend {
fb_ids.push(addfb.fb_id);
}
// Set CRTC
let mut setcrtc = DrmSetCrtc { crtc_id: 0, fb_id: fb_ids[0], x: 0, y: 0, connector_count: 1,
connector_ids: std::ptr::null::<u32>() as u64, mode_valid: 1, mode: *mode };
// Set CRTC with first framebuffer
let mut setcrtc: DrmSetCrtc = unsafe { std::mem::zeroed() };
setcrtc.crtc_id = 0;
setcrtc.fb_handle = fb_ids[0];
setcrtc.connector_count = 1;
setcrtc.connectors[0] = 0; // connector 0
setcrtc.mode = *mode;
let mut setcrtc_req = vec![0u8; std::mem::size_of::<DrmSetCrtc>()];
unsafe { std::ptr::copy_nonoverlapping(&setcrtc as *const DrmSetCrtc as *const u8, setcrtc_req.as_mut_ptr(), setcrtc_req.len()); }
if drm_ioctl(&mut file, DRM_IOCTL_MODE_SETCRTC, &setcrtc_req, &mut []).is_err() { return None; }