10b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com//
20b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
30b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com// Use of this source code is governed by a BSD-style license that can be
40b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com// found in the LICENSE file.
50b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com//
60b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com
70dd3b3ff66cdc50882125d21e60112d5161279b4Ehsan Akhgari#ifndef COMPILER_FORLOOPUNROLL_H_
80dd3b3ff66cdc50882125d21e60112d5161279b4Ehsan Akhgari#define COMPILER_FORLOOPUNROLL_H_
90dd3b3ff66cdc50882125d21e60112d5161279b4Ehsan Akhgari
10fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo#include "compiler/translator/LoopInfo.h"
11fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo
12fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo// This class detects for-loops that needs to be unrolled.
13fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo// Currently we support two unroll conditions:
14fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo//   1) kForLoopWithIntegerIndex: unroll if the index type is integer.
15fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo//   2) kForLoopWithSamplerArrayIndex: unroll where a sampler array index
16fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo//      is also the loop integer index, and reject and fail a compile
17fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo//      where a sampler array index is also the loop float index.
18fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Moclass ForLoopUnrollMarker : public TIntermTraverser
19fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo{
20fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo  public:
21fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    enum UnrollCondition
22fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    {
23fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo        kIntegerIndex,
24fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo        kSamplerArrayIndex
25fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    };
26fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo
27fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    ForLoopUnrollMarker(UnrollCondition condition)
28fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo        : mUnrollCondition(condition),
29fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo          mSamplerArrayIndexIsFloatLoopIndex(false),
30fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo          mVisitSamplerArrayIndexNodeInsideLoop(false)
31fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    {
32fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    }
33fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo
34fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    virtual bool visitBinary(Visit, TIntermBinary *node);
35fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    virtual bool visitLoop(Visit, TIntermLoop *node);
36fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    virtual void visitSymbol(TIntermSymbol *node);
37fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo
38fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    bool samplerArrayIndexIsFloatLoopIndex() const
39fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    {
40fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo        return mSamplerArrayIndexIsFloatLoopIndex;
41fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    }
42fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo
43fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo  private:
44fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    UnrollCondition mUnrollCondition;
45fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    TLoopStack mLoopStack;
46fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    bool mSamplerArrayIndexIsFloatLoopIndex;
47fa63e947cb3eccf463648d21a05d5002c9b8adfaZhenyao Mo    bool mVisitSamplerArrayIndexNodeInsideLoop;
480b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com};
490b8d4eb260eec6b3b2c32b88a2bfe400f1cfb0c0zmo@google.com
500dd3b3ff66cdc50882125d21e60112d5161279b4Ehsan Akhgari#endif
51