CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
HLSLAnalyzer.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
11
16
19
21
23
24 struct HLSLIntrinsicEntry;
25
26 // HLSL context analyzer.
27 class HLSLAnalyzer : public Analyzer {
28 private:
29 Program* mProgram = nullptr;
30
34
38 bool mPreferWrappers = false;
39
42
43 public:
44 HLSLAnalyzer(Log* log = nullptr);
45
46 private:
50
55
56 void decorateASTPrimary(Program& program, const ShaderInput& inputDesc, const ShaderOutput& outputDesc) override;
57
59
60 // Returns true, if the input shader version if either HLSL3 or Cg.
61 [[nodiscard]] bool isD3D9ShaderModel() const;
62
63 private: // Visitor implementation
69
76
81
91
98
99 private: // Declarations
103
104 private: // Call expressions
107 void analyzeCallExpressionFunction(CallExpression* callExpression, bool isStatic = false, const Expression* prefixExpression = nullptr, const TypeDenoter* prefixTypeDenoter = nullptr);
111
113
114 private: // Object expressions
118
119 bool analyzeStaticAccessExpression(const Expression* prefixExpression, bool isStatic, const AST* ast = nullptr);
120 bool analyzeStaticTypeSpecifier(const TypeSpecifier* typeSpecifier, const String& ident, const Expression* expression, bool isStatic);
121
122 void analyzeLValueExpression(Expression* expression, const AST* ast = nullptr, VarDeclaration* param = nullptr);
124
125 private: // Array expressions
127
128 private: // Entry point
131 //void analyzeEntryPointInputOutputGeometryShader(FunctionDecl* funcDecl);
132
138
145
147
149
150 private: // Secondary entry point
154
155 private: // Attributes
156 bool analyzeNumArgsAttribute(const Attribute* attrib, std::size_t minNumArgs, std::size_t maxNumArgs, bool required);
157 bool analyzeNumArgsAttribute(const Attribute* attrib, std::size_t expectedNumArgs, bool required = true);
158
159 void analyzeAttributeDomain(const Attribute* attrib, bool required = true);
160 void analyzeAttributeOutputTopology(const Attribute* attrib, bool required = true);
161 void analyzeAttributePartitioning(const Attribute* attrib, bool required = true);
164
166
169
171 bool required = true);
172
174
175 private: // Semantic
177 void analyzeSemanticSM3(IndexedSemantic& semantic, bool input);
181
182 private: // Language extensions
184
186
188 bool analyzeAttributeSpaceIdent(const Attribute* attrib, std::size_t argIndex, String& ident);
189
191 bool swapAssignOrder = false);
192
193 private: // Misc
196 };
197
198} // namespace CeresEngine::ShaderCompiler
#define DECLARATION_VISIT_PROC(CLASS_NAME)
Definition Visitor.hpp:88
Definition Flags.hpp:235
Definition Analyzer.hpp:30
Definition HLSLAnalyzer.hpp:27
void analyzeEntryPointAttributes(const Vector< AttributePtr > &attribs)
void analyzeCallExpression(CallExpression *callExpression)
void analyzeEntryPointAttributesComputeShader(const Vector< AttributePtr > &attribs)
void analyzeAttributeOutputTopology(const Attribute *attrib, bool required=true)
bool analyzeStaticAccessExpression(const Expression *prefixExpression, bool isStatic, const AST *ast=nullptr)
ShaderVersion mShaderModel
Definition HLSLAnalyzer.hpp:37
Program * mProgram
Definition HLSLAnalyzer.hpp:29
void analyzeAttributePatchConstantFunc(const Attribute *attrib)
void analyzeCallExpressionIntrinsicPrimary(CallExpression *callExpression, const HLSLIntrinsicEntry &intr)
void analyzeSecondaryEntryPointAttributesTessEvaluationShader(const Vector< AttributePtr > &attribs)
void analyzeEntryPointAttributesFragmentShader(const Vector< AttributePtr > &attribs)
String mSecondaryEntryPoint
Definition HLSLAnalyzer.hpp:32
void analyzeEntryPointParameterInOutBuffer(FunctionDeclaration *funcDeclaration, VarDeclaration *varDeclaration, const BufferTypeDenoter *bufferTypeDen, bool input)
void analyzeVectorSpaceAssign(TypedAST *lhs, const TypeDenoter &rhsTypeDen, const OnAssignTypeDenoterProc &assignTypeDenProc=nullptr, bool swapAssignOrder=false)
void analyzeLValueExpression(Expression *expression, const AST *ast=nullptr, VarDeclaration *param=nullptr)
void analyzeEntryPointParameterInOut(FunctionDeclaration *funcDeclaration, VarDeclaration *varDeclaration, bool input, TypeDenoterPtr varTypeDen=nullptr)
void analyzeVarDeclarationStaticMember(VarDeclaration *varDeclaration)
void analyzeEntryPointParameterInOutVariable(FunctionDeclaration *funcDeclaration, VarDeclaration *varDeclaration, bool input)
void analyzeCallExpressionFunction(CallExpression *callExpression, bool isStatic=false, const Expression *prefixExpression=nullptr, const TypeDenoter *prefixTypeDenoter=nullptr)
void analyzeVarDeclarationLocal(VarDeclaration *varDeclaration, bool registerVarIdent=true)
void analyzeVarDeclaration(VarDeclaration *varDeclaration)
void decorateASTPrimary(Program &program, const ShaderInput &inputDesc, const ShaderOutput &outputDesc) override
UniqueFunction< void(const TypeDenoterPtr &) const > OnAssignTypeDenoterProc
Definition HLSLAnalyzer.hpp:49
ASTSymbolTable::OnOverrideProc OnOverrideProc
Definition HLSLAnalyzer.hpp:47
void analyzeObjectExpressionVarDeclarationFromStruct(ObjectExpression *expression, StructDeclaration *baseStructDeclaration, const StructTypeDenoter &structTypeDen)
void analyzeObjectExpressionBaseStructDeclarationFromStruct(ObjectExpression *expression, PrefixArgs &outputArgs, const StructTypeDenoter &structTypeDen)
void analyzeEntryPointAttributesTessEvaluationShader(const Vector< AttributePtr > &attribs)
void analyzeEntryPointAttributesTessControlShader(const Vector< AttributePtr > &attribs)
void analyzeLValueExpressionObject(ObjectExpression *objectExpression, const AST *ast=nullptr, VarDeclaration *param=nullptr)
void analyzeAttributePartitioning(const Attribute *attrib, bool required=true)
bool mSecondaryEntryPointFound
Definition HLSLAnalyzer.hpp:33
void analyzeSemanticVarDeclaration(IndexedSemantic &semantic, VarDeclaration *varDeclaration)
bool analyzeAttributeValuePrimary(Expression *argExpression, AttributeValue &value, const OnValidAttributeValueProc &expectedValueFunc, String &literalValue)
void analyzeParameter(VarDeclarationStatement *param)
void analyzeIntrinsicWrapperInlining(CallExpression *callExpression)
bool analyzeNumArgsAttribute(const Attribute *attrib, std::size_t expectedNumArgs, bool required=true)
InputShaderVersion mVersionIn
Definition HLSLAnalyzer.hpp:36
void analyzeArrayExpression(ArrayExpression *expression)
void analyzeEntryPointAttributesGeometryShader(const Vector< AttributePtr > &attribs)
void analyzeAttributeSpace(const Attribute *attrib, const TypeDenoterPtr &typeDen)
void analyzeAttributeValue(Expression *argExpression, AttributeValue &value, const OnValidAttributeValueProc &expectedValueFunc, const String &expectationDesc, bool required=true)
void analyzeCallExpressionIntrinsic(CallExpression *callExpression, const HLSLIntrinsicEntry &intr, bool isStatic=false, const TypeDenoter *prefixTypeDenoter=nullptr)
Set< VarDeclaration * > mVarDeclarationSM3Semantics
Definition HLSLAnalyzer.hpp:40
void analyzeAttributeLayout(const Attribute *attrib, const TypeDenoterPtr &typeDen)
void analyzeEntryPointParameterInOutStruct(FunctionDeclaration *funcDeclaration, StructDeclaration *structDeclaration, bool input)
void analyzeEntryPointParameter(FunctionDeclaration *funcDeclaration, const VarDeclarationStatement *param)
ShaderTarget mShaderTarget
Definition HLSLAnalyzer.hpp:35
void analyzeAttributeDomain(const Attribute *attrib, bool required=true)
void analyzeEntryPoint(FunctionDeclaration *funcDeclaration)
void analyzeSemanticFunctionReturn(IndexedSemantic &semantic)
void analyzeObjectExpression(ObjectExpression *expression, PrefixArgs *args)
void analyzeExtAttributes(const Vector< AttributePtr > &attribs, const TypeDenoterPtr &typeDen)
void analyzeEntryPointInputOutput(FunctionDeclaration *funcDeclaration)
void analyzeArrayDimensionList(const Vector< ArrayDimensionPtr > &arrayDimensions)
void analyzeCallExpressionIntrinsicFromBufferType(const CallExpression *callExpression, const BufferType bufferType)
void analyzeSemantic(IndexedSemantic &semantic)
void analyzeEntryPointSemantics(FunctionDeclaration *funcDeclaration, const Vector< Semantic > &inSemantics, const Vector< Semantic > &outSemantics)
RawFlags mExtensions
Definition HLSLAnalyzer.hpp:41
String mEntryPoint
Definition HLSLAnalyzer.hpp:31
bool analyzeNumArgsAttribute(const Attribute *attrib, std::size_t minNumArgs, std::size_t maxNumArgs, bool required)
bool mPreferWrappers
Definition HLSLAnalyzer.hpp:38
void analyzeAttributeMaxVertexCount(const Attribute *attrib)
bool analyzeStaticTypeSpecifier(const TypeSpecifier *typeSpecifier, const String &ident, const Expression *expression, bool isStatic)
void analyzeAttributeNumThreadsArgument(Expression *expression, UInt32 &value)
void analyzeAttributeNumThreads(const Attribute *attrib)
void analyzeSecondaryEntryPointAttributes(const Vector< AttributePtr > &attribs)
bool analyzeAttributeSpaceIdent(const Attribute *attrib, std::size_t argIndex, String &ident)
void errorIfAttributeNotFound(bool found, const String &attribDesc)
void analyzeAttributeOutputControlPoints(const Attribute *attrib)
void analyzeSecondaryEntryPoint(FunctionDeclaration *funcDeclaration, bool isPatchConstantFunc=false)
void analyzeSemanticSM3(IndexedSemantic &semantic, bool input)
UniqueFunction< bool(const AttributeValue) const > OnValidAttributeValueProc
Definition HLSLAnalyzer.hpp:48
void analyzeCallExpressionPrimary(CallExpression *callExpression, const TypeDenoter *prefixTypeDenoter=nullptr)
void analyzeEntryPointOutput(Expression *expression)
Log base class.
Definition Log.hpp:19
Definition ShaderVersion.hpp:17
UniqueFunction< bool(SymbolType &prevSymbol) const > OnOverrideProc
Definition SymbolTable.hpp:46
Definition AST.hpp:33
AttributeValue
Definition ASTEnums.hpp:948
InputShaderVersion
Input shader version enumeration.
Definition Targets.hpp:40
@ HLSL5
HLSL Shader Model 5.0 (DirectX 11).
ShaderTarget
Shader target enumeration.
Definition Targets.hpp:16
SPtr< TypeDenoter > TypeDenoterPtr
Definition TypeDenoter.hpp:29
BufferType
Definition ASTEnums.hpp:492
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
std::uint32_t UInt32
Definition DataTypes.hpp:23
FunctionBase< true, false, fu2::capacity_default, true, false, Signatures... > UniqueFunction
An owning non copyable function wrapper for arbitrary callable types.
Definition Function.hpp:59
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
std::set< Key, Compare, ScopedAllocatorAdaptor< StdAllocator< Key, RawAllocator > > > Set
Set is an associative container that contains a sorted set of unique objects of type Key.
Definition Set.hpp:21
decltype(&*std::declval< I >() found)(const I &it, C &container)
Returns a pointer to the value if found, otherwise nullptr.
Definition Iterator.hpp:572
Buffer type denoter with generic sub type and generic size.
Definition TypeDenoter.hpp:265
StructDeclaration * outPrefixBaseStruct
Definition HLSLAnalyzer.hpp:53
bool inIsPostfixStatic
Definition HLSLAnalyzer.hpp:52
Definition HLSLIntrinsics.hpp:22
Definition AST.hpp:1159
Shader input descriptor structure.
Definition ShaderCompiler.hpp:223
Shader output descriptor structure.
Definition ShaderCompiler.hpp:293
Definition TypeDenoter.hpp:82