michael@0: // michael@0: // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: // Contains analysis utilities for dealing with HLSL's lack of support for michael@0: // the use of intrinsic functions which (implicitly or explicitly) compute michael@0: // gradients of functions with discontinuities. michael@0: // michael@0: michael@0: #ifndef COMPILER_DETECTDISCONTINUITY_H_ michael@0: #define COMPILER_DETECTDISCONTINUITY_H_ michael@0: michael@0: #include "compiler/intermediate.h" michael@0: michael@0: namespace sh michael@0: { michael@0: // Checks whether a loop can run for a variable number of iterations michael@0: class DetectLoopDiscontinuity : public TIntermTraverser michael@0: { michael@0: public: michael@0: bool traverse(TIntermNode *node); michael@0: michael@0: protected: michael@0: bool visitBranch(Visit visit, TIntermBranch *node); michael@0: bool visitLoop(Visit visit, TIntermLoop *loop); michael@0: bool visitAggregate(Visit visit, TIntermAggregate *node); michael@0: michael@0: int mLoopDepth; michael@0: bool mLoopDiscontinuity; michael@0: }; michael@0: michael@0: bool containsLoopDiscontinuity(TIntermNode *node); michael@0: michael@0: // Checks for intrinsic functions which compute gradients michael@0: class DetectGradientOperation : public TIntermTraverser michael@0: { michael@0: public: michael@0: bool traverse(TIntermNode *node); michael@0: michael@0: protected: michael@0: bool visitUnary(Visit visit, TIntermUnary *node); michael@0: bool visitAggregate(Visit visit, TIntermAggregate *node); michael@0: michael@0: bool mGradientOperation; michael@0: }; michael@0: michael@0: bool containsGradientOperation(TIntermNode *node); michael@0: michael@0: } michael@0: michael@0: #endif // COMPILER_DETECTDISCONTINUITY_H_