diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 622a211d..638b562f 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -115,10 +115,50 @@ GLuint CHyprOpenGLImpl::compileShader(const GLuint& type, std::string src, bool return shader; } -void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) { - m_RenderData.pMonitor = pMonitor; +bool CHyprOpenGLImpl::passRequiresIntrospection(CMonitor* pMonitor) { + // passes requiring introspection are the ones that need to render blur. static auto* const PBLUR = &g_pConfigManager->getConfigValuePtr("decoration:blur:enabled")->intValue; + static auto* const PXRAY = &g_pConfigManager->getConfigValuePtr("decoration:blur:xray")->intValue; + + if (*PBLUR == 0) + return false; + + if (m_RenderData.pCurrentMonData->blurFBShouldRender) + return true; + + if (pMonitor->solitaryClient) + return false; + + for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + if (ls->forceBlur && !ls->xray) + return true; + } + + if (*PXRAY) + return false; + + for (auto& w : g_pCompositor->m_vWindows) { + if (!w->m_bIsMapped || w->isHidden() || (!w->m_bIsFloating && !g_pCompositor->isWorkspaceSpecial(w->m_iWorkspaceID))) + continue; + + if (!g_pHyprRenderer->shouldRenderWindow(w.get())) + continue; + + if (w->m_sAdditionalConfigData.forceNoBlur.toUnderlying() == true || w->m_sAdditionalConfigData.xray.toUnderlying() == true) + continue; + + if (w->opaque()) + continue; + + return true; + } + + return false; +} + +void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) { + m_RenderData.pMonitor = pMonitor; TRACY_GPU_ZONE("RenderBegin"); @@ -163,7 +203,7 @@ void CHyprOpenGLImpl::begin(CMonitor* pMonitor, CRegion* pDamage, bool fake) { const auto PRBO = g_pHyprRenderer->getCurrentRBO(); if (m_sFinalScreenShader.program > 0 || m_bFakeFrame || m_RenderData.mouseZoomFactor != 1.0 || pMonitor->vecPixelSize != PRBO->getFB()->m_vSize || - (*PBLUR != 0 && !pMonitor->solitaryClient /* TODO: revisit when possible */)) { + passRequiresIntrospection(pMonitor)) { // we have to offload // bind the primary Hypr Framebuffer m_RenderData.pCurrentMonData->offloadFB.bind(); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 4311e16c..9ff571f2 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -30,8 +30,7 @@ inline const float fullVerts[] = { }; inline const float fanVertsFull[] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f}; -enum eDiscardMode -{ +enum eDiscardMode { DISCARD_OPAQUE = 1, DISCARD_ALPHA = 1 << 1 }; @@ -173,7 +172,7 @@ class CHyprOpenGLImpl { struct { PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC glEGLImageTargetRenderbufferStorageOES = nullptr; - PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr; + PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR = nullptr; } m_sProc; private: @@ -209,6 +208,8 @@ class CHyprOpenGLImpl { bool shouldUseNewBlurOptimizations(SLayerSurface* pLayer, CWindow* pWindow); + bool passRequiresIntrospection(CMonitor* pMonitor); + friend class CHyprRenderer; };