From abc2d442dd41cfd41e5c88795a4e892a6d2750dc Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 7 Oct 2022 22:19:23 +0100 Subject: [PATCH] fix a VRAM leak in destroyMonitorResources --- src/render/OpenGL.cpp | 4 ++++ src/render/Renderer.cpp | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 94bb1872..0e84fb7f 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -1287,6 +1287,8 @@ void CHyprOpenGLImpl::clearWithTex() { } void CHyprOpenGLImpl::destroyMonitorResources(CMonitor* pMonitor) { + wlr_output_attach_render(pMonitor->output, nullptr); + g_pHyprOpenGL->m_mMonitorRenderResources[pMonitor].mirrorFB.release(); g_pHyprOpenGL->m_mMonitorRenderResources[pMonitor].primaryFB.release(); g_pHyprOpenGL->m_mMonitorRenderResources[pMonitor].mirrorSwapFB.release(); @@ -1298,4 +1300,6 @@ void CHyprOpenGLImpl::destroyMonitorResources(CMonitor* pMonitor) { g_pHyprOpenGL->m_mMonitorBGTextures.erase(pMonitor); Debug::log(LOG, "Monitor %s -> destroyed all render data", pMonitor->szName.c_str()); + + wlr_output_rollback(pMonitor->output); } diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 67d8912e..52114197 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1159,9 +1159,6 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR wlr_output_enable_adaptive_sync(pMonitor->output, 0); } - // update renderer - g_pHyprOpenGL->destroyMonitorResources(pMonitor); - if (!wlr_output_commit(pMonitor->output)) { Debug::log(ERR, "Couldn't commit output named %s", pMonitor->output->name); return true; @@ -1193,6 +1190,9 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR wlr_output_enable(pMonitor->output, true); + // update renderer (here because it will call rollback, so we cannot do this before committing) + g_pHyprOpenGL->destroyMonitorResources(pMonitor); + // updato wlroots Events::listener_change(nullptr, nullptr);