Home | History | Annotate | Download | only in translator
      1 //
      2 // Copyright (c) 2002-2014 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 #ifndef COMPILER_TRANSLATOR_LOOP_INFO_H_
      8 #define COMPILER_TRANSLATOR_LOOP_INFO_H_
      9 
     10 #include "compiler/translator/IntermNode.h"
     11 
     12 class TLoopIndexInfo
     13 {
     14   public:
     15     TLoopIndexInfo();
     16 
     17     // If type is EbtInt, fill all fields of the structure with info
     18     // extracted from a loop node.
     19     // If type is not EbtInt, only fill id and type.
     20     void fillInfo(TIntermLoop *node);
     21 
     22     int getId() const { return mId; }
     23     void setId(int id) { mId = id; }
     24     TBasicType getType() const { return mType; }
     25     void setType(TBasicType type) { mType = type; }
     26     int getCurrentValue() const { return mCurrentValue; }
     27 
     28     void step() { mCurrentValue += mIncrementValue; }
     29 
     30     // Check if the current value satisfies the loop condition.
     31     bool satisfiesLoopCondition() const;
     32 
     33   private:
     34     int mId;
     35     TBasicType mType;  // Either EbtInt or EbtFloat
     36 
     37     // Below fields are only valid if the index's type is int.
     38     int mInitValue;
     39     int mStopValue;
     40     int mIncrementValue;
     41     TOperator mOp;
     42     int mCurrentValue;
     43 };
     44 
     45 struct TLoopInfo
     46 {
     47     TLoopIndexInfo index;
     48     TIntermLoop *loop;
     49 
     50     TLoopInfo();
     51     TLoopInfo(TIntermLoop *node);
     52 };
     53 
     54 class TLoopStack : public TVector<TLoopInfo>
     55 {
     56   public:
     57     // Search loop stack for a loop whose index matches the input symbol.
     58     TIntermLoop *findLoop(TIntermSymbol *symbol);
     59 
     60     // Find the loop index info in the loop stack by the input symbol.
     61     TLoopIndexInfo *getIndexInfo(TIntermSymbol *symbol);
     62 
     63     // Update the currentValue for the next loop iteration.
     64     void step();
     65 
     66     // Return false if loop condition is no longer satisfied.
     67     bool satisfiesLoopCondition();
     68 
     69     // Check if the symbol is the index of a loop that's unrolled.
     70     bool needsToReplaceSymbolWithValue(TIntermSymbol *symbol);
     71 
     72     // Return the current value of a given loop index symbol.
     73     int getLoopIndexValue(TIntermSymbol *symbol);
     74 
     75     void push(TIntermLoop *info);
     76     void pop();
     77 };
     78 
     79 #endif // COMPILER_TRANSLATOR_LOOP_INDEX_H_
     80 
     81