From 5ee74b5a6ad4a71153966dd19f250f9dfdbff974 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Sat, 18 Apr 2026 18:38:12 +0200 Subject: [PATCH] GL: clean up shader object after compilation On Linux/mesa, when compiling a big shader cache like BOTW this saves about 8.2 GiB of RAM usage (only when ~/.cache/mesa_shader_cache and precompiled/_gl.bin cache is also fresh) --- .../Latte/Renderer/OpenGL/RendererShaderGL.cpp | 18 ++++++++++++------ .../Latte/Renderer/OpenGL/RendererShaderGL.h | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp index 4d7fe2b9..eedb472a 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.cpp @@ -146,6 +146,14 @@ RendererShaderGL::RendererShaderGL(ShaderType type, uint64 baseHash, uint64 auxH } RendererShaderGL::~RendererShaderGL() +{ + CleanupShaderObj(); + + if (m_program != 0) + glDeleteProgram(m_program); +} + +void RendererShaderGL::CleanupShaderObj() { if (m_shader_object != 0 && m_shader_attached) glDetachShader(m_program, m_shader_object); @@ -153,8 +161,7 @@ RendererShaderGL::~RendererShaderGL() if (m_shader_object != 0) glDeleteShader(m_shader_object); - if (m_program != 0) - glDeleteProgram(m_program); + m_shader_object = 0; } void RendererShaderGL::PreponeCompilation(bool isRenderThread) @@ -192,9 +199,8 @@ bool RendererShaderGL::WaitForCompiled() cemuLog_log(LogType::Force, "Compile error in shader. Log:"); cemuLog_log(LogType::Force, infoLog); } - if (m_shader_object != 0) - glDeleteShader(m_shader_object); m_isCompiled = true; + CleanupShaderObj(); return false; } // get shader binary @@ -213,12 +219,12 @@ bool RendererShaderGL::WaitForCompiled() cemuLog_log(LogType::Force, infoLog); } m_isCompiled = true; + CleanupShaderObj(); return false; } - /*glDetachShader(m_program, m_shader_object); - m_shader_attached = false;*/ m_isCompiled = true; + CleanupShaderObj(); return true; } diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h index 1e8784ff..93f13b00 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/RendererShaderGL.h @@ -10,6 +10,7 @@ public: virtual ~RendererShaderGL(); + void CleanupShaderObj(); void PreponeCompilation(bool isRenderThread) override; bool IsCompiled() override; bool WaitForCompiled() override;