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; }