From ac75bcab713490eb000e4fa48f7e7316c3535854 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 May 2026 15:31:12 +0100 Subject: renderer: fix shadow CM calculations (#14364) --- src/render/OpenGL.cpp | 15 ++++++++------- src/render/Renderer.cpp | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 0a53442e..5a889eb4 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1067,8 +1067,9 @@ void CHyprOpenGLImpl::renderRectWithBlurInternal(const CBox& box, const CHyprCol using ColorConversionKey = std::tuple; static std::map colorConversionCache; -static CHyprColor getConvertedColor(const CHyprColor& color) { - const auto targetId = g_pHyprRenderer->workBufferImageDescription()->id(); +// +static CHyprColor getConvertedColor(const CHyprColor& color, PImageDescription imageDescription) { + const auto targetId = imageDescription->id(); const ColorConversionKey key = {color.r, color.g, color.b, color.a, targetId}; if (colorConversionCache.contains(key)) return colorConversionCache[key]; @@ -1094,7 +1095,7 @@ void CHyprOpenGLImpl::renderRectWithDamageInternal(const CBox& box, const CHyprC // premultiply the color as well as we don't work with straight alpha const auto premultiplied = CHyprColor(col.r * col.a, col.g * col.a, col.b * col.a, col.a); - const auto converted = getConvertedColor(premultiplied); + const auto converted = getConvertedColor(premultiplied, m_renderData.currentFB->imageDescription()); shader->setUniformFloat4(SHADER_COLOR, converted.r, converted.g, converted.b, converted.a); shader->setUniformFloat4(SHADER_COLOR_SRGB, premultiplied.r, premultiplied.g, premultiplied.b, premultiplied.a); @@ -2263,8 +2264,8 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun auto shader = useShader(getShaderVariant(SH_FRAG_SHADOW, globalFeatures())); shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); - const auto converted = getConvertedColor(col); - shader->setUniformFloat4(SHADER_COLOR, converted.r, converted.g, converted.b, converted.a * a); + const auto converted = getConvertedColor(col.stripA(), m_renderData.currentFB->imageDescription()); + shader->setUniformFloat4(SHADER_COLOR, converted.r, converted.g, converted.b, col.a * a); shader->setUniformFloat4(SHADER_COLOR_SRGB, col.r, col.g, col.b, col.a * a); const auto TOPLEFT = Vector2D(range + round, range + round); @@ -2355,8 +2356,8 @@ void CHyprOpenGLImpl::renderInnerGlow(const CBox& box, int round, float rounding auto shader = useShader(getShaderVariant(SH_FRAG_INNER_GLOW, globalFeatures())); shader->setUniformMatrix3fv(SHADER_PROJ, 1, GL_TRUE, glMatrix.getMatrix()); - const auto converted = getConvertedColor(col); - shader->setUniformFloat4(SHADER_COLOR, converted.r, converted.g, converted.b, converted.a * a); + const auto converted = getConvertedColor(col.stripA(), m_renderData.currentFB->imageDescription()); + shader->setUniformFloat4(SHADER_COLOR, converted.r, converted.g, converted.b, col.a * a); shader->setUniformFloat4(SHADER_COLOR_SRGB, col.r, col.g, col.b, col.a * a); const auto TOPLEFT = Vector2D(round, round); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 0cb713f1..57d0398a 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -3039,7 +3039,7 @@ void IHyprRenderer::makeSnapshot(PHLWINDOW pWindow) { const auto PFRAMEBUFFER = ref->m_snapshotFB; PFRAMEBUFFER->alloc(PMONITOR->m_pixelSize.x, PMONITOR->m_pixelSize.y, DRM_FORMAT_ABGR8888); - PFRAMEBUFFER->setImageDescription(workBufferImageDescription()); + PFRAMEBUFFER->setImageDescription(PMONITOR->workBufferImageDescription()); beginFullFakeRender(PMONITOR, fakeDamage, PFRAMEBUFFER); -- cgit v1.2.3