From c467bb26406a35b8bbfac6478e6382d1d79b6664 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Thu, 2 Oct 2025 12:01:16 +0200 Subject: [PATCH] renderer: fix popup fadeout blur (#11756) popups dont get no xray --- src/render/Renderer.cpp | 16 ++++++++-------- src/render/pass/TexPassElement.cpp | 18 +++++++++++++----- src/render/pass/TexPassElement.hpp | 1 + 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 65d8a074..0626271e 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -2598,16 +2598,16 @@ void CHyprRenderer::renderSnapshot(WP popup) { const bool SHOULD_BLUR = shouldBlur(popup); CTexPassElement::SRenderData data; - data.flipEndFrame = true; - data.tex = FBDATA->getTexture(); - data.box = {{}, PMONITOR->m_transformedSize}; - data.a = popup->m_alpha->value(); - data.damage = fakeDamage; - data.blur = SHOULD_BLUR; - data.blurA = sqrt(popup->m_alpha->value()); // sqrt makes the blur fadeout more realistic. + data.flipEndFrame = true; + data.tex = FBDATA->getTexture(); + data.box = {{}, PMONITOR->m_transformedSize}; + data.a = popup->m_alpha->value(); + data.damage = fakeDamage; + data.blur = SHOULD_BLUR; + data.blurA = sqrt(popup->m_alpha->value()); // sqrt makes the blur fadeout more realistic. + data.blockBlurOptimization = SHOULD_BLUR; // force no xray on this (popups never have xray) if (SHOULD_BLUR) data.ignoreAlpha = std::max(*PBLURIGNOREA, 0.01F); /* ignore the alpha 0 regions */ - ; m_renderPass.add(makeUnique(std::move(data))); } diff --git a/src/render/pass/TexPassElement.cpp b/src/render/pass/TexPassElement.cpp index 4702c0e4..39853a64 100644 --- a/src/render/pass/TexPassElement.cpp +++ b/src/render/pass/TexPassElement.cpp @@ -36,13 +36,21 @@ void CTexPassElement::draw(const CRegion& damage) { g_pHyprOpenGL->m_renderData.discardOpacity = *m_data.ignoreAlpha; } - if (m_data.blur) - g_pHyprOpenGL->renderTexture( - m_data.tex, m_data.box, - {.a = m_data.a, .blur = true, .blurA = m_data.blurA, .overallA = 1.F, .round = m_data.round, .roundingPower = m_data.roundingPower, .blockBlurOptimization = false}); - else + if (m_data.blur) { + g_pHyprOpenGL->renderTexture(m_data.tex, m_data.box, + { + .a = m_data.a, + .blur = true, + .blurA = m_data.blurA, + .overallA = 1.F, + .round = m_data.round, + .roundingPower = m_data.roundingPower, + .blockBlurOptimization = m_data.blockBlurOptimization.value_or(false), + }); + } else { g_pHyprOpenGL->renderTexture(m_data.tex, m_data.box, {.damage = m_data.damage.empty() ? &damage : &m_data.damage, .a = m_data.a, .round = m_data.round, .roundingPower = m_data.roundingPower}); + } } bool CTexPassElement::needsLiveBlur() { diff --git a/src/render/pass/TexPassElement.hpp b/src/render/pass/TexPassElement.hpp index 4257357e..a922843d 100644 --- a/src/render/pass/TexPassElement.hpp +++ b/src/render/pass/TexPassElement.hpp @@ -21,6 +21,7 @@ class CTexPassElement : public IPassElement { CBox clipBox; bool blur = false; std::optional ignoreAlpha; + std::optional blockBlurOptimization; }; CTexPassElement(const SRenderData& data);