Edit

kc3-lang/angle/src/compiler/translator/ForLoopUnroll.h

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2015-12-10 20:25:12
    Hash : 8a76dcc7
    Message : Don't try to apply ForLoopUnroll to loops it can't handle ForLoopUnroll should only mark loops that fit the limitations in ESSL 1.00 Appendix A. BUG=angleproject:1253 TEST=angle_unittests, WebGL conformance tests Change-Id: I00b0a7d29cd42efea9611d020aa1f873ac04773f Reviewed-on: https://chromium-review.googlesource.com/317551 Tested-by: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Zhenyao Mo <zmo@chromium.org>

  • src/compiler/translator/ForLoopUnroll.h
  • //
    // 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_