Edit

kc3-lang/angle/src/compiler/translator/tree_util/IntermNodePatternMatcher.h

Branch :

  • Show log

    Commit

  • Author : jchen10
    Date : 2019-10-18 16:01:34
    Hash : b3070102
    Message : Add SH_REMOVE_DYNAMIC_INDEXING_OF_SWIZZLED_VECTOR This is a workaround for the webgl2 conformance test case WebglConformance_conformance2_glsl3_vector_dynamic_indexing_swizzled_lvalue. Dynamic indexing of swizzled lvalue like "v.zyx[i] = 0.0" is problematic on various platforms. This removes the indexing by translating it this way: void dyn_index_write_vec3(inout vec3 base, in int index, in float value){ switch (index) { case (0): (base[0] = value); return ; case (1): (base[1] = value); return ; case (2): (base[2] = value); return ; default: break; } if ((index < 0)) { (base[0] = value); return ; } { (base[2] = value); } } ... dyn_index_write_vec3(v.zyx, i, 0.0); ... Bug: chromium:709351 Change-Id: I971b38eb404209b56e6764af1063878c078a7e88 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1869109 Commit-Queue: Jie A Chen <jie.a.chen@intel.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>

  • src/compiler/translator/tree_util/IntermNodePatternMatcher.h
  • //
    // Copyright 2016 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.
    //
    // IntermNodePatternMatcher is a helper class for matching node trees to given patterns.
    // It can be used whenever the same checks for certain node structures are common to multiple AST
    // traversers.
    //
    
    #ifndef COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_
    #define COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_
    
    namespace sh
    {
    
    class TIntermAggregate;
    class TIntermBinary;
    class TIntermDeclaration;
    class TIntermNode;
    class TIntermTernary;
    class TIntermUnary;
    
    class IntermNodePatternMatcher
    {
      public:
        static bool IsDynamicIndexingOfNonSSBOVectorOrMatrix(TIntermBinary *node);
        static bool IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node);
        static bool IsDynamicIndexingOfSwizzledVector(TIntermBinary *node);
    
        enum PatternType
        {
            // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf
            kUnfoldedShortCircuitExpression = 0x0001,
    
            // Matches expressions that return arrays with the exception of simple statements where a
            // constructor or function call result is assigned.
            kExpressionReturningArray = 0x0001 << 1,
    
            // Matches dynamic indexing of vectors or matrices in l-values.
            kDynamicIndexingOfVectorOrMatrixInLValue = 0x0001 << 2,
    
            // Matches declarations with more than one declared variables.
            kMultiDeclaration = 0x0001 << 3,
    
            // Matches declarations of arrays.
            kArrayDeclaration = 0x0001 << 4,
    
            // Matches declarations of structs where the struct type does not have a name.
            kNamelessStructDeclaration = 0x0001 << 5,
    
            // Matches array length() method.
            kArrayLengthMethod = 0x0001 << 6,
    
            // Matches a vector or matrix constructor whose arguments are scalarized by the
            // SH_SCALARIZE_VEC_OR_MAT_CONSTRUCTOR_ARGUMENTS workaround.
            kScalarizedVecOrMatConstructor = 0x0001 << 7
        };
        IntermNodePatternMatcher(const unsigned int mask);
    
        bool match(TIntermUnary *node);
    
        bool match(TIntermBinary *node, TIntermNode *parentNode);
    
        // Use this version for checking binary node matches in case you're using flag
        // kDynamicIndexingOfVectorOrMatrixInLValue.
        bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere);
    
        bool match(TIntermAggregate *node, TIntermNode *parentNode);
        bool match(TIntermTernary *node);
        bool match(TIntermDeclaration *node);
    
      private:
        const unsigned int mMask;
    
        bool matchInternal(TIntermBinary *node, TIntermNode *parentNode);
    };
    
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_TREEUTIL_INTERMNODEPATTERNMATCHER_H_