CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
CeresEngine::ShaderCompiler::ExpressionConverter Class Reference

Common AST expression converter. More...

#include <CeresEngine/Material/ShaderCompiler/AST/Visitor/ExpressionConverter.hpp>

Inheritance diagram for CeresEngine::ShaderCompiler::ExpressionConverter:
CeresEngine::ShaderCompiler::VisitorTracker CeresEngine::ShaderCompiler::Visitor

Public Types

enum  : UInt32 {
  ConvertVectorSubscripts = (1 << 0) , ConvertVectorCompare = (1 << 1) , ConvertImageAccess = (1 << 2) , ConvertImplicitCasts = (1 << 3) ,
  ConvertInitializerToCtor = (1 << 4) , ConvertLog10 = (1 << 5) , ConvertUnaryExpression = (1 << 6) , ConvertSamplerBufferAccess = (1 << 7) ,
  ConvertMatrixLayout = (1 << 8) , ConvertTextureBracketOp = (1 << 9) , ConvertTextureIntrinsicVec4 = (1 << 10) , ConvertMatrixSubscripts = (1 << 11) ,
  ConvertCompatibleStructs = (1 << 12) , ConvertLiteralHalfToFloat = (1 << 13) , AllPreVisit , AllPostVisit = (ConvertVectorSubscripts | ConvertMatrixSubscripts | ConvertTextureIntrinsicVec4) ,
  All = (~0u)
}
 

Public Member Functions

void convert (Program &program, const RawFlags &conversionFlags, const NameMangling &nameMangling)
 
- Public Member Functions inherited from CeresEngine::ShaderCompiler::Visitor
virtual ~Visitor ()=default
 
virtual void visitProgram (Program *ast, void *args)
 
virtual void visitCodeBlock (CodeBlock *ast, void *args)
 
virtual void visitAttribute (Attribute *ast, void *args)
 
virtual void visitSwitchCase (SwitchCase *ast, void *args)
 
virtual void visitSamplerValue (SamplerValue *ast, void *args)
 
virtual void visitRegister (Register *ast, void *args)
 
virtual void visitPackOffset (PackOffset *ast, void *args)
 
virtual void visitArrayDimension (ArrayDimension *ast, void *args)
 
virtual void visitTypeSpecifier (TypeSpecifier *ast, void *args)
 
virtual void visitBufferDeclaration (BufferDeclaration *ast, void *args)
 
virtual void visitSamplerDeclaration (SamplerDeclaration *ast, void *args)
 
virtual void visitStructDeclaration (StructDeclaration *ast, void *args)
 
virtual void visitAliasDeclaration (AliasDeclaration *ast, void *args)
 
virtual void visitUniformBufferDeclaration (UniformBufferDeclaration *ast, void *args)
 
virtual void visitBufferDeclarationStatement (BufferDeclarationStatement *ast, void *args)
 
virtual void visitSamplerDeclarationStatement (SamplerDeclarationStatement *ast, void *args)
 
virtual void visitVarDeclarationStatement (VarDeclarationStatement *ast, void *args)
 
virtual void visitAliasDeclarationStatement (AliasDeclarationStatement *ast, void *args)
 
virtual void visitBasicDeclarationStatement (BasicDeclarationStatement *ast, void *args)
 
virtual void visitNullStatement (NullStatement *ast, void *args)
 
virtual void visitCodeBlockStatement (CodeBlockStatement *ast, void *args)
 
virtual void visitElseStatement (ElseStatement *ast, void *args)
 
virtual void visitCtrlTransferStatement (CtrlTransferStatement *ast, void *args)
 
virtual void visitLayoutStatement (LayoutStatement *ast, void *args)
 
virtual void visitNullExpression (NullExpression *ast, void *args)
 
virtual void visitSequenceExpression (SequenceExpression *ast, void *args)
 
virtual void visitTypeSpecifierExpression (TypeSpecifierExpression *ast, void *args)
 
virtual void visitPostUnaryExpression (PostUnaryExpression *ast, void *args)
 
virtual void visitInitializerExpression (InitializerExpression *ast, void *args)
 

Static Public Member Functions

static void convertExpressionIfCastRequired (ExpressionPtr &expression, const DataType targetType, bool matchTypeSize=true)
 
static void convertExpressionIfCastRequired (ExpressionPtr &expression, const TypeDenoter &targetTypeDen, bool matchTypeSize=true)
 
static Int32 getTextureDimFromExpression (Expression *expression, const AST *ast=nullptr)
 
