1//
2// Copyright (c) 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
11namespace sh
12{
13
14namespace
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.
19class RemoveInvariantDeclarationTraverser : public TIntermTraverser
20{
21 public:
22 RemoveInvariantDeclarationTraverser() : TIntermTraverser(true, false, false) {}
23
24 private:
25 bool visitInvariantDeclaration(Visit visit, TIntermInvariantDeclaration *node) override
26 {
27 TIntermSequence emptyReplacement;
28 mMultiReplacements.push_back(
29 NodeReplaceWithMultipleEntry(getParentNode()->getAsBlock(), node, emptyReplacement));
30 return false;
31 }
32};
33
34} // anonymous namespace
35
36void RemoveInvariantDeclaration(TIntermNode *root)
37{
38 RemoveInvariantDeclarationTraverser traverser;
39 root->traverse(&traverser);
40 traverser.updateTree();
41}
42
43} // namespace sh
44