summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2025-10-01 13:38:17 +0200
committerGitHub <noreply@github.com>2025-10-01 12:38:17 +0100
commite0c96276df75accc853a30186ae5de580b2c725f (patch)
tree8dae024f8dd72a2e54e218fdc991c596476d2b75 /src/render/OpenGL.cpp
parent378438ffe7306d20f0cd799c8c367cf4c9356c78 (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.cpp40
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);
});