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)40 bool 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