From fe6a855bbbef1f9f38b0f2c316a920c7e75bea10 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Mon, 24 Nov 2025 23:48:18 +0000 Subject: [PATCH] renderer: stop looping over null texture surfaces (#12446) fixes #12445 --- src/render/Renderer.cpp | 48 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 0e322284..c8c44ad0 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -612,6 +612,12 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, const T renderdata.surfaceCounter = 0; pWindow->m_wlSurface->resource()->breadthfirst( [this, &renderdata, &pWindow](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s; @@ -685,6 +691,12 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, const T popup->m_wlSurface->resource()->breadthfirst( [this, &renderdata](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s; @@ -765,6 +777,12 @@ void CHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s if (!popups) pLayer->m_surface->resource()->breadthfirst( [this, &renderdata, &pLayer](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s; @@ -785,10 +803,18 @@ void CHyprRenderer::renderLayer(PHLLS pLayer, PHLMONITOR pMonitor, const Time::s if (!popup->m_wlSurface || !popup->m_wlSurface->resource() || !popup->m_mapped) return; + const auto SURF = popup->m_wlSurface->resource(); + + if (!SURF->m_current.texture) + return; + + if (SURF->m_current.size.x < 1 || SURF->m_current.size.y < 1) + return; + Vector2D pos = popup->coordsRelativeToParent(); renderdata.localPos = pos; - renderdata.texture = popup->m_wlSurface->resource()->m_current.texture; - renderdata.surface = popup->m_wlSurface->resource(); + renderdata.texture = SURF->m_current.texture; + renderdata.surface = SURF; renderdata.mainSurface = false; m_renderPass.add(makeUnique(renderdata)); renderdata.surfaceCounter++; @@ -821,6 +847,12 @@ void CHyprRenderer::renderIMEPopup(CInputPopup* pPopup, PHLMONITOR pMonitor, con SURF->breadthfirst( [this, &renderdata, &SURF](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s; @@ -842,6 +874,12 @@ void CHyprRenderer::renderSessionLockSurface(WP pSurface, P renderdata.surface->breadthfirst( [this, &renderdata, &pSurface](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s; @@ -2534,6 +2572,12 @@ void CHyprRenderer::makeSnapshot(WP popup) { popup->m_wlSurface->resource()->breadthfirst( [this, &renderdata](SP s, const Vector2D& offset, void* data) { + if (!s->m_current.texture) + return; + + if (s->m_current.size.x < 1 || s->m_current.size.y < 1) + return; + renderdata.localPos = offset; renderdata.texture = s->m_current.texture; renderdata.surface = s;