| // |
| // 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. |
| // |
| |
| #include "compiler/intermediate.h" |
| |
| struct TLoopIndexInfo { |
| int id; |
| int initValue; |
| int stopValue; |
| int incrementValue; |
| TOperator op; |
| int currentValue; |
| }; |
| |
| class ForLoopUnroll { |
| public: |
| ForLoopUnroll() { } |
| |
| void FillLoopIndexInfo(TIntermLoop* node, TLoopIndexInfo& info); |
| |
| // Update the info.currentValue for the next loop iteration. |
| void Step(); |
| |
| // Return false if loop condition is no longer satisfied. |
| bool SatisfiesLoopCondition(); |
| |
| // Check if the symbol is the index of a loop that's unrolled. |
| bool NeedsToReplaceSymbolWithValue(TIntermSymbol* symbol); |
| |
| // Return the current value of a given loop index symbol. |
| int GetLoopIndexValue(TIntermSymbol* symbol); |
| |
| void Push(TLoopIndexInfo& info); |
| void Pop(); |
| |
| static void MarkForLoopsWithIntegerIndicesForUnrolling(TIntermNode* root); |
| |
| private: |
| int getLoopIncrement(TIntermLoop* node); |
| |
| int evaluateIntConstant(TIntermConstantUnion* node); |
| |
| TVector<TLoopIndexInfo> mLoopIndexStack; |
| }; |
| |