From b6ef6236438141e3fab9644c6b29e270d79c2553 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 5 Sep 2025 19:35:32 +0200 Subject: [PATCH] metal: disable direct scanout if blending would change the appearance --- src/backends/metal/present.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backends/metal/present.rs b/src/backends/metal/present.rs index 258627ac..d6e162a7 100644 --- a/src/backends/metal/present.rs +++ b/src/backends/metal/present.rs @@ -626,6 +626,7 @@ impl MetalConnector { &self, pass: &GfxRenderPass, plane: &Rc, + blend_cd: &Rc, cd: &Rc, ) -> Option { let ct = 'ct: { @@ -647,6 +648,10 @@ impl MetalConnector { // Direct scanout requires embeddable color descriptions. return None; } + if !ct.opaque && !ct.cd.embeds_into(blend_cd) { + // Blending changes the appearance of translucent buffers. + return None; + } if ct.alpha.is_some() { // Direct scanout with alpha factor is not supported. return None; @@ -818,7 +823,7 @@ impl MetalConnector { && self.dev.is_render_device(); let mut direct_scanout_data = None; if try_direct_scanout { - direct_scanout_data = self.prepare_direct_scanout(&latched.pass, plane, cd); + direct_scanout_data = self.prepare_direct_scanout(&latched.pass, plane, blend_cd, cd); } let direct_scanout_active = direct_scanout_data.is_some(); if self.direct_scanout_active.replace(direct_scanout_active) != direct_scanout_active {