diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index cf663ec3..aae50984 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -99,6 +99,69 @@ TEST_F(ProgramTest, CompileSimpleFragmentShader) { } } +const char* position_color_fsh = R"(#version 150 + +in vec4 vertexColor; + +uniform vec4 ColorModulator; + +out vec4 fragColor; + +void main() { + vec4 color = vertexColor; + if (color.a == 0.0) { + discard; + } + fragColor = color * ColorModulator; +})"; + +TEST_F(ProgramTest, CompileFragmentShaderWithDiscard) { + using namespace MG_Util::ShaderTranspiler; + ShaderAttrib attrib { + .shaderType = GL_FRAGMENT_SHADER, + .sourceStr = position_color_fsh +}; + auto res = ShaderCompiler::CompileShader(attrib); + if (!res) { + ASSERT_NE(res.error().errc, 0); + FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; + } + + ProgramAttrib programAttrib { + .shaderTypes = { GL_FRAGMENT_SHADER }, + .shaders = { res.value() } + }; + + auto program_res = ShaderCompiler::LinkProgram(programAttrib); + if (!program_res) { + ASSERT_NE(program_res.error().errc, 0); + FAIL() << "errc: " << program_res.error().errc << "\nlog: " << program_res.error().log; + } + + + auto spirvs = program_res.value(); + + Vector sessions(spirvs.size()); + for (SizeT i = 0; i < spirvs.size(); ++i) { + sessions[i] = SpvcSession(spirvs[i]); + } + + for (SizeT i = 0; i < spirvs.size(); ++i) { + std::cout << "Decompiling " << MG_Util::ConvertGLEnumToString(programAttrib.shaderTypes[i]) << std::endl; + auto src = ShaderCompiler::DecompileShader(sessions[i]); + if (!src) { + ASSERT_NE(src.error().errc, 0); + FAIL() << "errc: " << src.error().errc << "\nlog: " << src.error().log; + } else { + std::cout << src.value() << std::endl; + } + + if (src.value().find("demote") != std::string::npos) { + FAIL() << "Found unsupported demote!"; + } + } +} + TEST_F(ProgramTest, CompileAndLinkProgram) { using namespace MG_Util::ShaderTranspiler; ShaderAttrib vs_attrib { diff --git a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp index 433c5358..9d76a54c 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp @@ -133,7 +133,7 @@ namespace MobileGL { tshader->setInvertY(true); tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450); tshader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3); - tshader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_6); + tshader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); tshader->setAutoMapLocations(true); tshader->setAutoMapBindings(true); tshader->setEnvInputVulkanRulesRelaxed(); // using EXT_vulkan_glsl_relaxed for gl_VertexID and gl_InstanceID? diff --git a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp index bed5352f..cb6aff33 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp @@ -79,6 +79,8 @@ namespace ShaderTranspiler { return spvc_compiler_compile(compiler, result); } + + const char* SpvcSession::GetLastErrorString() const { return spvc_context_get_last_error_string(context); }