From e9d782cabbdbf7efff15fb1057251e9386aeaa1d Mon Sep 17 00:00:00 2001 From: Meijlen Date: Sat, 14 Mar 2026 23:42:54 +0700 Subject: [PATCH] set_crtc realisation --- drivers/graphics/graphics-ipc/src/v2.rs | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/graphics/graphics-ipc/src/v2.rs b/drivers/graphics/graphics-ipc/src/v2.rs index 60534b8da4..c8ba39428f 100644 --- a/drivers/graphics/graphics-ipc/src/v2.rs +++ b/drivers/graphics/graphics-ipc/src/v2.rs @@ -6,6 +6,7 @@ use std::os::unix::io::AsRawFd; use drm::control::connector::{self, State}; use drm::control::Device as _; use drm::{Device as _, DriverCapability}; +use redox_ioctl::drm::{drm_mode_modeinfo}; use syscall::CallFlags; pub use crate::common::Damage; @@ -58,6 +59,36 @@ impl V2GraphicsHandle { )?; Ok(()) } + + pub fn set_crtc( + &self, + crtc_id: drm::control::crtc::Handle, + fb_id: drm::control::framebuffer::Handle, + connectors: &[connector::Handle], + mode: Option, + ) -> io::Result<()> { + let connector_ids: Vec = connectors.iter().map(|c| (*c).into()).collect(); + + let cmd = ipc::drm_mode_crtc { + set_connectors_ptr: connector_ids.as_ptr() as u64, + count_connectors: connector_ids.len() as u32, + crtc_id: crtc_id.into(), + fb_id: fb_id.into(), + x: 0, + y: 0, + gamma_size: 0, + mode_valid: mode.is_some() as u32, + mode: mode.unwrap_or_default(), + }; + + libredox::call::call_wo( + self.file.as_raw_fd() as usize, + unsafe { plain::as_bytes(&cmd) }, + CallFlags::empty(), + &[ipc::MODE_SET_CRTC, 0, 0], + )?; + Ok(()) + } } pub mod ipc {