1 // 2 // Copyright 2016 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 #include "compiler/translator/tree_ops/RemoveInvariantDeclaration.h" 8 9 #include "compiler/translator/tree_util/IntermTraverse.h" 10 11 namespace sh 12 { 13 14 namespace 15 { 16 17 // An AST traverser that removes invariant declaration for input in fragment shader 18 // when GLSL >= 4.20 and for output in vertex shader when GLSL < 4.2. 19 class RemoveInvariantDeclarationTraverser : public TIntermTraverser 20 { 21 public: RemoveInvariantDeclarationTraverser()22 RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {} 23 24 private: visitGlobalQualifierDeclaration(Visit visit,TIntermGlobalQualifierDeclaration * node)25 bool visitGlobalQualifierDeclaration(Visit visit, 26 TIntermGlobalQualifierDeclaration *node) override 27 { 28 if (node->isInvariant()) 29 { 30 TIntermSequence emptyReplacement; 31 mMultiReplacements.emplace_back(getParentNode()->getAsBlock(), node, 32 std::move(emptyReplacement)); 33 } 34 return false; 35 } 36 }; 37 38 } // anonymous namespace 39 RemoveInvariantDeclaration(TCompiler * compiler,TIntermNode * root)40bool RemoveInvariantDeclaration(TCompiler *compiler, TIntermNode *root) 41 { 42 RemoveInvariantDeclarationTraverser traverser; 43 root->traverse(&traverser); 44 return traverser.updateTree(compiler, root); 45 } 46 47 } // namespace sh 48