From 76d63984731be0d0195fa12d81349ecddeff8a1f Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 14 May 2026 15:28:49 +0200 Subject: [PATCH] drivers/graphics/driver-graphics: Add primary plane for every CRTC --- .../graphics/driver-graphics/src/kms/objects.rs | 13 +++++++++++++ drivers/graphics/driver-graphics/src/lib.rs | 17 ++--------------- drivers/graphics/ihdgd/src/device/mod.rs | 2 +- drivers/graphics/vesad/src/scheme.rs | 2 +- drivers/graphics/virtio-gpud/src/scheme.rs | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index f9a3682553..329ca16710 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -82,12 +82,22 @@ impl KmsObjects { &mut self, driver_data: T::Crtc, driver_data_state: ::State, + plane_data: T::Plane, + plane_data_state: ::State, ) -> KmsObjectId { + let primary_plane = self.add_plane( + &[], + KmsPlaneType::Primary, + plane_data, + plane_data_state, + ); + let crtc_index = self.crtcs.len() as u32; let id = self.add(Mutex::new(KmsCrtc { crtc_index, gamma_size: 0, properties: KmsCrtc::base_properties(), + primary_plane, state: KmsCrtcState { fb_id: None, mode: None, @@ -97,6 +107,8 @@ impl KmsObjects { })); self.crtcs.push(id); + self.get_plane(primary_plane).unwrap().lock().unwrap().possible_crtcs = 1 << crtc_index; + id } @@ -254,6 +266,7 @@ pub struct KmsCrtc { pub crtc_index: u32, pub gamma_size: u32, pub properties: Vec>, + pub primary_plane: KmsObjectId, pub state: KmsCrtcState, pub driver_data: T::Crtc, } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 9e72d66925..6a3357594c 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -26,7 +26,7 @@ use syscall::{Error, MapFlags, Result, EACCES, EAGAIN, EINVAL, ENOENT, ENXIO, EO use crate::kms::connector::{KmsConnectorDriver, KmsConnectorState}; use crate::kms::objects::{ self, KmsCrtc, KmsCrtcDriver, KmsCrtcState, KmsObjectId, KmsObjects, KmsPlane, KmsPlaneDriver, - KmsPlaneState, KmsPlaneType, KmsRect, + KmsPlaneState, KmsRect, }; use crate::kms::properties::KmsPropertyKind; @@ -623,20 +623,7 @@ impl SchemeSync for GraphicsSchemeInner { None }; - let primary_plane_id = self - .objects - .plane_ids() - .iter() - .copied() - .find(|&pid| { - let plane = self.objects.get_plane(pid).unwrap().lock().unwrap(); - plane.plane_type == KmsPlaneType::Primary - && (plane.state.crtc_id == Some(crtc_id) - || plane.possible_crtcs - & (1 << crtc.lock().unwrap().crtc_index) - != 0) - }) - .ok_or(Error::new(EINVAL))?; + let primary_plane_id = crtc.lock().unwrap().primary_plane; let plane = self.objects.get_plane(primary_plane_id)?; let mut new_crtc_state = crtc.lock().unwrap().state.clone(); new_crtc_state.mode = mode; diff --git a/drivers/graphics/ihdgd/src/device/mod.rs b/drivers/graphics/ihdgd/src/device/mod.rs index 4ed77eae55..eb3ff9723f 100644 --- a/drivers/graphics/ihdgd/src/device/mod.rs +++ b/drivers/graphics/ihdgd/src/device/mod.rs @@ -449,7 +449,7 @@ impl Device { } fn add_kms_pipe(objects: &mut KmsObjects, pipe_idx: usize, fb: KmsFramebuffer) { - let crtc_id = objects.add_crtc(Crtc { pipe_idx }, ()); + let crtc_id = objects.add_crtc(Crtc { pipe_idx }, (), (), ()); let (width, height) = (fb.width, fb.height); diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 0d9c864044..c8bab6d81f 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -49,7 +49,7 @@ impl GraphicsAdapter for FbAdapter { fn init(&mut self, objects: &mut KmsObjects) { for (framebuffer_id, framebuffer) in self.framebuffers.iter().enumerate() { - let crtc = objects.add_crtc((), ()); + let crtc = objects.add_crtc((), (), (), ()); objects.add_connector( Connector { diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index f7f6360777..de1f86d766 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -363,7 +363,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { }); for display_id in 0..self.config.num_scanouts.get() { - let crtc = objects.add_crtc((), ()); + let crtc = objects.add_crtc((), (), (), ()); objects.add_connector(VirtGpuConnector { display_id }, (), &[crtc]); }