diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index 1f40845c..46d66843 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -117,6 +117,7 @@ TEST_F(ProgramTest, ExtractPlainUniform) { root->traverse(&traverser); ASSERT_EQ(uniforms.size(), 2); + ASSERT_EQ(samplers.size(), 0); auto ProjMat_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform& uniform) { return uniform.name == "ProjMat"; @@ -134,3 +135,59 @@ TEST_F(ProgramTest, ExtractPlainUniform) { FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; } } + +const char* fs_uniform = R"(#version 150 + +uniform sampler2D DiffuseSampler; + +uniform vec4 ColorModulator; + +in vec2 texCoord; +in vec4 vertexColor; + +out vec4 fragColor; + +void main() { + vec4 color = texture(DiffuseSampler, texCoord) * vertexColor; + + // blit final output of compositor into displayed back buffer + fragColor = color * ColorModulator; +})"; + +TEST_F(ProgramTest, ExtractSampler) { + using namespace MG_Util::ShaderTranspiler; + ShaderAttrib attrib { + .shaderType = GL_FRAGMENT_SHADER, + .sourceStr = fs_uniform + }; + + Vector> uniforms; + Vector> samplers; + + auto res = ShaderCompiler::CompileShader(attrib); + if (res) { + UniformTraverser traverser(uniforms, samplers); + auto root = res->TShader->getIntermediate()->getTreeRoot(); + root->traverse(&traverser); + + ASSERT_EQ(uniforms.size(), 1); + ASSERT_EQ(samplers.size(), 1); + + auto ColorModulator_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform& uniform) { + return uniform.name == "ColorModulator"; + }); + ASSERT_TRUE(ColorModulator_uniform_it != uniforms.end()); + ASSERT_EQ(ColorModulator_uniform_it->storageQualifier, glslang::EvqUniform); + + auto DiffuseSampler_uniform_it = std::find_if(samplers.begin(), samplers.end(), [] (TUniform& uniform) { + return uniform.name == "DiffuseSampler"; + }); + ASSERT_TRUE(DiffuseSampler_uniform_it != samplers.end()); + auto& sampler = DiffuseSampler_uniform_it->sampler; + ASSERT_EQ(sampler.type, glslang::EbtFloat); + ASSERT_EQ(sampler.dim, glslang::Esd2D); + } else { + ASSERT_NE(res.error().errc, 0); + FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; + } +} \ No newline at end of file diff --git a/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp b/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp index e2802365..d5d122a8 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp @@ -16,7 +16,11 @@ namespace ShaderTranspiler { return; const auto &type = symbol->getType(); - if (symbol->getQualifier().isUniform()) { + if (type.getBasicType() == glslang::EbtSampler) { + auto &uniform = samplers.emplace_back(); + uniform.name = symbol->getName(); + uniform.sampler = type.getSampler(); + } else if (symbol->getQualifier().isUniform()) { auto& name = symbol->getName(); auto qualifier = symbol->getQualifier(); @@ -26,11 +30,26 @@ namespace ShaderTranspiler { uniform.layoutLocation = qualifier.layoutLocation; uniform.layoutBinding = qualifier.layoutBinding; uniform.layoutPacking = qualifier.layoutPacking; - } else if (type.getBasicType() == glslang::EbtSampler) { - auto &uniform = samplers.emplace_back(); - uniform.name = symbol->getName(); - uniform.sampler = type.getSampler(); } + // if (symbol->getQualifier().isUniformOrBuffer()) { + // auto name = symbol->getName(); + // auto qualifier = symbol->getQualifier(); + // + // fprintf(stderr, "%s: %s\n", name.c_str(), + // glslang::GetStorageQualifierString(qualifier.storage)); + // + // if (qualifier.hasLocation()) { + // fprintf(stderr, " loc: %d\n", qualifier.layoutLocation); + // } + // if (qualifier.hasBinding()) { + // fprintf(stderr, " binding: %d\n", qualifier.layoutBinding); + // } + // if (qualifier.hasPacking()) { + // fprintf(stderr, " packing: %s\n", + // glslang::TQualifier::getLayoutPackingString( + // qualifier.layoutPacking)); + // } + // } } } }