diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index e1ecdd2f5..fd5ce1641 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -3170,18 +3170,36 @@ void CHyprOpenGLImpl::setViewport(GLint x, GLint y, GLsizei width, GLsizei heigh } void CHyprOpenGLImpl::setCapStatus(int cap, bool status) { - // check if the capability status is already set to the desired status - auto it = m_capStatus.find(cap); - bool currentStatus = (it != m_capStatus.end()) ? it->second : false; // default to 'false' if not found + const auto getCapIndex = [cap]() { + switch (cap) { + case GL_BLEND: return CAP_STATUS_BLEND; + case GL_SCISSOR_TEST: return CAP_STATUS_SCISSOR_TEST; + case GL_STENCIL_TEST: return CAP_STATUS_STENCIL_TEST; + default: return CAP_STATUS_END; + } + }; - if (currentStatus == status) + auto idx = getCapIndex(); + + if (idx == CAP_STATUS_END) { + if (status) + glEnable(cap); + else + glDisable(cap); + + return; + } + + if (m_capStatus[idx] == status) return; - m_capStatus[cap] = status; - - // Enable or disable the capability based on status - auto func = status ? [](int c) { glEnable(c); } : [](int c) { glDisable(c); }; - func(cap); + if (status) { + m_capStatus[idx] = status; + glEnable(cap); + } else { + m_capStatus[idx] = status; + glDisable(cap); + } } uint32_t CHyprOpenGLImpl::getPreferredReadFormat(PHLMONITOR pMonitor) { diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index a69ebbfeb..a6dbd3393 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -341,6 +340,13 @@ class CHyprOpenGLImpl { eEGLContextVersion m_eglContextVersion = EGL_CONTEXT_GLES_3_2; + enum eCachedCapStatus : uint8_t { + CAP_STATUS_BLEND = 0, + CAP_STATUS_SCISSOR_TEST, + CAP_STATUS_STENCIL_TEST, + CAP_STATUS_END + }; + private: struct { GLint x = 0; @@ -349,7 +355,7 @@ class CHyprOpenGLImpl { GLsizei height = 0; } m_lastViewport; - std::unordered_map m_capStatus; + std::array m_capStatus; std::vector m_drmFormats; bool m_hasModifiers = false;