diff --git a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp index 2e32e564..28d603f6 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp @@ -198,43 +198,29 @@ namespace MobileGL { } Result ShaderCompiler::DecompileShader(Vector spirv) { - spvc_context context = nullptr; - spvc_parsed_ir ir = nullptr; - spvc_compiler compiler_glsl = nullptr; - spvc_compiler_options options = nullptr; - spvc_resources resources = nullptr; - const spvc_reflected_resource *list = nullptr; - const char *result = nullptr; - size_t count; - - const SpvId *p_spirv = spirv.data(); - size_t word_count = spirv.size(); - - spvc_context_create(&context); - spvc_context_parse_spirv(context, p_spirv, word_count, &ir); - spvc_context_create_compiler(context, SPVC_BACKEND_GLSL, ir, SPVC_CAPTURE_MODE_TAKE_OWNERSHIP, &compiler_glsl); - spvc_compiler_create_shader_resources(compiler_glsl, &resources); - spvc_resources_get_resource_list_for_type(resources, SPVC_RESOURCE_TYPE_UNIFORM_BUFFER, &list, &count); - spvc_compiler_create_compiler_options(compiler_glsl, &options); + SpvcSession session(spirv); + spvc_compiler_options options; + session.CreateOptions(&options); spvc_compiler_options_set_uint(options, SPVC_COMPILER_OPTION_GLSL_VERSION, 450); spvc_compiler_options_set_bool(options, SPVC_COMPILER_OPTION_GLSL_ES, SPVC_FALSE); spvc_compiler_options_set_bool(options, SPVC_COMPILER_OPTION_GLSL_VULKAN_SEMANTICS, SPVC_TRUE); - spvc_compiler_install_compiler_options(compiler_glsl, options); - spvc_compiler_compile(compiler_glsl, &result); + + session.SetOptions(options); + + const char *result = nullptr; + session.Compile(&result); if (!result) { ResultInfo r; r.log += "Failed to compile the shader to GLSL: \n"; - r.log += spvc_context_get_last_error_string(context); + r.log += session.GetLastErrorString(); r.errc = -5; return std::unexpected(r); } std::string glsl = result; - spvc_context_destroy(context); - return glsl; } } diff --git a/MobileGL/MG_Util/ShaderTranspiler/Types.h b/MobileGL/MG_Util/ShaderTranspiler/Types.h index fd119f68..6a35e93f 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/Types.h +++ b/MobileGL/MG_Util/ShaderTranspiler/Types.h @@ -28,6 +28,41 @@ namespace MobileGL { template using Result = std::expected; + struct SpvcSession { + SpvcSession(Vector spirv) { + const SpvId *p_spirv = spirv.data(); + size_t word_count = spirv.size(); + + spvc_context_create(&context); + spvc_context_parse_spirv(context, p_spirv, word_count, &ir); + spvc_context_create_compiler(context, SPVC_BACKEND_GLSL, ir, SPVC_CAPTURE_MODE_TAKE_OWNERSHIP, &compiler); + } + + spvc_result CreateOptions(spvc_compiler_options *options) { + return spvc_compiler_create_compiler_options(compiler, options); + } + + spvc_result SetOptions(spvc_compiler_options options) { + compiler_options = options; + return spvc_compiler_install_compiler_options(compiler, options); + } + + spvc_result Compile(const char** result) { + return spvc_compiler_compile(compiler, result); + } + + const char* GetLastErrorString() { + return spvc_context_get_last_error_string(context); + } + + ~SpvcSession() { spvc_context_destroy(context); } + private: + spvc_context context = nullptr; + spvc_parsed_ir ir = nullptr; + spvc_compiler compiler = nullptr; + spvc_compiler_options compiler_options = nullptr; + }; + inline static EShLanguage GetEShLanguageByShaderType(GLenum shaderType) { switch (shaderType) { case GL_VERTEX_SHADER: