diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 83ced53d..25e45f88 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -600,6 +600,27 @@ void CHyprOpenGLImpl::preBlurForCurrentMonitor() { m_RenderData.pCurrentMonData->blurFBDirty = false; } +void CHyprOpenGLImpl::preWindowPass() { + static auto* const PBLURNEWOPTIMIZE = &g_pConfigManager->getConfigValuePtr("decoration:blur_new_optimizations")->intValue; + + if (!m_RenderData.pCurrentMonData->blurFBDirty || !*PBLURNEWOPTIMIZE) + return; + + bool hasWindows = false; + for (auto& w : g_pCompositor->m_vWindows) { + if (w->m_iWorkspaceID == m_RenderData.pMonitor->activeWorkspace && !w->m_bHidden && w->m_bIsMapped) { + hasWindows = true; + break; + } + } + + if (!hasWindows) + return; + + // blur the main FB, it will be rendered onto the mirror + preBlurForCurrentMonitor(); +} + void CHyprOpenGLImpl::renderTextureWithBlur(const CTexture& tex, wlr_box* pBox, float a, wlr_surface* pSurface, int round) { RASSERT(m_RenderData.pMonitor, "Tried to render texture with blur without begin()!"); @@ -635,12 +656,6 @@ void CHyprOpenGLImpl::renderTextureWithBlur(const CTexture& tex, wlr_box* pBox, return; } - // blur the main FB, it will be rendered onto the mirror - if (*PBLURNEWOPTIMIZE && m_RenderData.pCurrentMonData->blurFBDirty) { - // redraw the blur. Since this resets the dirty flag, it will be drawn before the first window. - preBlurForCurrentMonitor(); - } - // vvv TODO: layered blur fbs? const auto POUTFB = (*PBLURNEWOPTIMIZE && m_pCurrentWindow && !m_pCurrentWindow->m_bIsFloating) ? &m_RenderData.pCurrentMonData->blurFB : blurMainFramebufferWithDamage(a, pBox, &inverseOpaque); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 4fd16612..14995979 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -87,6 +87,8 @@ public: void markBlurDirtyForMonitor(CMonitor*); + void preWindowPass(); + SCurrentRenderData m_RenderData; GLint m_iCurrentOutputFb = 0; diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 05a16004..1de132f3 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -320,6 +320,9 @@ void CHyprRenderer::renderAllClientsForMonitor(const int& ID, timespec* time) { renderLayer(ls.get(), PMONITOR, time); } + // pre window pass + g_pHyprOpenGL->preWindowPass(); + // if there is a fullscreen window, render it and then do not render anymore. // fullscreen window will hide other windows and top layers const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace);