From ff598b0827ca179c57ff2e97806cd65b69374699 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Thu, 20 Jul 2023 18:03:47 +0200 Subject: [PATCH] renderer: don't occlude when pre-blur is queued --- src/render/OpenGL.cpp | 12 ++++++++---- src/render/OpenGL.hpp | 1 + src/render/Renderer.cpp | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 6b72e820e..fe028f080 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -945,16 +945,20 @@ void CHyprOpenGLImpl::preBlurForCurrentMonitor() { } void CHyprOpenGLImpl::preWindowPass() { - static auto* const PBLURNEWOPTIMIZE = &g_pConfigManager->getConfigValuePtr("decoration:blur_new_optimizations")->intValue; - static auto* const PBLUR = &g_pConfigManager->getConfigValuePtr("decoration:blur")->intValue; - - if (!m_RenderData.pCurrentMonData->blurFBDirty || !*PBLURNEWOPTIMIZE || !*PBLUR || !m_RenderData.pCurrentMonData->blurFBShouldRender) + if (!preBlurQueued()) return; // blur the main FB, it will be rendered onto the mirror preBlurForCurrentMonitor(); } +bool CHyprOpenGLImpl::preBlurQueued() { + static auto* const PBLURNEWOPTIMIZE = &g_pConfigManager->getConfigValuePtr("decoration:blur_new_optimizations")->intValue; + static auto* const PBLUR = &g_pConfigManager->getConfigValuePtr("decoration:blur")->intValue; + + return !(!m_RenderData.pCurrentMonData->blurFBDirty || !*PBLURNEWOPTIMIZE || !*PBLUR || !m_RenderData.pCurrentMonData->blurFBShouldRender); +} + void CHyprOpenGLImpl::renderTextureWithBlur(const CTexture& tex, wlr_box* pBox, float a, wlr_surface* pSurface, int round, bool blockBlurOptimization) { RASSERT(m_RenderData.pMonitor, "Tried to render texture with blur without begin()!"); diff --git a/src/render/OpenGL.hpp b/src/render/OpenGL.hpp index 8e834eeb9..c2d3a7081 100644 --- a/src/render/OpenGL.hpp +++ b/src/render/OpenGL.hpp @@ -132,6 +132,7 @@ class CHyprOpenGLImpl { void markBlurDirtyForMonitor(CMonitor*); void preWindowPass(); + bool preBlurQueued(); void preRender(CMonitor*); void saveBufferForMirror(); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 4514a3d44..dcb6c123f 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -480,7 +480,8 @@ void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace* if (!pWorkspace->m_bHasFullscreenWindow || pWorkspace->m_efFullscreenMode != FULLSCREEN_FULL || !PFULLWINDOW || PFULLWINDOW->m_vRealSize.isBeingAnimated() || !PFULLWINDOW->opaque() || pWorkspace->m_vRenderOffset.vec() != Vector2D{}) { - setOccludedForBackLayers(g_pHyprOpenGL->m_RenderData.damage, pWorkspace); + if (!g_pHyprOpenGL->preBlurQueued()) + setOccludedForBackLayers(g_pHyprOpenGL->m_RenderData.damage, pWorkspace); for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]) { renderLayer(ls.get(), pMonitor, time);