diff --git a/src/backend.rs b/src/backend.rs index 531e858a..0cad389e 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -540,6 +540,9 @@ pub trait BackendDrmDevice { fn version(&self) -> Result; fn set_direct_scanout_enabled(&self, enabled: bool); fn is_render_device(&self) -> bool; + fn direct_scanout_enabled(&self) -> bool { + false + } fn create_lease( self: Rc, lessee: Rc, @@ -551,6 +554,10 @@ pub trait BackendDrmDevice { fn set_flip_margin(&self, margin: u64) { let _ = margin; } + #[expect(dead_code)] + fn flip_margin(&self) -> Option { + None + } } pub trait BackendDrmLease { diff --git a/src/backends/metal/present.rs b/src/backends/metal/present.rs index bf211e29..5f1a8940 100644 --- a/src/backends/metal/present.rs +++ b/src/backends/metal/present.rs @@ -1,6 +1,6 @@ use { crate::{ - backend::Connector, + backend::{BackendDrmDevice, Connector}, backends::metal::{ MetalError, allocator::{RenderBuffer, RenderBufferCopy}, @@ -814,13 +814,6 @@ impl MetalConnector { data } - fn direct_scanout_enabled(&self) -> bool { - self.dev - .direct_scanout_enabled - .get() - .unwrap_or(self.state.direct_scanout_enabled.get()) - } - fn prepare_present_fb( &self, cd: &Rc, @@ -832,7 +825,7 @@ impl MetalConnector { ) -> Result { self.trim_scanout_cache(); let try_direct_scanout = try_direct_scanout - && self.direct_scanout_enabled() + && self.dev.direct_scanout_enabled() // at least on AMD, using a FB on a different device for rendering will fail // and destroy the render context. it's possible to work around this by waiting // until the FB is no longer being scanned out, but if a notification pops up diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index a15681e0..1ede708a 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -186,6 +186,12 @@ impl BackendDrmDevice for MetalDrmDevice { Some(self.id) == self.backend.ctx.get().map(|c| c.dev_id) } + fn direct_scanout_enabled(&self) -> bool { + self.direct_scanout_enabled + .get() + .unwrap_or(self.backend.state.direct_scanout_enabled.get()) + } + fn create_lease( self: Rc, lessee: Rc, @@ -314,6 +320,10 @@ impl BackendDrmDevice for MetalDrmDevice { } } } + + fn flip_margin(&self) -> Option { + Some(self.min_post_commit_margin.get()) + } } pub struct HandleEvents {