diff options
| author | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2025-10-01 13:38:17 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-01 12:38:17 +0100 |
| commit | e0c96276df75accc853a30186ae5de580b2c725f (patch) | |
| tree | 8dae024f8dd72a2e54e218fdc991c596476d2b75 /src/render/OpenGL.cpp | |
| parent | 378438ffe7306d20f0cd799c8c367cf4c9356c78 (diff) | |
renderer: optimize border drawcalls (#11891)
calculates the specific border region to avoid sampling on regions where the border cannot be at
Diffstat (limited to 'src/render/OpenGL.cpp')
| -rw-r--r-- | src/render/OpenGL.cpp | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 5a2593ec..1fd44392 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -2402,18 +2402,16 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glBindVertexArray(m_shaders->m_shBORDER1.uniformLocations[SHADER_SHADER_VAO]); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { - CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; - damageClip.intersect(m_renderData.damage); + // calculate the border's region, which we need to render over. No need to run the shader on + // things outside there + CRegion borderRegion = m_renderData.damage.copy().intersect(newBox); + borderRegion.subtract(box.copy().expand(-scaledBorderSize - round)); - if (!damageClip.empty()) { - damageClip.forEachRect([this](const auto& RECT) { - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - }); - } - } else { - m_renderData.damage.forEachRect([this](const auto& RECT) { + if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) + borderRegion.intersect(m_renderData.clipBox); + + if (!borderRegion.empty()) { + borderRegion.forEachRect([this](const auto& RECT) { scissor(&RECT); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); @@ -2492,18 +2490,16 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glBindVertexArray(m_shaders->m_shBORDER1.uniformLocations[SHADER_SHADER_VAO]); - if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) { - CRegion damageClip{m_renderData.clipBox.x, m_renderData.clipBox.y, m_renderData.clipBox.width, m_renderData.clipBox.height}; - damageClip.intersect(m_renderData.damage); + // calculate the border's region, which we need to render over. No need to run the shader on + // things outside there + CRegion borderRegion = m_renderData.damage.copy().intersect(newBox); + borderRegion.subtract(box.copy().expand(-scaledBorderSize - round)); - if (!damageClip.empty()) { - damageClip.forEachRect([this](const auto& RECT) { - scissor(&RECT); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - }); - } - } else { - m_renderData.damage.forEachRect([this](const auto& RECT) { + if (m_renderData.clipBox.width != 0 && m_renderData.clipBox.height != 0) + borderRegion.intersect(m_renderData.clipBox); + + if (!borderRegion.empty()) { + borderRegion.forEachRect([this](const auto& RECT) { scissor(&RECT); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }); |
