diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index 88fdd7bd..1f40845c 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -77,3 +77,60 @@ TEST_F(ProgramTest, CompileSimpleFragmentShader) { FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; } } + +const char* vs_uniform = R"(#version 150 + +in vec3 Position; +in vec2 UV; +in vec4 Color; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +out vec2 texCoord; +out vec4 vertexColor; + +void main() { + mat4 mat = ProjMat * ModelViewMat; + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + + texCoord = UV; + vertexColor = Color; +})"; + + + +TEST_F(ProgramTest, ExtractPlainUniform) { + using namespace MG_Util::ShaderTranspiler; + ShaderAttrib attrib { + .shaderType = GL_VERTEX_SHADER, + .sourceStr = vs_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(), 2); + + auto ProjMat_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform& uniform) { + return uniform.name == "ProjMat"; + }); + ASSERT_TRUE(ProjMat_uniform_it != uniforms.end()); + ASSERT_EQ(ProjMat_uniform_it->storageQualifier, glslang::EvqUniform); + + auto ModelViewMat_uniform_it = std::find_if(uniforms.begin(), uniforms.end(), [] (TUniform& uniform) { + return uniform.name == "ModelViewMat"; + }); + ASSERT_TRUE(ModelViewMat_uniform_it != uniforms.end()); + ASSERT_EQ(ModelViewMat_uniform_it->storageQualifier, glslang::EvqUniform); + } else { + ASSERT_NE(res.error().errc, 0); + FAIL() << "errc: " << res.error().errc << "\nlog: " << res.error().log; + } +} diff --git a/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp b/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp index 0146ca4e..e2802365 100644 --- a/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp +++ b/MobileGL/MG_Util/ShaderTranspiler/glslang/UniformTraverser.cpp @@ -8,9 +8,16 @@ namespace MobileGL { namespace MG_Util { namespace ShaderTranspiler { void UniformTraverser::visitSymbol(glslang::TIntermSymbol *symbol) { + auto parent = getParentNode(); + if (!parent) + return; + auto parentAgg = parent->getAsAggregate(); + if (!parentAgg || parentAgg->getOp() != glslang::EOpLinkerObjects) + return; + const auto &type = symbol->getType(); if (symbol->getQualifier().isUniform()) { - auto name = symbol->getName(); + auto& name = symbol->getName(); auto qualifier = symbol->getQualifier(); auto &uniform = uniforms.emplace_back();