mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-30 19:17:31 +09:00
53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
//
|
|
// 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.
|
|
//
|
|
|
|
#ifndef COMPILER_TRANSLATOR_FORLOOPUNROLL_H_
|
|
#define COMPILER_TRANSLATOR_FORLOOPUNROLL_H_
|
|
|
|
#include "compiler/translator/LoopInfo.h"
|
|
|
|
// This class detects for-loops that needs to be unrolled.
|
|
// Currently we support two unroll conditions:
|
|
// 1) kForLoopWithIntegerIndex: unroll if the index type is integer.
|
|
// 2) kForLoopWithSamplerArrayIndex: unroll where a sampler array index
|
|
// is also the loop integer index, and reject and fail a compile
|
|
// where a sampler array index is also the loop float index.
|
|
class ForLoopUnrollMarker : public TIntermTraverser
|
|
{
|
|
public:
|
|
enum UnrollCondition
|
|
{
|
|
kIntegerIndex,
|
|
kSamplerArrayIndex
|
|
};
|
|
|
|
ForLoopUnrollMarker(UnrollCondition condition, bool hasRunLoopValidation)
|
|
: TIntermTraverser(true, false, false),
|
|
mUnrollCondition(condition),
|
|
mSamplerArrayIndexIsFloatLoopIndex(false),
|
|
mVisitSamplerArrayIndexNodeInsideLoop(false),
|
|
mHasRunLoopValidation(hasRunLoopValidation)
|
|
{
|
|
}
|
|
|
|
bool visitBinary(Visit, TIntermBinary *node) override;
|
|
bool visitLoop(Visit, TIntermLoop *node) override;
|
|
void visitSymbol(TIntermSymbol *node) override;
|
|
|
|
bool samplerArrayIndexIsFloatLoopIndex() const
|
|
{
|
|
return mSamplerArrayIndexIsFloatLoopIndex;
|
|
}
|
|
|
|
private:
|
|
UnrollCondition mUnrollCondition;
|
|
TLoopStack mLoopStack;
|
|
bool mSamplerArrayIndexIsFloatLoopIndex;
|
|
bool mVisitSamplerArrayIndexNodeInsideLoop;
|
|
bool mHasRunLoopValidation;
|
|
};
|
|
|
|
#endif // COMPILER_TRANSLATOR_FORLOOPUNROLL_H_
|