From 1911e4262baed82c3d7b7354ae52155a5839594d Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sat, 22 Apr 2023 12:36:50 +0100 Subject: [PATCH] renderer: skip rendering bottom layers on fullscreen opaque --- src/Window.cpp | 15 +++++++++++++++ src/Window.hpp | 1 + src/render/Renderer.cpp | 15 ++++++++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/Window.cpp b/src/Window.cpp index 87bf2d21..1392650b 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -668,3 +668,18 @@ void CWindow::updateGroupOutputs() { Vector2D CWindow::middle() { return m_vRealPosition.goalv() + m_vRealSize.goalv() / 2.f; } + +bool CWindow::opaque() { + if (m_bIsX11) + return !m_uSurface.xwayland->has_alpha; + + if (m_uSurface.xdg->surface->opaque) + return true; + + const auto EXTENTS = pixman_region32_extents(&m_uSurface.xdg->surface->opaque_region); + if (EXTENTS->x2 - EXTENTS->x1 >= m_uSurface.xdg->surface->current.buffer_width + && EXTENTS->y2 - EXTENTS->y1 >= m_uSurface.xdg->surface->current.buffer_height) + return true; + + return false; +} diff --git a/src/Window.hpp b/src/Window.hpp index ab71e8b8..5403a4f6 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -315,6 +315,7 @@ class CWindow { void updateDynamicRules(); SWindowDecorationExtents getFullWindowReservedArea(); Vector2D middle(); + bool opaque(); void onBorderAngleAnimEnd(void* ptr); bool isInCurvedCorner(double x, double y); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 3ec3724a..c81690bc 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -440,11 +440,16 @@ void CHyprRenderer::renderAllClientsForWorkspace(CMonitor* pMonitor, CWorkspace* g_pHyprOpenGL->m_RenderData.renderModif = RENDERMODIFDATA; // Render layer surfaces below windows for monitor - for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]) { - renderLayer(ls.get(), pMonitor, time); - } - for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]) { - renderLayer(ls.get(), pMonitor, time); + // if we have a fullscreen, opaque window that convers the screen, we can skip this. + // TODO: check better with solitary after MR for tearing. + const auto PFULLWINDOW = g_pCompositor->getFullscreenWindowOnWorkspace(pWorkspace->m_iID); + if (g_pHyprOpenGL->m_RenderData.pCurrentMonData->blurFBDirty || !pWorkspace->m_bHasFullscreenWindow || pWorkspace->m_efFullscreenMode != FULLSCREEN_FULL || !PFULLWINDOW || PFULLWINDOW->m_vRealSize.isBeingAnimated() || !PFULLWINDOW->opaque()) { + for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]) { + renderLayer(ls.get(), pMonitor, time); + } + for (auto& ls : pMonitor->m_aLayerSurfaceLayers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]) { + renderLayer(ls.get(), pMonitor, time); + } } // pre window pass