From 645340515921b2039f122c017377075143ab4217 Mon Sep 17 00:00:00 2001 From: Vasilito Date: Wed, 6 May 2026 13:01:38 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20DRM=20backend=20wire=20format=20?= =?UTF-8?q?=E2=80=94=20match=20redox-drm=20scheme=20structs=20exactly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- .../redbear-compositor/source/src/main.rs | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/local/recipes/wayland/redbear-compositor/source/src/main.rs b/local/recipes/wayland/redbear-compositor/source/src/main.rs index 55cd34ec7..218089409 100644 --- a/local/recipes/wayland/redbear-compositor/source/src/main.rs +++ b/local/recipes/wayland/redbear-compositor/source/src/main.rs @@ -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::()]; 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::()]; @@ -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::()]; 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::()]; @@ -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::()]; 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::()]; @@ -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::() 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::()]; 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; }