// // Copyright (c) 2011 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_FORLOOPUNROLL_H_ #define COMPILER_FORLOOPUNROLL_H_ #include "compiler/translator/LoopInfo.h" // This class detects for-loops that needs to be unrolled. // Currently we support two unroll conditions: // 1) kForLoopWithIntegerIndex: unroll if the index type is integer. // 2) kForLoopWithSamplerArrayIndex: unroll where a sampler array index // is also the loop integer index, and reject and fail a compile // where a sampler array index is also the loop float index. class ForLoopUnrollMarker : public TIntermTraverser { public: enum UnrollCondition { kIntegerIndex, kSamplerArrayIndex }; ForLoopUnrollMarker(UnrollCondition condition) : mUnrollCondition(condition), mSamplerArrayIndexIsFloatLoopIndex(false), mVisitSamplerArrayIndexNodeInsideLoop(false) { } virtual bool visitBinary(Visit, TIntermBinary *node); virtual bool visitLoop(Visit, TIntermLoop *node); virtual void visitSymbol(TIntermSymbol *node); bool samplerArrayIndexIsFloatLoopIndex() const { return mSamplerArrayIndexIsFloatLoopIndex; } private: UnrollCondition mUnrollCondition; TLoopStack mLoopStack; bool mSamplerArrayIndexIsFloatLoopIndex; bool mVisitSamplerArrayIndexNodeInsideLoop; }; #endif