From 1c7c5b3f28b3222844c3e28b40fda2f4477a37dd Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Fri, 5 Jan 2024 20:21:42 +0400 Subject: tty: Avoid non-linear cross-device formats --- src/backend/tty.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/backend') diff --git a/src/backend/tty.rs b/src/backend/tty.rs index 067b3e3e..226d45df 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -32,6 +32,7 @@ use smithay::reexports::calloop::{Dispatcher, LoopHandle, RegistrationToken}; use smithay::reexports::drm::control::{ connector, crtc, property, Device, Mode as DrmMode, ModeFlags, ModeTypeFlags, }; +use smithay::reexports::gbm::Modifier; use smithay::reexports::input::Libinput; use smithay::reexports::rustix::fs::OFlags; use smithay::reexports::wayland_protocols; @@ -1234,11 +1235,17 @@ fn surface_dmabuf_feedback( // We limit the scan-out trache to formats we can also render from so that there is always a // fallback render path available in case the supplied buffer can not be scanned out directly. - let scanout_formats = plane_formats + let mut scanout_formats = plane_formats .intersection(&primary_formats) .copied() .collect::>(); + // HACK: AMD iGPU + dGPU systems share some modifiers between the two, and yet cross-device + // buffers produce a glitched scanout if the modifier is not Linear... + if primary_render_node != surface_render_node { + scanout_formats.retain(|f| f.modifier == Modifier::Linear); + } + let builder = DmabufFeedbackBuilder::new(primary_render_node.dev_id(), primary_formats); let scanout = builder -- cgit