static String getMatrixSubscriptWrapperIdent (const NameMangling &nameMangling, const MatrixSubscriptUsage &subscriptUsage)
 

Private Member Functions

void visitVarDeclaration (VarDeclaration *ast, void *args) override
 
void visitFunctionDeclaration (FunctionDeclaration *ast, void *args) override
 
void visitForLoopStatement (ForLoopStatement *ast, void *args) override
 
void visitWhileLoopStatement (WhileLoopStatement *ast, void *args) override
 
void visitDoWhileLoopStatement (DoWhileLoopStatement *ast, void *args) override
 
void visitIfStatement (IfStatement *ast, void *args) override
 
void visitSwitchStatement (SwitchStatement *ast, void *args) override
 
void visitExpressionStatement (ExpressionStatement *ast, void *args) override
 
void visitReturnStatement (ReturnStatement *ast, void *args) override
 
void visitLiteralExpression (LiteralExpression *ast, void *args) override
 
void visitTernaryExpression (TernaryExpression *ast, void *args) override
 
void visitBinaryExpression (BinaryExpression *ast, void *args) override
 
void visitUnaryExpression (UnaryExpression *ast, void *args) override
 
void visitCallExpression (CallExpression *ast, void *args) override
 
void visitBracketExpression (BracketExpression *ast, void *args) override
 
void visitCastExpression (CastExpression *ast, void *args) override
 
void visitObjectExpression (ObjectExpression *ast, void *args) override
 
void visitAssignExpression (AssignExpression *ast, void *args) override
 
void visitArrayExpression (ArrayExpression *ast, void *args) override
 
void convertExpression (ExpressionPtr &expression, const RawFlags &flags)
 
void convertExpressionList (Vector< ExpressionPtr > &expressionList, const RawFlags &flags)
 
void convertExpressionVectorSubscript (ExpressionPtr &expression)
 
void convertExpressionVectorSubscriptObject (ExpressionPtr &expression, const ObjectExpression *objectExpression)
 
void convertExpressionMatrixSubscript (ExpressionPtr &expression)
 
void convertExpressionMatrixSubscriptObject (ExpressionPtr &expression, ObjectExpression *objectExpression)
 
void convertExpressionVectorCompare (ExpressionPtr &expression)
 
void convertExpressionVectorCompareUnary (ExpressionPtr &expression, UnaryExpression *unaryExpression)
 
void convertExpressionVectorCompareBinary (ExpressionPtr &expression, BinaryExpression *binaryExpression)
 
void convertExpressionVectorCompareTernary (ExpressionPtr &expression, TernaryExpression *ternaryExpression)
 
void convertExpressionImageAccess (ExpressionPtr &expression)
 
void convertExpressionImageAccessAssign (ExpressionPtr &expression, const AssignExpression *assignExpression)
 
void convertExpressionImageAccessArray (ExpressionPtr &expression, ArrayExpression *arrayExpression, const AssignExpression *assignExpression=nullptr)
 
void convertExpressionSamplerBufferAccess (ExpressionPtr &expression)
 
void convertExpressionSamplerBufferAccessArray (ExpressionPtr &expression, ArrayExpression *arrayExpression)
 
void convertExpressionIntoBracket (ExpressionPtr &expression)
 
void convertExpressionIntrinsicCallLog10 (ExpressionPtr &expression)
 
void convertExpressionTargetType (ExpressionPtr &expression, const TypeDenoter &targetTypeDen, bool matchTypeSize=true)
 
void convertExpressionTargetTypeInitializer (ExpressionPtr &expression, const InitializerExpression *initExpression, const TypeDenoter &targetTypeDen)
 
void convertExpressionFormatInitializer (ExpressionPtr &expression, InitializerExpression *initExpression, const TypeDenoter &targetTypeDen)
 
void convertExpressionTextureBracketOp (ExpressionPtr &expression)
 
void convertExpressionTextureIntrinsicVec4 (ExpressionPtr &expression)
 
void convertExpressionCompatibleStruct (const ExpressionPtr &expression)
 

Private Attributes

RawFlags mConversionFlags
 
NameMangling mNameMangling
 

Additional Inherited Members

- Protected Member Functions inherited from CeresEngine::ShaderCompiler::VisitorTracker
bool isInsideGlobalScope () const
 
void pushFunctionDeclaration (FunctionDeclaration *funcDeclaration)
 
void popFunctionDeclaration ()
 
bool isInsideFunctionDeclaration () const
 
bool isInsideEntryPoint () const
 
