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 { diff --git a/src/backends/kms.rs b/src/backends/kms.rs index 35ed5b8..a243c6a 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 changing 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],