summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/render/OpenGL.cpp27
-rw-r--r--src/render/OpenGL.hpp2
-rw-r--r--src/render/Renderer.cpp3
3 files changed, 26 insertions, 6 deletions
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);