bool isInsideSecondaryEntryPoint () const
 
FunctionDeclaration * getActiveFunctionDeclaration () const
 
StructDeclaration * getActiveFunctionStructDeclaration () const
 
void pushCallExpression (CallExpression *callExpression)
 
void popCallExpression ()
 
CallExpression * getActiveCallExpression () const
 
void pushLValueExpression (Expression *expression)
 
void popLValueExpression ()
 
Expression * getActiveLValueExpression () const
 
void pushStructDeclaration (StructDeclaration *structDeclaration)
 
void popStructDeclaration ()
 
bool isInsideStructDeclaration () const
 
StructDeclaration * getActiveStructDeclaration () const
 
const Vector< StructDeclaration * > & getStructDeclarationStack () const
 
void pushUniformBufferDeclaration (UniformBufferDeclaration *uniformBufferDeclaration)
 
void popUniformBufferDeclaration ()
 
bool isInsideUniformBufferDeclaration () const
 
const Vector< UniformBufferDeclaration * > & getUniformBufferDeclarationStack () const
 
void pushVarDeclarationStatement (VarDeclarationStatement *varDeclarationStatement)
 
void popVarDeclarationStatement ()
 
bool isInsideVarDeclarationStatement () const
 
VarDeclarationStatement * getActiveVarDeclarationStatement () const
 
- Protected Member Functions inherited from CeresEngine::ShaderCompiler::Visitor
template<typename T >
void visit (const T &ast, void *args=nullptr)
 
template<typename T >
void visit (const Vector< T > &astList, void *args=nullptr)
 

Detailed Description

Common AST expression converter.

This helper class modifies the AST after context analysis and supports the following conversions:

  1. Eliminate vector subscripts from scalar types
  2. Convert implicit casts to explicit casts
  3. Wrap nested unary expression into brackets (e.g. "- - a" -> "-(-a)")
  4. Convert access to 'image' types through array indexers to imageStore/imageLoad calls (e.g. myImage[index] = 5 -> imageStore(myImage, index, 5))

Member Enumeration Documentation

◆ anonymous enum

Enumerator
ConvertVectorSubscripts 
ConvertVectorCompare 
ConvertImageAccess 
ConvertImplicitCasts 
ConvertInitializerToCtor 
ConvertLog10 
ConvertUnaryExpression 
ConvertSamplerBufferAccess 
ConvertMatrixLayout 
ConvertTextureBracketOp 
ConvertTextureIntrinsicVec4 
ConvertMatrixSubscripts 
ConvertCompatibleStructs 
ConvertLiteralHalfToFloat 
AllPreVisit 
AllPostVisit 
All 

Member Function Documentation

◆ convert()

void CeresEngine::ShaderCompiler::ExpressionConverter::convert ( Program &  program,
const RawFlags &  conversionFlags,
const NameMangling &  nameMangling 
)

◆ convertExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpression ( ExpressionPtr &  expression,
const RawFlags &  flags 
)
private

◆ convertExpressionCompatibleStruct()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionCompatibleStruct ( const ExpressionPtr &  expression)
private

◆ convertExpressionFormatInitializer()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionFormatInitializer ( ExpressionPtr &  expression,
InitializerExpression *  initExpression,
const TypeDenoter &  targetTypeDen 
)
private

◆ convertExpressionIfCastRequired() [1/2]

static void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionIfCastRequired ( ExpressionPtr &  expression,
const DataType  targetType,
bool  matchTypeSize = true 
)
static

◆ convertExpressionIfCastRequired() [2/2]

static void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionIfCastRequired ( ExpressionPtr &  expression,
const TypeDenoter &  targetTypeDen,
bool  matchTypeSize = true 
)
static

◆ convertExpressionImageAccess()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionImageAccess ( ExpressionPtr &  expression)
private

◆ convertExpressionImageAccessArray()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionImageAccessArray ( ExpressionPtr &  expression,
ArrayExpression *  arrayExpression,
const AssignExpression *  assignExpression = nullptr 
)
private

◆ convertExpressionImageAccessAssign()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionImageAccessAssign ( ExpressionPtr &  expression,
const AssignExpression *  assignExpression 
)
private

◆ convertExpressionIntoBracket()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionIntoBracket ( ExpressionPtr &  expression)
private

◆ convertExpressionIntrinsicCallLog10()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionIntrinsicCallLog10 ( ExpressionPtr &  expression)
private

◆ convertExpressionList()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionList ( Vector< ExpressionPtr > &  expressionList,
const RawFlags &  flags 
)
private

