vk: Avoid constantly reinitializing the SH context when compiling SPIRV. Speedup

This commit is contained in:
kd-11 2017-06-15 02:33:50 +03:00
parent 5f180e0b30
commit 6013b0782e
3 changed files with 21 additions and 6 deletions

View File

@ -6,6 +6,8 @@
namespace vk namespace vk
{ {
static TBuiltInResource g_default_config;
std::string getFloatTypeNameImpl(size_t elementCount) std::string getFloatTypeNameImpl(size_t elementCount)
{ {
switch (elementCount) switch (elementCount)
@ -273,20 +275,16 @@ namespace vk
{ {
EShLanguage lang = (domain == glsl::glsl_fragment_program) ? EShLangFragment : EShLangVertex; EShLanguage lang = (domain == glsl::glsl_fragment_program) ? EShLangFragment : EShLangVertex;
glslang::InitializeProcess();
glslang::TProgram program; glslang::TProgram program;
glslang::TShader shader_object(lang); glslang::TShader shader_object(lang);
bool success = false; bool success = false;
const char *shader_text = shader.data(); const char *shader_text = shader.data();
TBuiltInResource rsc;
init_default_resources(rsc);
shader_object.setStrings(&shader_text, 1); shader_object.setStrings(&shader_text, 1);
EShMessages msg = (EShMessages)(EShMsgVulkanRules | EShMsgSpvRules); EShMessages msg = (EShMessages)(EShMsgVulkanRules | EShMsgSpvRules);
if (shader_object.parse(&rsc, 400, EProfile::ECoreProfile, false, true, msg)) if (shader_object.parse(&g_default_config, 400, EProfile::ECoreProfile, false, true, msg))
{ {
program.addShader(&shader_object); program.addShader(&shader_object);
success = program.link(EShMsgVulkanRules); success = program.link(EShMsgVulkanRules);
@ -302,7 +300,17 @@ namespace vk
LOG_ERROR(RSX, "%s", shader_object.getInfoDebugLog()); LOG_ERROR(RSX, "%s", shader_object.getInfoDebugLog());
} }
glslang::FinalizeProcess();
return success; return success;
} }
void initialize_compiler_context()
{
glslang::InitializeProcess();
init_default_resources(g_default_config);
}
void finalize_compiler_context()
{
glslang::FinalizeProcess();
}
} }

View File

@ -17,4 +17,7 @@ namespace vk
const varying_register_t& get_varying_register(const std::string& name); const varying_register_t& get_varying_register(const std::string& name);
bool compile_glsl_to_spv(std::string& shader, glsl::program_domain domain, std::vector<u32> &spv); bool compile_glsl_to_spv(std::string& shader, glsl::program_domain domain, std::vector<u32> &spv);
void initialize_compiler_context();
void finalize_compiler_context();
} }

View File

@ -6,6 +6,7 @@
#include "../rsx_utils.h" #include "../rsx_utils.h"
#include "../Common/BufferUtils.h" #include "../Common/BufferUtils.h"
#include "VKFormats.h" #include "VKFormats.h"
#include "VKCommonDecompiler.h"
namespace namespace
{ {
@ -1019,11 +1020,14 @@ void VKGSRender::on_init_thread()
GSRender::on_init_thread(); GSRender::on_init_thread();
rsx_thread = std::this_thread::get_id(); rsx_thread = std::this_thread::get_id();
vk::initialize_compiler_context();
} }
void VKGSRender::on_exit() void VKGSRender::on_exit()
{ {
m_texture_cache.destroy(); m_texture_cache.destroy();
vk::finalize_compiler_context();
return GSRender::on_exit(); return GSRender::on_exit();
} }