From 7842d8133bba2ca60c721acc5d67a5de6f26fd2d Mon Sep 17 00:00:00 2001 From: esposm03 <36164633+esposm03@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:17:42 +0200 Subject: [PATCH 1/3] fix(kms): modeset on surface resize --- src/backends/kms.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/backends/kms.rs b/src/backends/kms.rs index 35ed5b8..248c2d4 100644 --- a/src/backends/kms.rs +++ b/src/backends/kms.rs @@ -224,6 +224,29 @@ impl SurfaceInterface fo let front_buffer = SharedBuffer::new(&self.display, width, height)?; let back_buffer = SharedBuffer::new(&self.display, width, height)?; + // Iterate over all modes of all the connectors, + // and pick one that is compatible with the size given by the user. + let mode = self + .connectors + .iter() + .flat_map(|con| self.display.get_modes(*con).unwrap()) + .find(|mode| { + mode.size().0 as u32 == u32::from(width) + && mode.size().1 as u32 == u32::from(height) + }) + .swbuf_err("No mode found")?; + + // When chaning the display resolution, we need to modeset + self.display + .set_crtc( + self.crtc.handle(), + Some(front_buffer.fb), + (0, 0), + &self.connectors, + Some(mode), + ) + .swbuf_err("Failed to modeset")?; + self.buffer = Some(Buffers { first_is_front: true, buffers: [front_buffer, back_buffer], From ea0322264d90b1b8ed5958b1757a5a59c728c4e6 Mon Sep 17 00:00:00 2001 From: esposm03 <36164633+esposm03@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:26:08 +0200 Subject: [PATCH 2/3] fix: set UniversalPlanes capability on the `drm` examples Without setting the UniversalPlanes capability, only planes with PlaneType::Overlay are returned by the kernel. This commit allows the example to run on devices that don't have any of those, but have at least one Primary plane --- examples/drm.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/drm.rs b/examples/drm.rs index 18bd61e..94d5127 100644 --- a/examples/drm.rs +++ b/examples/drm.rs @@ -3,7 +3,7 @@ #[cfg(kms_platform)] mod imple { use drm::control::{connector, Device as CtrlDevice, Event, ModeTypeFlags, PlaneType}; - use drm::Device; + use drm::{ClientCapability, Device}; use raw_window_handle::{DisplayHandle, DrmDisplayHandle, DrmWindowHandle, WindowHandle}; use softbuffer::{Context, Surface}; @@ -16,6 +16,7 @@ mod imple { pub(super) fn entry() -> Result<(), Box> { // Open a new device. let device = Card::find()?; + device.set_client_capability(ClientCapability::UniversalPlanes, true)?; // Create the softbuffer context. let context = unsafe { From 8799aa420de0a7a447d6fecbf0ac7863e6f94dc0 Mon Sep 17 00:00:00 2001 From: esposm03 <36164633+esposm03@users.noreply.github.com> Date: Fri, 20 Jun 2025 10:40:12 +0200 Subject: [PATCH 3/3] Fix typo --- src/backends/kms.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/kms.rs b/src/backends/kms.rs index 248c2d4..a243c6a 100644 --- a/src/backends/kms.rs +++ b/src/backends/kms.rs @@ -236,7 +236,7 @@ impl SurfaceInterface fo }) .swbuf_err("No mode found")?; - // When chaning the display resolution, we need to modeset + // When changing the display resolution, we need to modeset self.display .set_crtc( self.crtc.handle(),