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
 
FunctionDeclarationgetActiveFunctionDeclaration () const
 
StructDeclarationgetActiveFunctionStructDeclaration () const
 
void pushCallExpression (CallExpression *callExpression)
 
void popCallExpression ()
 
CallExpressiongetActiveCallExpression () const
 
void pushLValueExpression (Expression *expression)
 
void popLValueExpression ()
 
ExpressiongetActiveLValueExpression () const
 
void pushStructDeclaration (StructDeclaration *structDeclaration)
 
void popStructDeclaration ()
 
bool isInsideStructDeclaration () const
 
StructDeclarationgetActiveStructDeclaration () 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
 
VarDeclarationStatementgetActiveVarDeclarationStatement () 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: