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:
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user