diff options
| author | matjam <chrome@stupendous.net> | 2026-03-09 15:05:58 -0700 |
|---|---|---|
| committer | Vaxry <43317083+vaxerski@users.noreply.github.com> | 2026-03-10 10:06:24 +0000 |
| commit | 53899907245dad27e8b78b3c35a62fb1669e6096 (patch) | |
| tree | 8a7f1da88d0e5ed6e7b7fc78a9796ad5582aed8e /src/render | |
| parent | 318673e7646796d55426c90b206abbd9d8253bf3 (diff) | |
renderer: fix crash on null blur framebuffer during monitor disconnect
Guard all m_blurFB dereferences against null. The blur framebuffer is reset during monitor disconnect but layer surface snapshots use a simple render path that skips framebuffer allocation.
Diffstat (limited to 'src/render')
| -rw-r--r-- | src/render/GLRenderer.cpp | 2 | ||||
| -rw-r--r-- | src/render/OpenGL.cpp | 3 | ||||
| -rw-r--r-- | src/render/Renderer.cpp | 6 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/render/GLRenderer.cpp b/src/render/GLRenderer.cpp index c1f64837..5adb9bb8 100644 --- a/src/render/GLRenderer.cpp +++ b/src/render/GLRenderer.cpp @@ -394,6 +394,8 @@ void CHyprGLRenderer::draw(CTextureMatteElement* element, const CRegion& damage) }; SP<ITexture> CHyprGLRenderer::getBlurTexture(PHLMONITORREF pMonitor) { + if (!pMonitor->m_blurFB) + return nullptr; return pMonitor->m_blurFB->getTexture(); } diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index e9ca8baf..1c30e3ed 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1029,7 +1029,8 @@ void CHyprOpenGLImpl::renderRectWithBlurInternal(const CBox& box, const CHyprCol CRegion damage{g_pHyprRenderer->m_renderData.damage}; damage.intersect(box); - auto POUTFB = data.xray ? g_pHyprRenderer->m_renderData.pMonitor->m_blurFB->getTexture() : g_pHyprRenderer->blurMainFramebuffer(data.blurA, &damage); + auto POUTFB = data.xray ? (g_pHyprRenderer->m_renderData.pMonitor->m_blurFB ? g_pHyprRenderer->m_renderData.pMonitor->m_blurFB->getTexture() : nullptr) : + g_pHyprRenderer->blurMainFramebuffer(data.blurA, &damage); g_pHyprRenderer->m_renderData.currentFB->bind(); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 9872b83e..bf3740da 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1069,7 +1069,7 @@ void IHyprRenderer::drawTex(CTexPassElement* element, const CRegion& damage) { element->m_data.blurredBG = blurMainFramebuffer(element->m_data.a, &inverseOpaque); m_renderData.currentFB->bind(); } else - element->m_data.blurredBG = m_renderData.pMonitor->m_blurFB->getTexture(); + element->m_data.blurredBG = m_renderData.pMonitor->m_blurFB ? m_renderData.pMonitor->m_blurFB->getTexture() : nullptr; draw(element, damage); } else @@ -1667,6 +1667,8 @@ SP<ITexture> IHyprRenderer::loadAsset(const std::string& filename) { } SP<ITexture> IHyprRenderer::getBlurTexture(PHLMONITORREF pMonitor) { + if (!pMonitor->m_blurFB) + return nullptr; return pMonitor->m_blurFB->getTexture(); } @@ -2155,6 +2157,8 @@ void IHyprRenderer::preBlurForCurrentMonitor(CRegion* fakeDamage) { const auto blurredTex = blurMainFramebuffer(1, fakeDamage); // render onto blurFB + if (!m_renderData.pMonitor->m_blurFB) + return; m_renderData.pMonitor->m_blurFB->alloc(m_renderData.pMonitor->m_pixelSize.x, m_renderData.pMonitor->m_pixelSize.y, m_renderData.pMonitor->m_output->state->state().drmFormat); m_renderData.pMonitor->m_blurFB->bind(); |
