From 6013b0782ec9b1e41dd30ec151ba10ed87c02010 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 15 Jun 2017 02:33:50 +0300 Subject: [PATCH] vk: Avoid constantly reinitializing the SH context when compiling SPIRV. Speedup --- rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp | 20 ++++++++++++++------ rpcs3/Emu/RSX/VK/VKCommonDecompiler.h | 3 +++ rpcs3/Emu/RSX/VK/VKGSRender.cpp | 4 ++++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp index acd8f7ec88..40d51be620 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp @@ -6,6 +6,8 @@ namespace vk { + static TBuiltInResource g_default_config; + std::string getFloatTypeNameImpl(size_t elementCount) { switch (elementCount) @@ -273,20 +275,16 @@ namespace vk { EShLanguage lang = (domain == glsl::glsl_fragment_program) ? EShLangFragment : EShLangVertex; - glslang::InitializeProcess(); glslang::TProgram program; glslang::TShader shader_object(lang); bool success = false; const char *shader_text = shader.data(); - - TBuiltInResource rsc; - init_default_resources(rsc); shader_object.setStrings(&shader_text, 1); 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); success = program.link(EShMsgVulkanRules); @@ -302,7 +300,17 @@ namespace vk LOG_ERROR(RSX, "%s", shader_object.getInfoDebugLog()); } - glslang::FinalizeProcess(); return success; } + + void initialize_compiler_context() + { + glslang::InitializeProcess(); + init_default_resources(g_default_config); + } + + void finalize_compiler_context() + { + glslang::FinalizeProcess(); + } } diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h index 0ca2d3158c..9202cfe5f3 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h @@ -17,4 +17,7 @@ namespace vk 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 &spv); + + void initialize_compiler_context(); + void finalize_compiler_context(); } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index fd2c038931..9565f2337a 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -6,6 +6,7 @@ #include "../rsx_utils.h" #include "../Common/BufferUtils.h" #include "VKFormats.h" +#include "VKCommonDecompiler.h" namespace { @@ -1019,11 +1020,14 @@ void VKGSRender::on_init_thread() GSRender::on_init_thread(); rsx_thread = std::this_thread::get_id(); + + vk::initialize_compiler_context(); } void VKGSRender::on_exit() { m_texture_cache.destroy(); + vk::finalize_compiler_context(); return GSRender::on_exit(); }