Edit

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

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2015-02-27 13:57:32
    Hash : 2cd7a0ed
    Message : Remove switch fall-through on HLSL Remove fall-through from non-empty labels in switch statements. Tested with dEQP-GLES3.functional.shaders.*switch*. All pass except for tests that require dFdx/dFdy, which fail for an unrelated reason. Additional test coverage could still be useful for cases where a label is terminated by a continue or return statement. BUG=angle:921 Change-Id: I4741867789a9308d66d0adeabdaf83907106e2d2 Reviewed-on: https://chromium-review.googlesource.com/254550 Tested-by: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Zhenyao Mo <zmo@chromium.org>

  • src/compiler/translator/RemoveSwitchFallThrough.h
  • //
    // Copyright (c) 2002-2015 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_REMOVESWITCHFALLTHROUGH_H_
    #define COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_
    
    #include "compiler/translator/IntermNode.h"
    
    class RemoveSwitchFallThrough : public TIntermTraverser
    {
      public:
        // When given a statementList from a switch AST node, return an updated
        // statementList that has fall-through removed.
        static TIntermAggregate *removeFallThrough(TIntermAggregate *statementList);
    
      private:
        RemoveSwitchFallThrough(TIntermAggregate *statementList);
    
        void visitSymbol(TIntermSymbol *node) override;
        void visitConstantUnion(TIntermConstantUnion *node) override;
        bool visitBinary(Visit, TIntermBinary *node) override;
        bool visitUnary(Visit, TIntermUnary *node) override;
        bool visitSelection(Visit visit, TIntermSelection *node) override;
        bool visitSwitch(Visit, TIntermSwitch *node) override;
        bool visitCase(Visit, TIntermCase *node) override;
        bool visitAggregate(Visit, TIntermAggregate *node) override;
        bool visitLoop(Visit, TIntermLoop *node) override;
        bool visitBranch(Visit, TIntermBranch *node) override;
    
        void outputSequence(TIntermSequence *sequence, size_t startIndex);
        void handlePreviousCase();
    
        TIntermAggregate *mStatementList;
        TIntermAggregate *mStatementListOut;
        bool mLastStatementWasBreak;
        TIntermAggregate *mPreviousCase;
        std::vector<TIntermAggregate *> mCasesSharingBreak;
    };
    
    #endif // COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_