Merge pull request #16782 from unknownbrackets/gl-shader-del

GLES: Delete LinkedShaders after the program
This commit is contained in:
Henrik Rydgård authored and GitHub committed 2023-01-11 09:07:30 +01:00
commit 289206fee0
3 files changed
+24 -2

No files matched your search

+12
View File
@@ -110,6 +110,9 @@ public:
class GLRProgram {
public:
~GLRProgram() {
if (deleteCallback_) {
deleteCallback_(deleteParam_);
}
if (program) {
glDeleteProgram(program);
}
@@ -162,6 +165,15 @@ public:
return loc;
}
void SetDeleteCallback(void(*cb)(void *), void *p) {
deleteCallback_ = cb;
deleteParam_ = p;
}
private:
void(*deleteCallback_)(void *) = nullptr;
void *deleteParam_ = nullptr;
std::unordered_map<std::string, UniformInfo> uniformCache_;
};
+11 -2
View File
@@ -212,8 +212,17 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs,
dirtyUniforms = DIRTY_ALL_UNIFORMS;
}
LinkedShader::~LinkedShader() {
void LinkedShader::Delete() {
program->SetDeleteCallback([](void *thiz) {
LinkedShader *ls = (LinkedShader *)thiz;
delete ls;
}, this);
render_->DeleteProgram(program);
program = nullptr;
}
LinkedShader::~LinkedShader() {
_assert_(program == nullptr);
}
// Utility
@@ -691,7 +700,7 @@ ShaderManagerGLES::~ShaderManagerGLES() {
void ShaderManagerGLES::Clear() {
DirtyLastShader();
for (auto iter = linkedShaderCache_.begin(); iter != linkedShaderCache_.end(); ++iter) {
delete iter->ls;
iter->ls->Delete();
}
fsCache_.Iterate([&](const FShaderID &key, Shader *shader) {
delete shader;
+1
View File
@@ -42,6 +42,7 @@ public:
void use(const ShaderID &VSID);
void UpdateUniforms(const ShaderID &VSID, bool useBufferedRendering, const ShaderLanguageDesc &shaderLanguage);
void Delete();
GLRenderManager *render_;
Shader *vs_;