mirror of https://github.com/snes9xgit/snes9x.git
slang: Fix race condition to initialize glslang.
This commit is contained in:
parent
1907b9e25b
commit
d8584b9d94
|
@ -107,10 +107,11 @@ bool SlangPreset::load_preset_file(string filename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SlangShader::initialize_glslang();
|
||||||
std::vector<std::future<bool>> futures;
|
std::vector<std::future<bool>> futures;
|
||||||
for (size_t i = 0; i < passes.size(); i++)
|
for (size_t i = 0; i < passes.size(); i++)
|
||||||
{
|
{
|
||||||
futures.push_back(std::async(std::launch::async, [&, i]() -> bool {
|
futures.push_back(std::async(std::launch::async, [this, i]() -> bool {
|
||||||
return passes[i].load_file();
|
return passes[i].load_file();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,10 +181,9 @@ bool SlangShader::load_file(string new_filename)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Initializeglslang()
|
void SlangShader::initialize_glslang()
|
||||||
{
|
{
|
||||||
static bool ProcessInitialized = false;
|
static bool ProcessInitialized = false;
|
||||||
|
|
||||||
if (!ProcessInitialized)
|
if (!ProcessInitialized)
|
||||||
{
|
{
|
||||||
glslang::InitializeProcess();
|
glslang::InitializeProcess();
|
||||||
|
@ -194,7 +193,7 @@ static void Initializeglslang()
|
||||||
|
|
||||||
std::vector<uint32_t> SlangShader::generate_spirv(std::string shader_string, std::string stage)
|
std::vector<uint32_t> SlangShader::generate_spirv(std::string shader_string, std::string stage)
|
||||||
{
|
{
|
||||||
Initializeglslang();
|
initialize_glslang();
|
||||||
const EShMessages messages = (EShMessages)(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules);
|
const EShMessages messages = (EShMessages)(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules);
|
||||||
string debug;
|
string debug;
|
||||||
auto forbid_includer = glslang::TShader::ForbidIncluder();
|
auto forbid_includer = glslang::TShader::ForbidIncluder();
|
||||||
|
@ -228,7 +227,6 @@ std::vector<uint32_t> SlangShader::generate_spirv(std::string shader_string, std
|
||||||
}
|
}
|
||||||
|
|
||||||
return spirv;
|
return spirv;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -237,38 +235,12 @@ std::vector<uint32_t> SlangShader::generate_spirv(std::string shader_string, std
|
||||||
*/
|
*/
|
||||||
bool SlangShader::generate_spirv()
|
bool SlangShader::generate_spirv()
|
||||||
{
|
{
|
||||||
Initializeglslang();
|
vertex_shader_spirv = generate_spirv(vertex_shader_string, "vertex");
|
||||||
|
if (vertex_shader_spirv.empty())
|
||||||
const EShMessages messages = (EShMessages)(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules | EShMsgDebugInfo | EShMsgAST | EShMsgEnhanced);
|
return false;
|
||||||
auto forbid_includer = glslang::TShader::ForbidIncluder();
|
fragment_shader_spirv = generate_spirv(fragment_shader_string, "fragment");
|
||||||
|
if (fragment_shader_spirv.empty())
|
||||||
glslang::TShader vertexTShader(EShLangVertex);
|
|
||||||
glslang::TShader fragmentTShader(EShLangFragment);
|
|
||||||
|
|
||||||
auto compile = [&](glslang::TShader &shader, string &shader_string, std::vector<uint32_t> &spirv) -> bool {
|
|
||||||
const char *source = shader_string.c_str();
|
|
||||||
shader.setStrings(&source, 1);
|
|
||||||
if (!shader.parse(&glslang::DefaultTBuiltInResource, 450, false, messages, forbid_includer))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
glslang::TProgram program;
|
|
||||||
program.addShader(&shader);
|
|
||||||
if (!program.link(messages))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
glslang::GlslangToSpv(*program.getIntermediate(shader.getStage()), spirv);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!compile(vertexTShader, vertex_shader_string, vertex_shader_spirv))
|
|
||||||
{
|
|
||||||
printf("%s\n%s\n", vertexTShader.getInfoLog(), vertexTShader.getInfoDebugLog());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!compile(fragmentTShader, fragment_shader_string, fragment_shader_spirv))
|
|
||||||
{
|
|
||||||
printf("%s\n%s\n", fragmentTShader.getInfoLog(), fragmentTShader.getInfoDebugLog());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
|
@ -72,6 +72,7 @@ struct SlangShader
|
||||||
bool load_file(std::string new_filename = "");
|
bool load_file(std::string new_filename = "");
|
||||||
void divide_into_stages(const std::vector<std::string> &lines);
|
void divide_into_stages(const std::vector<std::string> &lines);
|
||||||
bool generate_spirv();
|
bool generate_spirv();
|
||||||
|
static void initialize_glslang();
|
||||||
static std::vector<uint32_t> generate_spirv(std::string shader_string, std::string stage);
|
static std::vector<uint32_t> generate_spirv(std::string shader_string, std::string stage);
|
||||||
|
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
Loading…
Reference in New Issue