| 29 | using LiveTraverserTest = GlslangTest<::testing::TestWithParam<LiveTraverserTestParams>>; |
| 30 | |
| 31 | TEST_P(LiveTraverserTest, FromFile) |
| 32 | { |
| 33 | const auto& fileName = GetParam().fileName; |
| 34 | const auto& expectedLiveVars = GetParam().liveVars; |
| 35 | const EShMessages controls = DeriveOptions(Source::GLSL, Semantics::Vulkan, Target::AST); |
| 36 | GlslangResult result; |
| 37 | result.validationResult = true; |
| 38 | |
| 39 | std::string contents; |
| 40 | tryLoadFile(GlobalTestSettings.testRoot + "/" + fileName, "input", &contents); |
| 41 | std::unique_ptr<glslang::TShader> shader = std::make_unique<glslang::TShader>(GetShaderStage(GetSuffix(fileName))); |
| 42 | |
| 43 | bool success = compile(shader.get(), contents, "", controls); |
| 44 | result.shaderResults.push_back({fileName, shader->getInfoLog(), shader->getInfoDebugLog()}); |
| 45 | |
| 46 | std::ostringstream stream; |
| 47 | outputResultToStream(&stream, result, controls); |
| 48 | |
| 49 | class TLiveSymbolTraverser : public glslang::TLiveTraverser { |
| 50 | public: |
| 51 | TLiveSymbolTraverser(const glslang::TIntermediate& i, std::vector<std::string>& liveVars) |
| 52 | : glslang::TLiveTraverser(i), liveVars(liveVars) |
| 53 | { |
| 54 | } |
| 55 | |
| 56 | virtual void visitSymbol(glslang::TIntermSymbol* symbol) |
| 57 | { |
| 58 | if (symbol->getAsSymbolNode()->getAccessName().compare(0, 3, "gl_") == 0) |
| 59 | return; |
| 60 | |
| 61 | if (symbol->getQualifier().storage == glslang::TStorageQualifier::EvqVaryingIn || |
| 62 | symbol->getQualifier().storage == glslang::TStorageQualifier::EvqVaryingOut || |
| 63 | symbol->getQualifier().storage == glslang::TStorageQualifier::EvqUniform || |
| 64 | symbol->getQualifier().storage == glslang::TStorageQualifier::EvqBuffer) { |
| 65 | liveVars.push_back(symbol->getAccessName().c_str()); |
| 66 | } |
| 67 | } |
| 68 | |
| 69 | private: |
| 70 | std::vector<std::string>& liveVars; |
| 71 | }; |
| 72 | |
| 73 | if (success) { |
| 74 | std::vector<std::string> actualLiveVars; |
| 75 | TLiveSymbolTraverser liveTraverser(*shader->getIntermediate(), actualLiveVars); |
| 76 | liveTraverser.pushFunction(shader->getIntermediate()->getEntryPointMangledName().c_str()); |
| 77 | while (!liveTraverser.destinations.empty()) { |
| 78 | TIntermNode* destination = liveTraverser.destinations.back(); |
| 79 | liveTraverser.destinations.pop_back(); |
| 80 | destination->traverse(&liveTraverser); |
| 81 | } |
| 82 | |
| 83 | for (const auto& expectedVar : expectedLiveVars) { |
| 84 | auto it = std::find(actualLiveVars.begin(), actualLiveVars.end(), expectedVar); |
| 85 | EXPECT_NE(it, actualLiveVars.end()); |
| 86 | if (it != actualLiveVars.end()) |
| 87 | actualLiveVars.erase(it); |
| 88 | } |
nothing calls this directly
no test coverage detected