Fix segfault if allocatedPrograms vector is deleted before shutdown

This commit is contained in:
baldurk
2019-02-18 20:43:00 +00:00
parent 2ae5be5328
commit d1e0d7f88f
2 changed files with 16 additions and 10 deletions
@@ -34,8 +34,8 @@
#include "3rdparty/glslang/glslang/Public/ShaderLang.h"
static bool inited = false;
std::vector<glslang::TShader *> allocatedShaders;
std::vector<glslang::TProgram *> allocatedPrograms;
std::vector<glslang::TShader *> *allocatedShaders = NULL;
std::vector<glslang::TProgram *> *allocatedPrograms = NULL;
void InitSPIRVCompiler()
{
@@ -43,6 +43,9 @@ void InitSPIRVCompiler()
{
glslang::InitializeProcess();
inited = true;
allocatedPrograms = new std::vector<glslang::TProgram *>;
allocatedShaders = new std::vector<glslang::TShader *>;
}
}
@@ -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();
}
@@ -222,8 +222,8 @@ string CompileSPIRV(const SPIRVCompilationSettings &settings,
return errors;
}
extern std::vector<glslang::TShader *> allocatedShaders;
extern std::vector<glslang::TProgram *> allocatedPrograms;
extern std::vector<glslang::TShader *> *allocatedShaders;
extern std::vector<glslang::TProgram *> *allocatedPrograms;
glslang::TShader *CompileShaderForReflection(SPIRVShaderStage stage,
const std::vector<std::string> &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::vector<glslang::TShader *
program->buildReflection(EShReflectionStrictArraySuffix | EShReflectionBasicArraySuffix |
EShReflectionIntermediateIO | EShReflectionSeparateBuffers |
EShReflectionAllBlockVariables | EShReflectionUnwrapIOBlocks);
allocatedPrograms.push_back(program);
allocatedPrograms->push_back(program);
return program;
}
else