Hash :
31641b8e
Author :
Date :
2021-06-05T02:17:47
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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
//
// 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_