CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
GLSLGenerator.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
19
22
27
29
30#include <functional>
31
33 struct TypeDenoter;
34 struct BaseTypeDenoter;
35
36 // GLSL output code generator.
37 class GLSLGenerator : public Generator {
38 private:
43
49
50 bool mAllowExtensions = false;
51 bool mExplicitBinding = false;
52 bool mPreserveComments = false;
53 bool mAllowLineMarks = false;
54 bool mCompactWrappers = false;
55 bool mAlwaysBracedScopes = false;
56 bool mSeparateShaders = false;
57 bool mSeparateSamplers = true;
58 bool mAutoBinding = false;
60
63
64 RawFlags mExtensions; // Flags of all enabled language extensions.
65
66 public:
68
69 private:
70 // Function callback interface for entries in a layout qualifier.
72
74
75 // Returns the GLSL keyword for the specified system value semantic (special case is Semantic::Target).
77
78 // Returns true if there is a wrapper function for the specified intrinsic (e.g. "clip" intrinsic).
80
81 // Returns true if the output shader language is GLSL (for OpenGL 2+).
83
84 // Returns true if the output shader language is ESSL (for OpenGL ES 2+).
86
87 // Returns true if the output shader language is VKSL (for Vulkan/SPIR-V).
89
90 // Returns true if the output shader language is either GLSL 120 or ESSL 100 which are on a similar feature level.
92
93 // Returns true if the 'GL_ARB_shading_language_420pack' is explicitly available.
95
96 // Returns true if separate objects for samplers & textures should be used.
98
99 // Returns the GLSL keyword for the specified buffer type or reports and error.
101
102 // Returns the GLSL keyword for the specified sampler type or reports and error.
104
105 // Returns true if the specified type denoter is compatible with the semantic (e.g. 'SV_VertexID' is incompatible with 'UInt').
107
108 // Report warning of optional reminaing feedback.
110
111 // Error for intrinsics, that can not be mapped to GLSL keywords.
113
114 // Returns the number of binding locations required by the specified type, or -1 if type is invalid.
116
117 // Attempts to find an empty binding location for the specified type, or returns -1 if it cannot find one.
118 Int32 getBindingLocation(const TypeDenoter* typeDenoter, bool input);
119
120 private: // Visitor implementation
126
130
138
150
165
166 // -----------------------------------------------------------------------------------------
167
168 private: // Pre processing AST
178
179 private: // Basics
180 // Writes a comment (single or multi-line comments).
182
186
187 private: // Program
192
193 private: // Global layouts
195 bool writeGlobalLayoutsTessControl(const Program::LayoutTessControlShader& layout);
196 bool writeGlobalLayoutsTessEvaluation(const Program::LayoutTessEvaluationShader& layout);
197 bool writeGlobalLayoutsGeometry(const Program::LayoutGeometryShader& layout);
198 bool writeGlobalLayoutsFragment(const Program::LayoutFragmentShader& layout);
199 bool writeGlobalLayoutsCompute(const Program::LayoutComputeShader& layout);
200
201 private: // Built-in block redeclarations
204
205 private: // Layout
213 void writeLayoutSet(const Vector<RegisterPtr>& slotRegisters);
214
215 private: // Input semantics
219
222
223 private: // Output semantics
226
230 const VarDeclaration* varDeclaration = nullptr);
231
235 const String& tempIdent = "output");
236
237 private: // Uniforms
240
241 // Writes the specified variable identifier or a system value if the identifier has a system value semantic.
243
244 private: // Object expression
248
249 private: // Array expression
252
253 private: // Type denoter
254 void writeStorageClasses(const Set<StorageClass>& storageClasses, const AST* ast = nullptr);
255 void writeInterpModifiers(const Set<InterpModifier>& interpModifiers, const AST* ast = nullptr);
256 void writeTypeModifiers(const Set<TypeModifier>& typeModifiers, const TypeDenoterPtr& typeDenoter = nullptr);
258
259 void writeDataType(DataType dataType, bool writePrecisionSpecifier = false, const AST* ast = nullptr);
260
262
263 private: // Function declaration
268
269 private: // Call expressions
271
282
284
285 private: // Intrinsics wrapper
286 // Writes all required wrapper functions for referenced intrinsics.
293
295
296 private: // Structure
297 bool writeStructDeclaration(const StructDeclaration* structDeclaration, bool endWithSemicolon);
298
299 private: // BufferDecl
303
304 private: // SamplerDecl
306
307 private:
309
311
314
315 void writeLiteral(const String& value, const DataType& dataType, const AST* ast = nullptr);
316 };
317} // namespace CeresEngine::ShaderCompiler
#define DECLARATION_VISIT_PROC(CLASS_NAME)
Definition Visitor.hpp:88
Definition Flags.hpp:235
Definition GLSLGenerator.hpp:37
void writeWrapperIntrinsicsClip(const IntrinsicUsage &usage)
void assertIntrinsicNumArgs(CallExpression *callExpression, std::size_t numArgsMin, std::size_t numArgsMax=~0)
RawFlags mExtensions
Definition GLSLGenerator.hpp:64
bool writeGlobalLayoutsGeometry(const Program::LayoutGeometryShader &layout)
void writeDataType(DataType dataType, bool writePrecisionSpecifier=false, const AST *ast=nullptr)
void writeFunctionEntryPointBody(FunctionDeclaration *ast)
void writeLayoutSet(const Vector< RegisterPtr > &slotRegisters)
void writeCallExpressionIntrinsicTextureQueryLod(CallExpression *callExpression, bool clamped)
void writeLayout(const InitializerList< LayoutEntryFunctor > &entryFunctors)
void writeTypeModifiers(const Set< TypeModifier > &typeModifiers, const TypeDenoterPtr &typeDenoter=nullptr)
void writeObjectExpression(const ObjectExpression &objectExpression)
void writeProgramHeaderExtension(const String &extensionName)
void writeWrapperIntrinsicsMemoryBarrier(const Intrinsic intrinsic, bool groupSync)
void writeGlobalInputSemantics(const FunctionDeclaration *entryPoint)
void writeLayoutGlobalOut(const InitializerList< LayoutEntryFunctor > &entryFunctors, const LayoutEntryFunctor &varFunctor=nullptr)
bool writeGlobalLayoutsCompute(const Program::LayoutComputeShader &layout)
void writeStatementList(const Vector< T > &statements, bool isGlobalScope=false)
void writeFunctionSecondaryEntryPoint(FunctionDeclaration *ast)
void writeLocalInputSemanticsVarDeclaration(VarDeclaration *varDeclaration)
void preProcessReferenceAnalyzer(const ShaderInput &inputDesc)
void writeStatementComment(const Statement *ast, bool insertBlank=false)
void writeSamplerDeclaration(const SamplerDeclaration &samplerDeclaration)
void writeCallExpressionIntrinsicRcp(CallExpression *callExpression)
bool mWriteHeaderComment
Definition GLSLGenerator.hpp:59
bool mAutoBinding
Definition GLSLGenerator.hpp:58
void writeWrapperIntrinsicsSinCos(const IntrinsicUsage &usage)
void writeLocalOutputSemanticsStructDeclarationParam(VarDeclarationStatement *param, const StructDeclaration *structDeclaration)
void preProcessStructParameterAnalyzer(const ShaderInput &inputDesc)
void writeLocalOutputSemantics(const FunctionDeclaration *entryPoint)
void writeCallExpressionStandard(const CallExpression *callExpression)
Map< CiString, VertexSemanticLoc > mVertexSemanticsMap
Definition GLSLGenerator.hpp:46
bool writeGlobalLayoutsTessControl(const Program::LayoutTessControlShader &layout)
OutputShaderVersion mVersionOut
Definition GLSLGenerator.hpp:44
void writeOutputSemanticsAssignmentStructDeclarationParam(const FunctionDeclaration::ParameterStructure &paramStruct, bool writeAsListedExpression=false, const String &tempIdent="output")
void errorIntrinsic(const String &intrinsicName, const AST *ast=nullptr)
bool mAlwaysBracedScopes
Definition GLSLGenerator.hpp:55
UPtr< String > systemValueToKeyword(const IndexedSemantic &semantic) const
bool writeStructDeclaration(const StructDeclaration *structDeclaration, bool endWithSemicolon)
Set< int > mUsedInLocationsSet
Definition GLSLGenerator.hpp:61
void writeBuiltinBlockRedeclarationsPerVertex(bool input, const String &name="")
Set< int > mUsedOutLocationsSet
Definition GLSLGenerator.hpp:62
bool mCompactWrappers
Definition GLSLGenerator.hpp:54
const String * samplerTypeToKeyword(const SamplerType samplerType, const AST *ast=nullptr)
void writeCallExpressionIntrinsicImageAtomic(CallExpression *callExpression)
bool writeGlobalLayoutsTessEvaluation(const Program::LayoutTessEvaluationShader &layout)
void writeFunctionEntryPoint(FunctionDeclaration *ast)
void writeCallExpressionIntrinsicImageAtomicCompSwap(CallExpression *callExpression)
void writeGlobalUniformsParameter(const VarDeclarationStatement *param)
bool isTypeCompatibleWithSemantic(const Semantic semantic, const TypeDenoter &typeDenoter)
void writeStorageClasses(const Set< StorageClass > &storageClasses, const AST *ast=nullptr)
void writeLiteral(const String &value, const DataType &dataType, const AST *ast=nullptr)
void writeArrayIndices(const Vector< ExpressionPtr > &arrayIndices)
void writeObjectExpressionIdentOrSystemValue(const ObjectExpression &objectExpression, Declaration *symbol)
void writeArrayExpression(const ArrayExpression &arrayExpression)
bool writeGlobalLayoutsFragment(const Program::LayoutFragmentShader &layout)
bool mAllowExtensions
Definition GLSLGenerator.hpp:50
bool mPreserveComments
Definition GLSLGenerator.hpp:52
void writeLayoutBinding(const Vector< RegisterPtr > &slotRegisters)
bool mSeparateSamplers
Definition GLSLGenerator.hpp:57
void writeParameter(const VarDeclarationStatement *ast)
void writeLayoutBindingOrLocation(const Vector< RegisterPtr > &slotRegisters)
bool isWrappedIntrinsic(const Intrinsic intrinsic) const
void writeVarDeclarationIdentOrSystemValue(const VarDeclaration *varDeclaration, Int32 arrayIndex=-1)
bool mExplicitBinding
Definition GLSLGenerator.hpp:51
void writeCallExpressionIntrinsicClip(CallExpression *callExpression)
void writeGlobalOutputSemanticsSlot(TypeSpecifier *typeSpecifier, IndexedSemantic &semantic, const String &ident, const VarDeclaration *varDeclaration=nullptr)
void writeObjectExpressionIdent(const ObjectExpression &objectExpression, bool writePrefix=true)
void writeBufferDeclarationTexture(const BufferDeclaration *bufferDeclaration)
void writeLocalInputSemanticsStructDeclarationParam(VarDeclarationStatement *param, StructDeclaration *structDeclaration)
void writeBufferDeclaration(BufferDeclaration *bufferDeclaration)
void generateCodePrimary(Program &program, const ShaderInput &inputDesc, const ShaderOutput &outputDesc) override
void writeLayoutGlobal(const InitializerList< LayoutEntryFunctor > &entryFunctors, const LayoutEntryFunctor &varFunctor, const String &modifier)
void writeGlobalInputSemanticsVarDeclaration(VarDeclaration *varDeclaration)
void writeWrapperMatrixSubscript(const MatrixSubscriptUsage &usage)
const String * bufferTypeToKeyword(const BufferType bufferType, const AST *ast=nullptr)
NameMangling mNameMangling
Definition GLSLGenerator.hpp:45
void writeGlobalOutputSemantics(FunctionDeclaration *entryPoint)
void writeTypeDenoter(const TypeDenoter &typeDenoter, bool writePrecisionSpecifier=false, const AST *ast=nullptr)
void preProcessGLSLConverter(const ShaderInput &inputDesc, const ShaderOutput &outputDesc)
bool mAllowLineMarks
Definition GLSLGenerator.hpp:53
void writeInterpModifiers(const Set< InterpModifier > &interpModifiers, const AST *ast=nullptr)
void writeLocalInputSemantics(FunctionDeclaration *entryPoint)
bool mSeparateShaders
Definition GLSLGenerator.hpp:56
void writeCallExpressionIntrinsicStreamOutputAppend(CallExpression *callExpression)
void writeCallExpressionArguments(const CallExpression *callExpression, std::size_t firstArgIndex=0, std::size_t numWriteArgs=~0u)
FunctionView< void() const > LayoutEntryFunctor
Definition GLSLGenerator.hpp:71
void writeCallExpressionIntrinsicMul(CallExpression *callExpression)
void writeTypeModifiersFrom(const TypeSpecifierPtr &typeSpecifier)
void writeBufferDeclarationStorageBuffer(BufferDeclaration *bufferDeclaration)
void writeWrapperIntrinsicsLit(const IntrinsicUsage &usage)
void writeOutputSemanticsAssignment(Expression *expression, bool writeAsListedExpression=false)
void writeGlobalOutputSemanticsVarDeclaration(VarDeclaration *varDeclaration, bool useSemanticName=false)
void writeCallExpressionIntrinsicAtomic(CallExpression *callExpression)
UniformPacking mUniformPacking
Definition GLSLGenerator.hpp:47
void preProcessAST(const ShaderInput &inputDesc, const ShaderOutput &outputDesc)
void writeCallExpressionIntrinsicAtomicCompSwap(CallExpression *callExpression)
void writeLayoutGlobalIn(const InitializerList< LayoutEntryFunctor > &entryFunctors, const LayoutEntryFunctor &varFunctor=nullptr)
void writeFunction(const FunctionDeclaration *ast)
Int32 getNumBindingLocations(const TypeDenoter *typeDenoter)
String mEntryPointName
Definition GLSLGenerator.hpp:48
Int32 getBindingLocation(const TypeDenoter *typeDenoter, bool input)
Definition Generator.hpp:24
Log base class.
Definition Log.hpp:19
Definition AST.hpp:33
SPtr< TypeSpecifier > TypeSpecifierPtr
Definition Visitor.hpp:37
TypeModifier
Definition ASTEnums.hpp:471
SPtr< Expression > ExpressionPtr
Definition Visitor.hpp:26
InterpModifier
Definition ASTEnums.hpp:453
Semantic
Definition ASTEnums.hpp:1487
Intrinsic
Intrinsics function enumeration (currently only HLSL intrinsics).
Definition ASTEnums.hpp:980
StorageClass
Definition ASTEnums.hpp:441
OutputShaderVersion
Output shader version enumeration.
Definition Targets.hpp:67
@ GLSL
Auto-detect minimal required GLSL version (for OpenGL 2+).
SPtr< TypeDenoter > TypeDenoterPtr
Definition TypeDenoter.hpp:29
DataType
Definition ASTEnums.hpp:159
BufferType
Definition ASTEnums.hpp:492
SPtr< Token > TokenPtr
Definition Token.hpp:174
SPtr< Register > RegisterPtr
Definition Visitor.hpp:34
SamplerType
Definition ASTEnums.hpp:571
std::unique_ptr< T, Deleter > UPtr
UPtr is a smart pointer that owns and manages another object through a pointer and disposes of that o...
Definition SmartPtr.hpp:28
std::initializer_list< T > InitializerList
An object of type InitializerList<T> is a lightweight proxy object that provides access to an array o...
Definition InitializerList.hpp:40
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
std::int32_t Int32
Definition DataTypes.hpp:21
FunctionBase< false, true, fu2::capacity_default, true, false, Signatures... > FunctionView
A non owning copyable function wrapper for arbitrary callable types.
Definition Function.hpp:64
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
std::map< Key, T, Compare, ScopedAllocatorAdaptor< StdAllocator< Pair< const Key, T >, RawAllocator > > > Map
Map is a sorted associative container that contains key-value pairs with unique keys.
Definition Map.hpp:24
Definition Span.hpp:668
Name mangling descriptor structure for shader input/output variables (also referred to as "varyings")...
Definition ShaderCompiler.hpp:185
Definition AST.hpp:1159
Shader input descriptor structure.
Definition ShaderCompiler.hpp:223
Shader output descriptor structure.
Definition ShaderCompiler.hpp:293
Definition TypeDenoter.hpp:82
Uniform packing parameter structure.
Definition ShaderCompiler.hpp:278