1//
2// Copyright (c) 2012 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// Contains analysis utilities for dealing with HLSL's lack of support for
7// the use of intrinsic functions which (implicitly or explicitly) compute
8// gradients of functions with discontinuities.
9//
10
11#ifndef COMPILER_DETECTDISCONTINUITY_H_
12#define COMPILER_DETECTDISCONTINUITY_H_
13
14#include "compiler/translator/IntermNode.h"
15
16namespace sh
17{
18// Checks whether a loop can run for a variable number of iterations
19class DetectLoopDiscontinuity : public TIntermTraverser
20{
21  public:
22    bool traverse(TIntermNode *node);
23
24  protected:
25    bool visitBranch(Visit visit, TIntermBranch *node);
26    bool visitLoop(Visit visit, TIntermLoop *loop);
27    bool visitAggregate(Visit visit, TIntermAggregate *node);
28
29    int mLoopDepth;
30    bool mLoopDiscontinuity;
31};
32
33bool containsLoopDiscontinuity(TIntermNode *node);
34
35// Checks for intrinsic functions which compute gradients
36class DetectGradientOperation : public TIntermTraverser
37{
38  public:
39    bool traverse(TIntermNode *node);
40
41  protected:
42    bool visitUnary(Visit visit, TIntermUnary *node);
43    bool visitAggregate(Visit visit, TIntermAggregate *node);
44
45    bool mGradientOperation;
46};
47
48bool containsGradientOperation(TIntermNode *node);
49
50}
51
52#endif   // COMPILER_DETECTDISCONTINUITY_H_
53