From d1e0d7f88f5277470609c8fb6ead17540d18d67c Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 18 Feb 2019 20:41:58 +0000 Subject: [PATCH] Fix segfault if allocatedPrograms vector is deleted before shutdown --- .../driver/shaders/spirv/spirv_common.cpp | 18 ++++++++++++------ .../driver/shaders/spirv/spirv_compile.cpp | 8 ++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_common.cpp b/renderdoc/driver/shaders/spirv/spirv_common.cpp index e5cfdb19a..ef118482a 100644 --- a/renderdoc/driver/shaders/spirv/spirv_common.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_common.cpp @@ -34,8 +34,8 @@ #include "3rdparty/glslang/glslang/Public/ShaderLang.h" static bool inited = false; -std::vector allocatedShaders; -std::vector allocatedPrograms; +std::vector *allocatedShaders = NULL; +std::vector *allocatedPrograms = NULL; void InitSPIRVCompiler() { @@ -43,6 +43,9 @@ void InitSPIRVCompiler() { glslang::InitializeProcess(); inited = true; + + allocatedPrograms = new std::vector; + allocatedShaders = new std::vector; } } @@ -51,14 +54,17 @@ void ShutdownSPIRVCompiler() if(inited) { // programs must be deleted before shaders - for(glslang::TProgram *program : allocatedPrograms) + for(glslang::TProgram *program : *allocatedPrograms) delete program; - for(glslang::TShader *shader : allocatedShaders) + for(glslang::TShader *shader : *allocatedShaders) delete shader; - allocatedPrograms.clear(); - allocatedShaders.clear(); + allocatedPrograms->clear(); + allocatedShaders->clear(); + + SAFE_DELETE(allocatedPrograms); + SAFE_DELETE(allocatedShaders); glslang::FinalizeProcess(); } diff --git a/renderdoc/driver/shaders/spirv/spirv_compile.cpp b/renderdoc/driver/shaders/spirv/spirv_compile.cpp index a0310255b..e71c2543d 100644 --- a/renderdoc/driver/shaders/spirv/spirv_compile.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_compile.cpp @@ -222,8 +222,8 @@ string CompileSPIRV(const SPIRVCompilationSettings &settings, return errors; } -extern std::vector allocatedShaders; -extern std::vector allocatedPrograms; +extern std::vector *allocatedShaders; +extern std::vector *allocatedPrograms; glslang::TShader *CompileShaderForReflection(SPIRVShaderStage stage, const std::vector &sources) @@ -241,7 +241,7 @@ glslang::TShader *CompileShaderForReflection(SPIRVShaderStage stage, if(shader->parse(&DefaultResources, 100, false, EShMsgRelaxedErrors)) { - allocatedShaders.push_back(shader); + allocatedShaders->push_back(shader); return shader; } else @@ -267,7 +267,7 @@ glslang::TProgram *LinkProgramForReflection(const std::vectorbuildReflection(EShReflectionStrictArraySuffix | EShReflectionBasicArraySuffix | EShReflectionIntermediateIO | EShReflectionSeparateBuffers | EShReflectionAllBlockVariables | EShReflectionUnwrapIOBlocks); - allocatedPrograms.push_back(program); + allocatedPrograms->push_back(program); return program; } else