From 9d8aaf77ac2e43c29c4f9f8ef633b8b0e78bd1ea Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 8 Sep 2015 19:40:47 +1000 Subject: Fix T45981: BGE, 2D filters leak memory --- .../gameengine/Rasterizer/RAS_2DFilterManager.cpp | 37 ++++++++++++++++------ 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp index f1ce8356e20..cedc27c3b92 100644 --- a/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp +++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.cpp @@ -75,6 +75,12 @@ texturewidth(-1), textureheight(-1), RAS_2DFilterManager::~RAS_2DFilterManager() { FreeTextures(); + + for (int passindex = 0; passindex < MAX_RENDER_PASS; passindex++) { + if (m_filters[passindex]) { + glDeleteObjectARB(m_filters[passindex]); + } + } } void RAS_2DFilterManager::PrintShaderErrors(unsigned int shader, const char *task, const char *code) @@ -119,11 +125,10 @@ unsigned int RAS_2DFilterManager::CreateShaderProgram(const char* shadersource) glGetObjectParameterivARB(fShader, GL_COMPILE_STATUS, &success); - if (!success) - { + if (!success) { /*Shader Comile Error*/ PrintShaderErrors(fShader, "compile", shadersource); - return 0; + goto fail; } program = glCreateProgramObjectARB(); @@ -131,23 +136,37 @@ unsigned int RAS_2DFilterManager::CreateShaderProgram(const char* shadersource) glLinkProgramARB(program); glGetObjectParameterivARB(program, GL_LINK_STATUS, &success); - if (!success) - { + if (!success) { /*Program Link Error*/ PrintShaderErrors(fShader, "link", shadersource); - return 0; + goto fail; } glValidateProgramARB(program); glGetObjectParameterivARB(program, GL_VALIDATE_STATUS, &success); - if (!success) - { + if (!success) { /*Program Validation Error*/ PrintShaderErrors(fShader, "validate", shadersource); - return 0; + goto fail; + } + + /* owned by 'program' */ + if (fShader) { + glDeleteObjectARB(fShader); } return program; + + +fail: + if (fShader) { + glDeleteObjectARB(fShader); + } + + if (program) { + glDeleteObjectARB(program); + } + return 0; } unsigned int RAS_2DFilterManager::CreateShaderProgram(int filtermode) -- cgit v1.2.3