Edit

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

Branch :

  • Show log

    Commit

  • Author : Shahbaz Youssefi
    Date : 2021-06-05 02:17:47
    Hash : 31641b8e
    Message : Declare specialization constants in the AST A new qualifier (EvqSpecConst) is added so that specialization constants can be declared in tree. This enables TVariable references to specialization constants to be validated, which were in fact invalid as every reference declared a new variable. That is fixed. Bug: angleproject:4889 Change-Id: I1711e41cbc5a1260843d2d004d3568bdae11e963 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2941451 Reviewed-by: Tim Van Patten <timvp@google.com> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/compiler/translator/tree_util/SpecializationConstant.h
  • //
    // Copyright 2020 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.
    //
    // SpecializationConst.h: Add code to generate AST node for specialization constant.
    //
    
    #ifndef COMPILER_TRANSLATOR_TREEUTIL_SPECIALIZATIONCONSTANT_H_
    #define COMPILER_TRANSLATOR_TREEUTIL_SPECIALIZATIONCONSTANT_H_
    
    #include "common/angleutils.h"
    #include "compiler/translator/Compiler.h"
    #include "compiler/translator/SymbolTable.h"
    
    class TIntermBlock;
    class TIntermTyped;
    class TIntermSymbol;
    class TVariable;
    
    namespace sh
    {
    
    class SpecConst
    {
      public:
        SpecConst(TSymbolTable *symbolTable, ShCompileOptions compileOptions, GLenum shaderType);
        virtual ~SpecConst();
    
        // Line rasterizaton emulation
        TIntermSymbol *getLineRasterEmulation();
    
        // Flip/rotation
        TIntermTyped *getMultiplierXForDFdx();
        TIntermTyped *getMultiplierYForDFdx();
        TIntermTyped *getMultiplierXForDFdy();
        TIntermTyped *getMultiplierYForDFdy();
        TIntermTyped *getPreRotationMatrix();
        TIntermTyped *getFragRotationMatrix();
        TIntermTyped *getFlipXY();
        TIntermTyped *getNegFlipXY();
        TIntermTyped *getFlipY();
        TIntermTyped *getFragRotationMultiplyFlipXY();
    
        // Half render area
        TIntermBinary *getHalfRenderArea();
    
        void declareSpecConsts(TIntermBlock *root);
        SpecConstUsageBits getSpecConstUsageBits() const { return mUsageBits; }
    
      private:
        TIntermSymbol *getFlipRotation();
        TIntermTyped *getNegFlipY();
        TIntermSymbol *getDrawableWidth();
        TIntermSymbol *getDrawableHeight();
        TIntermTyped *getHalfRenderAreaRotationMatrix();
    
        // If unsupported, this should be set to null.
        TSymbolTable *mSymbolTable;
        ShCompileOptions mCompileOptions;
    
        TVariable *mLineRasterEmulationVar;
        TVariable *mSurfaceRotationVar;
        TVariable *mDrawableWidthVar;
        TVariable *mDrawableHeightVar;
    
        // Bit is set if YFlip or Rotation has been used
        SpecConstUsageBits mUsageBits;
    };
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_TREEUTIL_SPECIALIZATIONCONSTANT_H_