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