From b65714e3b8e123fb2febd507905d25fa6abd0400 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Thu, 23 Apr 2026 14:32:11 +0200 Subject: [PATCH] opengl: minor egl changes (#14147) * opengl: explicitly set stencil mask set stencil mask to 0xFF to allow writes, when done set it back to 0x00 to become readonly, avoids potential mishaps. also at the end set the stencil op to GL_KEEP and it will certainly be read only until next time its changed. * opengl: use modern glClearBufferfv over glClear use more modern glClearBufferfv instead, and also clear the entire buffer if a clearpass has been added but no renderdamage exist. --- src/render/OpenGL.cpp | 4 +++- src/render/gl/GLElementRenderer.cpp | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 590330a33..7051c10c8 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1933,6 +1933,7 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP tex, const CBox if (NEEDS_STENCIL) { scissor(nullptr); // allow the entire window and stencil to render + glStencilMask(0xFF); glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); @@ -1964,7 +1965,8 @@ void CHyprOpenGLImpl::renderTextureWithBlurInternal(SP tex, const CBox glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(GL_EQUAL, 1, 0xFF); - glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); + glStencilMask(0x00); + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); } // stencil done. Render everything. diff --git a/src/render/gl/GLElementRenderer.cpp b/src/render/gl/GLElementRenderer.cpp index 670c78862..dbf62cb8f 100644 --- a/src/render/gl/GLElementRenderer.cpp +++ b/src/render/gl/GLElementRenderer.cpp @@ -24,15 +24,17 @@ void CGLElementRenderer::draw(WP element, const CRegion& dama RASSERT(g_pHyprRenderer->m_renderData.pMonitor, "Tried to render without begin()!"); TRACY_GPU_ZONE("RenderClear"); - - GLCALL(glClearColor(color.r, color.g, color.b, color.a)); + const std::array c = {sc(color.r), sc(color.g), sc(color.b), sc(color.a)}; if (!g_pHyprRenderer->m_renderData.damage.empty()) { - g_pHyprRenderer->m_renderData.damage.forEachRect([](const auto& RECT) { + g_pHyprRenderer->m_renderData.damage.forEachRect([&c](const auto& RECT) { g_pHyprOpenGL->scissor(&RECT, g_pHyprRenderer->m_renderData.transformDamage); - glClear(GL_COLOR_BUFFER_BIT); + glClearBufferfv(GL_COLOR, 0, c.data()); }); - } + + g_pHyprOpenGL->scissor(nullptr); + } else + glClearBufferfv(GL_COLOR, 0, c.data()); }; void CGLElementRenderer::draw(WP element, const CRegion& damage) {