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)
This commit is contained in:
goeiecool9999 2026-04-18 18:38:12 +02:00
parent b2c34fb1df
commit 5ee74b5a6a
2 changed files with 13 additions and 6 deletions

View File

@ -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;
}

View File

@ -10,6 +10,7 @@ public:
virtual ~RendererShaderGL();
void CleanupShaderObj();
void PreponeCompilation(bool isRenderThread) override;
bool IsCompiled() override;
bool WaitForCompiled() override;