1//
2// Copyright (c) 2011 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_FORLOOPUNROLL_H_
8#define COMPILER_FORLOOPUNROLL_H_
9
10#include "compiler/translator/LoopInfo.h"
11
12// This class detects for-loops that needs to be unrolled.
13// Currently we support two unroll conditions:
14//   1) kForLoopWithIntegerIndex: unroll if the index type is integer.
15//   2) kForLoopWithSamplerArrayIndex: unroll where a sampler array index
16//      is also the loop integer index, and reject and fail a compile
17//      where a sampler array index is also the loop float index.
18class ForLoopUnrollMarker : public TIntermTraverser
19{
20  public:
21    enum UnrollCondition
22    {
23        kIntegerIndex,
24        kSamplerArrayIndex
25    };
26
27    ForLoopUnrollMarker(UnrollCondition condition)
28        : mUnrollCondition(condition),
29          mSamplerArrayIndexIsFloatLoopIndex(false),
30          mVisitSamplerArrayIndexNodeInsideLoop(false)
31    {
32    }
33
34    virtual bool visitBinary(Visit, TIntermBinary *node);
35    virtual bool visitLoop(Visit, TIntermLoop *node);
36    virtual void visitSymbol(TIntermSymbol *node);
37
38    bool samplerArrayIndexIsFloatLoopIndex() const
39    {
40        return mSamplerArrayIndexIsFloatLoopIndex;
41    }
42
43  private:
44    UnrollCondition mUnrollCondition;
45    TLoopStack mLoopStack;
46    bool mSamplerArrayIndexIsFloatLoopIndex;
47    bool mVisitSamplerArrayIndexNodeInsideLoop;
48};
49
50#endif
51