From 6fc6831f67fea02341e3ed6f85808246e145631f Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:42:16 +0100 Subject: [PATCH] drm: Support MODE_PAGE_FLIP and MODE_DIRTYFB --- redox-ioctl/src/drm.rs | 30 +++++++++++++++++++++++++++--- src/header/sys_ioctl/redox/drm.rs | 4 ++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/redox-ioctl/src/drm.rs b/redox-ioctl/src/drm.rs index 327eb4b4f9..062407b103 100644 --- a/redox-ioctl/src/drm.rs +++ b/redox-ioctl/src/drm.rs @@ -4,14 +4,16 @@ use core::{ ffi::{c_char, c_int, c_uint}, iter, mem, slice, }; +use drm_sys::drm_clip_rect; pub use drm_sys::{ __kernel_size_t, DRM_PROP_NAME_LEN, drm_get_cap, drm_mode_card_res, - drm_mode_connector_set_property, drm_mode_create_dumb, drm_mode_crtc, drm_mode_cursor, - drm_mode_cursor2, drm_mode_destroy_dumb, drm_mode_fb_cmd, drm_mode_fb_cmd2, drm_mode_get_blob, + drm_mode_connector_set_property, drm_mode_create_dumb, drm_mode_crtc, + drm_mode_crtc_page_flip_target, drm_mode_cursor, drm_mode_cursor2, drm_mode_destroy_dumb, + drm_mode_fb_cmd, drm_mode_fb_cmd2, drm_mode_fb_dirty_cmd, drm_mode_get_blob, drm_mode_get_connector, drm_mode_get_encoder, drm_mode_get_plane, drm_mode_get_plane_res, drm_mode_get_property, drm_mode_map_dumb, drm_mode_modeinfo, drm_mode_obj_get_properties, - drm_mode_property_enum, drm_set_client_cap, drm_version, drm_mode_set_plane + drm_mode_property_enum, drm_mode_set_plane, drm_set_client_cap, drm_version, }; pub const VERSION: u64 = 0; @@ -185,6 +187,28 @@ pub struct standin_for_uint { pub inner: c_uint, } +pub const MODE_PAGE_FLIP: u64 = 0xB0; +define_ioctl_data! { + struct drm_mode_crtc_page_flip_target, DrmModeCrtcPageFlipTarget { + crtc_id: u32, + fb_id: u32, + flags: u32, + sequence: u32, + user_data: u64, + } +} + +pub const MODE_DIRTYFB: u64 = 0xB1; +define_ioctl_data! { + struct drm_mode_fb_dirty_cmd, DrmModeFbDirtyCmd { + fb_id: u32, + flags: u32, + color: u32, + num_clips: u32, + clips_ptr: u64 [array], + } +} + pub const MODE_CREATE_DUMB: u64 = 0xB2; define_ioctl_data! { struct drm_mode_create_dumb, DrmModeCreateDumb { diff --git a/src/header/sys_ioctl/redox/drm.rs b/src/header/sys_ioctl/redox/drm.rs index 70fcced2b2..0557178ee8 100644 --- a/src/header/sys_ioctl/redox/drm.rs +++ b/src/header/sys_ioctl/redox/drm.rs @@ -107,6 +107,10 @@ pub(super) unsafe fn ioctl(fd: c_int, func: u8, buf: IoctlBuffer) -> Result unsafe { dev.read_write_ioctl::(buf, MODE_GET_FB) }, 0xAE => unsafe { dev.read_write_ioctl::(buf, MODE_ADD_FB) }, 0xAF => unsafe { dev.read_write_ioctl::(buf, MODE_RM_FB) }, + 0xB0 => unsafe { + dev.read_write_ioctl::(buf, MODE_PAGE_FLIP) + }, + 0xB1 => unsafe { dev.read_write_ioctl::(buf, MODE_DIRTYFB) }, 0xB2 => unsafe { dev.read_write_ioctl::(buf, MODE_CREATE_DUMB) }, 0xB3 => unsafe { dev.read_write_ioctl::(buf, MODE_MAP_DUMB) }, 0xB4 => unsafe { dev.read_write_ioctl::(buf, MODE_DESTROY_DUMB) },