diff options
Diffstat (limited to 'src/render/OpenGL.cpp')
| -rw-r--r-- | src/render/OpenGL.cpp | 159 |
1 files changed, 66 insertions, 93 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 19d03fef..7d1b9db9 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -977,6 +977,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shCM.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shCM.tint = glGetUniformLocation(prog, "tint"); shaders->m_shCM.useAlphaMatte = glGetUniformLocation(prog, "useAlphaMatte"); + shaders->m_shCM.createVao(); } else Debug::log(ERR, "WARNING: CM Shader failed compiling, color management will not work. It's likely because your GPU is an old piece of garbage, don't file bug reports " @@ -1006,6 +1007,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shQUAD.proj = glGetUniformLocation(prog, "proj"); shaders->m_shQUAD.color = glGetUniformLocation(prog, "color"); shaders->m_shQUAD.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shQUAD.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBA, isDynamic); if (!prog) @@ -1025,6 +1027,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shRGBA.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shRGBA.tint = glGetUniformLocation(prog, "tint"); shaders->m_shRGBA.useAlphaMatte = glGetUniformLocation(prog, "useAlphaMatte"); + shaders->m_shRGBA.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBAPASSTHRU, isDynamic); if (!prog) @@ -1034,6 +1037,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shPASSTHRURGBA.tex = glGetUniformLocation(prog, "tex"); shaders->m_shPASSTHRURGBA.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shPASSTHRURGBA.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shPASSTHRURGBA.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBAMATTE, isDynamic); if (!prog) @@ -1044,6 +1048,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shMATTE.alphaMatte = glGetUniformLocation(prog, "texMatte"); shaders->m_shMATTE.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shMATTE.posAttrib = glGetAttribLocation(prog, "pos"); + shaders->m_shMATTE.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGGLITCH, isDynamic); if (!prog) @@ -1056,6 +1061,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shGLITCH.distort = glGetUniformLocation(prog, "distort"); shaders->m_shGLITCH.time = glGetUniformLocation(prog, "time"); shaders->m_shGLITCH.fullSize = glGetUniformLocation(prog, "screenSize"); + shaders->m_shGLITCH.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCRGBX, isDynamic); if (!prog) @@ -1072,6 +1078,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shRGBX.discardAlphaValue = glGetUniformLocation(prog, "discardAlphaValue"); shaders->m_shRGBX.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shRGBX.tint = glGetUniformLocation(prog, "tint"); + shaders->m_shRGBX.createVao(); prog = createProgram(shaders->TEXVERTSRC, TEXFRAGSRCEXT, isDynamic); if (!prog) @@ -1088,6 +1095,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shEXT.discardAlphaValue = glGetUniformLocation(prog, "discardAlphaValue"); shaders->m_shEXT.applyTint = glGetUniformLocation(prog, "applyTint"); shaders->m_shEXT.tint = glGetUniformLocation(prog, "tint"); + shaders->m_shEXT.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGBLUR1, isDynamic); if (!prog) @@ -1103,6 +1111,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLUR1.passes = glGetUniformLocation(prog, "passes"); shaders->m_shBLUR1.vibrancy = glGetUniformLocation(prog, "vibrancy"); shaders->m_shBLUR1.vibrancy_darkness = glGetUniformLocation(prog, "vibrancy_darkness"); + shaders->m_shBLUR1.createVao(); prog = createProgram(shaders->TEXVERTSRC, FRAGBLUR2, isDynamic); if (!prog) @@ -1115,6 +1124,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLUR2.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLUR2.radius = glGetUniformLocation(prog, "radius"); shaders->m_shBLUR2.halfpixel = glGetUniformLocation(prog, "halfpixel"); + shaders->m_shBLUR2.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBLURPREPARE, isDynamic); if (!prog) @@ -1129,6 +1139,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLURPREPARE.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLURPREPARE.contrast = glGetUniformLocation(prog, "contrast"); shaders->m_shBLURPREPARE.brightness = glGetUniformLocation(prog, "brightness"); + shaders->m_shBLURPREPARE.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBLURFINISH, isDynamic); if (!prog) @@ -1142,6 +1153,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBLURFINISH.texAttrib = glGetAttribLocation(prog, "texcoord"); shaders->m_shBLURFINISH.brightness = glGetUniformLocation(prog, "brightness"); shaders->m_shBLURFINISH.noise = glGetUniformLocation(prog, "noise"); + shaders->m_shBLURFINISH.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGSHADOW, isDynamic); if (!prog) @@ -1157,6 +1169,7 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shSHADOW.range = glGetUniformLocation(prog, "range"); shaders->m_shSHADOW.shadowPower = glGetUniformLocation(prog, "shadowPower"); shaders->m_shSHADOW.color = glGetUniformLocation(prog, "color"); + shaders->m_shSHADOW.createVao(); prog = createProgram(m_cmSupported ? shaders->TEXVERTSRC300 : shaders->TEXVERTSRC, FRAGBORDER1, isDynamic); if (!prog) @@ -1181,6 +1194,8 @@ bool CHyprOpenGLImpl::initShaders() { shaders->m_shBORDER1.angle2 = glGetUniformLocation(prog, "angle2"); shaders->m_shBORDER1.gradientLerp = glGetUniformLocation(prog, "gradientLerp"); shaders->m_shBORDER1.alpha = glGetUniformLocation(prog, "alpha"); + shaders->m_shBORDER1.createVao(); + } catch (const std::exception& e) { if (!m_shadersInitialized) throw e; @@ -1375,7 +1390,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co newBox, wlTransformToHyprutils(invertTransform(!m_endFrame ? WL_OUTPUT_TRANSFORM_NORMAL : m_renderData.pMonitor->m_transform)), newBox.rot); Mat3x3 glMatrix = m_renderData.projection.copy().multiply(matrix); - glUseProgram(m_shaders->m_shQUAD.program); + useProgram(m_shaders->m_shQUAD.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shQUAD.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1400,9 +1415,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co glUniform1f(m_shaders->m_shQUAD.radius, round); glUniform1f(m_shaders->m_shQUAD.roundingPower, roundingPower); - glVertexAttribPointer(m_shaders->m_shQUAD.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shQUAD.posAttrib); + glBindVertexArray(m_shaders->m_shQUAD.shaderVao); 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}; @@ -1421,7 +1434,7 @@ void CHyprOpenGLImpl::renderRectWithDamage(const CBox& box, const CHyprColor& co } } - glDisableVertexAttribArray(m_shaders->m_shQUAD.posAttrib); + glBindVertexArray(0); scissor(nullptr); } @@ -1581,7 +1594,7 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB if (!skipCM && !usingFinalShader && (texType == TEXTURE_RGBA || texType == TEXTURE_RGBX)) shader = &m_shaders->m_shCM; - glUseProgram(shader->program); + useProgram(shader->program); if (shader == &m_shaders->m_shCM) { glUniform1i(shader->texType, texType); @@ -1655,22 +1668,20 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB glUniform1i(shader->applyTint, 0); } - const float verts[] = { - m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVTopLeft.y, // top right - m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVTopLeft.y, // top left - m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVBottomRight.y, // bottom right - m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVBottomRight.y, // bottom left - }; - - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - if (allowCustomUV && m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, verts); - else - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); + glBindVertexArray(shader->shaderVao); + if (allowCustomUV && m_renderData.primarySurfaceUVTopLeft != Vector2D(-1, -1)) { + const float customUVs[] = { + m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVTopLeft.y, m_renderData.primarySurfaceUVTopLeft.x, + m_renderData.primarySurfaceUVTopLeft.y, m_renderData.primarySurfaceUVBottomRight.x, m_renderData.primarySurfaceUVBottomRight.y, + m_renderData.primarySurfaceUVTopLeft.x, m_renderData.primarySurfaceUVBottomRight.y, + }; - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindBuffer(GL_ARRAY_BUFFER, shader->shaderVboUv); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(customUVs), customUVs); + } else { + glBindBuffer(GL_ARRAY_BUFFER, shader->shaderVboUv); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(fullVerts), fullVerts); + } if (!m_renderData.clipBox.empty() || !m_renderData.clipRegion.empty()) { CRegion damageClip = m_renderData.clipBox; @@ -1695,9 +1706,8 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, const CB } } - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(tex->m_target, 0); } @@ -1723,7 +1733,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP<CTexture> tex, const CBox& box) glActiveTexture(GL_TEXTURE0); glBindTexture(tex->m_target, tex->m_texID); - glUseProgram(shader->program); + useProgram(shader->program); #ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1733,11 +1743,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP<CTexture> tex, const CBox& box) #endif glUniform1i(shader->tex, 0); - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindVertexArray(shader->shaderVao); for (auto const& RECT : m_renderData.damage.getRects()) { scissor(&RECT); @@ -1746,9 +1752,7 @@ void CHyprOpenGLImpl::renderTexturePrimitive(SP<CTexture> tex, const CBox& box) scissor(nullptr); - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); glBindTexture(tex->m_target, 0); } @@ -1771,7 +1775,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP<CTexture> tex, const CBox& box, CFra SShader* shader = &m_shaders->m_shMATTE; - glUseProgram(shader->program); + useProgram(shader->program); #ifndef GLES2 glUniformMatrix3fv(shader->proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -1789,11 +1793,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP<CTexture> tex, const CBox& box, CFra auto matteTex = matte.getTexture(); glBindTexture(matteTex->m_target, matteTex->m_texID); - glVertexAttribPointer(shader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(shader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(shader->posAttrib); - glEnableVertexAttribArray(shader->texAttrib); + glBindVertexArray(shader->shaderVao); for (auto const& RECT : m_renderData.damage.getRects()) { scissor(&RECT); @@ -1802,9 +1802,7 @@ void CHyprOpenGLImpl::renderTextureMatte(SP<CTexture> tex, const CBox& box, CFra scissor(nullptr); - glDisableVertexAttribArray(shader->posAttrib); - glDisableVertexAttribArray(shader->texAttrib); - + glBindVertexArray(0); glBindTexture(tex->m_target, 0); } @@ -1868,7 +1866,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(m_shaders->m_shBLURPREPARE.program); + useProgram(m_shaders->m_shBLURPREPARE.program); // From FB to sRGB const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; @@ -1897,11 +1895,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform1f(m_shaders->m_shBLURPREPARE.brightness, *PBLURBRIGHTNESS); glUniform1i(m_shaders->m_shBLURPREPARE.tex, 0); - glVertexAttribPointer(m_shaders->m_shBLURPREPARE.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBLURPREPARE.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBLURPREPARE.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBLURPREPARE.texAttrib); + glBindVertexArray(m_shaders->m_shBLURPREPARE.shaderVao); if (!damage.empty()) { for (auto const& RECT : damage.getRects()) { @@ -1910,9 +1904,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(m_shaders->m_shBLURPREPARE.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBLURPREPARE.texAttrib); - + glBindVertexArray(0); currentRenderToFB = PMIRRORSWAPFB; } @@ -1931,7 +1923,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(pShader->program); + useProgram(pShader->program); // prep two shaders #ifndef GLES2 @@ -1950,12 +1942,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform2f(m_shaders->m_shBLUR2.halfpixel, 0.5f / (m_renderData.pMonitor->m_pixelSize.x * 2.f), 0.5f / (m_renderData.pMonitor->m_pixelSize.y * 2.f)); glUniform1i(pShader->tex, 0); - glVertexAttribPointer(pShader->posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(pShader->texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(pShader->posAttrib); - glEnableVertexAttribArray(pShader->texAttrib); - + glBindVertexArray(pShader->shaderVao); if (!pDamage->empty()) { for (auto const& RECT : pDamage->getRects()) { scissor(&RECT, false /* this region is already transformed */); @@ -1963,8 +1950,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(pShader->posAttrib); - glDisableVertexAttribArray(pShader->texAttrib); + glBindVertexArray(0); if (currentRenderToFB != PMIRRORFB) currentRenderToFB = PMIRRORFB; @@ -2009,7 +1995,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glTexParameteri(currentTex->m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glUseProgram(m_shaders->m_shBLURFINISH.program); + useProgram(m_shaders->m_shBLURFINISH.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBLURFINISH.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -2022,11 +2008,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi glUniform1i(m_shaders->m_shBLURFINISH.tex, 0); - glVertexAttribPointer(m_shaders->m_shBLURFINISH.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBLURFINISH.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBLURFINISH.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBLURFINISH.texAttrib); + glBindVertexArray(m_shaders->m_shBLURFINISH.shaderVao); if (!damage.empty()) { for (auto const& RECT : damage.getRects()) { @@ -2035,8 +2017,7 @@ CFramebuffer* CHyprOpenGLImpl::blurFramebufferWithDamage(float a, CRegion* origi } } - glDisableVertexAttribArray(m_shaders->m_shBLURFINISH.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBLURFINISH.texAttrib); + glBindVertexArray(0); if (currentRenderToFB != PMIRRORFB) currentRenderToFB = PMIRRORFB; @@ -2352,7 +2333,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr const auto BLEND = m_blend; blend(true); - glUseProgram(m_shaders->m_shBORDER1.program); + useProgram(m_shaders->m_shBORDER1.program); const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; glUniform1i(m_shaders->m_shBORDER1.skipCM, skipCM); @@ -2387,11 +2368,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glUniform1f(m_shaders->m_shBORDER1.roundingPower, roundingPower); glUniform1f(m_shaders->m_shBORDER1.thick, scaledBorderSize); - glVertexAttribPointer(m_shaders->m_shBORDER1.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBORDER1.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(m_shaders->m_shBORDER1.shaderVao); 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}; @@ -2410,8 +2387,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr } } - glDisableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(0); blend(BLEND); } @@ -2450,7 +2426,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr const auto BLEND = m_blend; blend(true); - glUseProgram(m_shaders->m_shBORDER1.program); + useProgram(m_shaders->m_shBORDER1.program); #ifndef GLES2 glUniformMatrix3fv(m_shaders->m_shBORDER1.proj, 1, GL_TRUE, glMatrix.getMatrix().data()); @@ -2484,11 +2460,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr glUniform1f(m_shaders->m_shBORDER1.roundingPower, roundingPower); glUniform1f(m_shaders->m_shBORDER1.thick, scaledBorderSize); - glVertexAttribPointer(m_shaders->m_shBORDER1.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shBORDER1.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); + glBindVertexArray(m_shaders->m_shBORDER1.shaderVao); 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}; @@ -2507,9 +2479,7 @@ void CHyprOpenGLImpl::renderBorder(const CBox& box, const CGradientValueData& gr } } - glDisableVertexAttribArray(m_shaders->m_shBORDER1.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shBORDER1.texAttrib); - + glBindVertexArray(0); blend(BLEND); } @@ -2538,7 +2508,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun blend(true); - glUseProgram(m_shaders->m_shSHADOW.program); + useProgram(m_shaders->m_shSHADOW.program); const bool skipCM = !m_cmSupported || m_renderData.pMonitor->m_imageDescription == SImageDescription{}; glUniform1i(m_shaders->m_shSHADOW.skipCM, skipCM); if (!skipCM) @@ -2565,11 +2535,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun glUniform1f(m_shaders->m_shSHADOW.range, range); glUniform1f(m_shaders->m_shSHADOW.shadowPower, SHADOWPOWER); - glVertexAttribPointer(m_shaders->m_shSHADOW.posAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - glVertexAttribPointer(m_shaders->m_shSHADOW.texAttrib, 2, GL_FLOAT, GL_FALSE, 0, fullVerts); - - glEnableVertexAttribArray(m_shaders->m_shSHADOW.posAttrib); - glEnableVertexAttribArray(m_shaders->m_shSHADOW.texAttrib); + glBindVertexArray(m_shaders->m_shSHADOW.shaderVao); 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}; @@ -2588,8 +2554,7 @@ void CHyprOpenGLImpl::renderRoundedShadow(const CBox& box, int round, float roun } } - glDisableVertexAttribArray(m_shaders->m_shSHADOW.posAttrib); - glDisableVertexAttribArray(m_shaders->m_shSHADOW.texAttrib); + glBindVertexArray(0); } void CHyprOpenGLImpl::saveBufferForMirror(const CBox& box) { @@ -2861,6 +2826,14 @@ void CHyprOpenGLImpl::initMissingAssetTexture() { m_missingAssetTexture = tex; } +void CHyprOpenGLImpl::useProgram(GLuint prog) { + if (m_currentProgram == prog) + return; + + glUseProgram(prog); + m_currentProgram = prog; +} + void CHyprOpenGLImpl::initAssets() { initMissingAssetTexture(); |
