mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 05:38:31 +09:00
[Fix] (MG_Util/ShaderCompiler): make glslang don't emit demote to replace discard
This commit is contained in:
@@ -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<SpvcSession> 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) {
|
TEST_F(ProgramTest, CompileAndLinkProgram) {
|
||||||
using namespace MG_Util::ShaderTranspiler;
|
using namespace MG_Util::ShaderTranspiler;
|
||||||
ShaderAttrib vs_attrib {
|
ShaderAttrib vs_attrib {
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ namespace MobileGL {
|
|||||||
tshader->setInvertY(true);
|
tshader->setInvertY(true);
|
||||||
tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450);
|
tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450);
|
||||||
tshader->setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_3);
|
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->setAutoMapLocations(true);
|
||||||
tshader->setAutoMapBindings(true);
|
tshader->setAutoMapBindings(true);
|
||||||
tshader->setEnvInputVulkanRulesRelaxed(); // using EXT_vulkan_glsl_relaxed for gl_VertexID and gl_InstanceID?
|
tshader->setEnvInputVulkanRulesRelaxed(); // using EXT_vulkan_glsl_relaxed for gl_VertexID and gl_InstanceID?
|
||||||
|
|||||||
@@ -79,6 +79,8 @@ namespace ShaderTranspiler {
|
|||||||
return spvc_compiler_compile(compiler, result);
|
return spvc_compiler_compile(compiler, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const char* SpvcSession::GetLastErrorString() const {
|
const char* SpvcSession::GetLastErrorString() const {
|
||||||
return spvc_context_get_last_error_string(context);
|
return spvc_context_get_last_error_string(context);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user