◆ convertExpressionMatrixSubscript()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionMatrixSubscript ( ExpressionPtr &  expression)
private

◆ convertExpressionMatrixSubscriptObject()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionMatrixSubscriptObject ( ExpressionPtr &  expression,
ObjectExpression *  objectExpression 
)
private

◆ convertExpressionSamplerBufferAccess()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionSamplerBufferAccess ( ExpressionPtr &  expression)
private

◆ convertExpressionSamplerBufferAccessArray()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionSamplerBufferAccessArray ( ExpressionPtr &  expression,
ArrayExpression *  arrayExpression 
)
private

◆ convertExpressionTargetType()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionTargetType ( ExpressionPtr &  expression,
const TypeDenoter &  targetTypeDen,
bool  matchTypeSize = true 
)
private

◆ convertExpressionTargetTypeInitializer()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionTargetTypeInitializer ( ExpressionPtr &  expression,
const InitializerExpression *  initExpression,
const TypeDenoter &  targetTypeDen 
)
private

◆ convertExpressionTextureBracketOp()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionTextureBracketOp ( ExpressionPtr &  expression)
private

◆ convertExpressionTextureIntrinsicVec4()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionTextureIntrinsicVec4 ( ExpressionPtr &  expression)
private

◆ convertExpressionVectorCompare()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorCompare ( ExpressionPtr &  expression)
private

◆ convertExpressionVectorCompareBinary()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorCompareBinary ( ExpressionPtr &  expression,
BinaryExpression *  binaryExpression 
)
private

◆ convertExpressionVectorCompareTernary()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorCompareTernary ( ExpressionPtr &  expression,
TernaryExpression *  ternaryExpression 
)
private

◆ convertExpressionVectorCompareUnary()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorCompareUnary ( ExpressionPtr &  expression,
UnaryExpression *  unaryExpression 
)
private

◆ convertExpressionVectorSubscript()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorSubscript ( ExpressionPtr &  expression)
private

◆ convertExpressionVectorSubscriptObject()

void CeresEngine::ShaderCompiler::ExpressionConverter::convertExpressionVectorSubscriptObject ( ExpressionPtr &  expression,
const ObjectExpression *  objectExpression 
)
private

◆ getMatrixSubscriptWrapperIdent()

static String CeresEngine::ShaderCompiler::ExpressionConverter::getMatrixSubscriptWrapperIdent ( const NameMangling &  nameMangling,
const MatrixSubscriptUsage &  subscriptUsage 
)
static

◆ getTextureDimFromExpression()

static Int32 CeresEngine::ShaderCompiler::ExpressionConverter::getTextureDimFromExpression ( Expression *  expression,
const AST *  ast = nullptr 
)
static

◆ visitArrayExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitArrayExpression ( ArrayExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitAssignExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitAssignExpression ( AssignExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitBinaryExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitBinaryExpression ( BinaryExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitBracketExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitBracketExpression ( BracketExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitCallExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitCallExpression ( CallExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitCastExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitCastExpression ( CastExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitDoWhileLoopStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitDoWhileLoopStatement ( DoWhileLoopStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitExpressionStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitExpressionStatement ( ExpressionStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitForLoopStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitForLoopStatement ( ForLoopStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitFunctionDeclaration()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitFunctionDeclaration ( FunctionDeclaration *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitIfStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitIfStatement ( IfStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitLiteralExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitLiteralExpression ( LiteralExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitObjectExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitObjectExpression ( ObjectExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitReturnStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitReturnStatement ( ReturnStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitSwitchStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitSwitchStatement ( SwitchStatement *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitTernaryExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitTernaryExpression ( TernaryExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitUnaryExpression()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitUnaryExpression ( UnaryExpression *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitVarDeclaration()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitVarDeclaration ( VarDeclaration *  ast,
void *  args 
)
overrideprivatevirtual

◆ visitWhileLoopStatement()

void CeresEngine::ShaderCompiler::ExpressionConverter::visitWhileLoopStatement ( WhileLoopStatement *  ast,
void *  args 
)
overrideprivatevirtual

Member Data Documentation

◆ mConversionFlags

RawFlags CeresEngine::ShaderCompiler::ExpressionConverter::mConversionFlags
private

◆ mNameMangling

NameMangling CeresEngine::ShaderCompiler::ExpressionConverter::mNameMangling
private

The documentation for this class was generated from the following file: