From 5102ef8a3111e2630fdc7ee0ce180aa2943c63b5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 10 Jan 2023 22:12:18 -0800 Subject: [PATCH] GLES: Delete LinkedShaders after the program. The program references the shader, so we have to delete in this order. Caused problems on useFlag change as well as probably DeviceLost. --- Common/GPU/OpenGL/GLRenderManager.h | 12 ++++++++++++ GPU/GLES/ShaderManagerGLES.cpp | 13 +++++++++++-- GPU/GLES/ShaderManagerGLES.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Common/GPU/OpenGL/GLRenderManager.h b/Common/GPU/OpenGL/GLRenderManager.h index e2d132726f..2a7c290f37 100644 --- a/Common/GPU/OpenGL/GLRenderManager.h +++ b/Common/GPU/OpenGL/GLRenderManager.h @@ -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 uniformCache_; }; diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 8a728d7db4..783d4c83b9 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -210,8 +210,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 @@ -685,7 +694,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; diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 6520b1e4ad..5180663877 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -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_;