MaterialX 1.38.10
Loading...
Searching...
No Matches
ShaderStage.h
Go to the documentation of this file.
1//
2// Copyright Contributors to the MaterialX Project
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#ifndef MATERIALX_SHADERSTAGE_H
7#define MATERIALX_SHADERSTAGE_H
8
11
13
17
19
20#include <MaterialXCore/Node.h>
21
22#include <sstream>
23
24// Restrict a scoped block of statements to a specific shader stage, as
25// is required for multi-stage shading languages. Statements within
26// the block will only be emitted when processing the given stage.
27#define DEFINE_SHADER_STAGE(stage, name) if (stage.getName() == name)
28
29// These macros are deprecated, and should be replaced with DEFINE_SHADER_STAGE.
30#define BEGIN_SHADER_STAGE(stage, name) \
31 if (stage.getName() == name) \
32 {
33#define END_SHADER_STAGE(stage, name) }
34
35MATERIALX_NAMESPACE_BEGIN
36
37namespace Stage
38{
39
46extern MX_GENSHADER_API const string PIXEL;
47
48} // namespace Stage
49
50class VariableBlock;
52using VariableBlockPtr = std::shared_ptr<VariableBlock>;
54using VariableBlockMap = std::unordered_map<string, VariableBlockPtr>;
56using ShaderPortPredicate = std::function<bool(ShaderPort*)>;
57
60class MX_GENSHADER_API VariableBlock
61{
62 public:
63 VariableBlock(const string& name, const string& instance) :
64 _name(name),
65 _instance(instance)
66 {
67 }
68
70 const string& getName() const { return _name; }
71
73 void setName(const string& name) { _name = name; }
74
76 const string& getInstance() const { return _instance; }
77
79 void setInstance(const string& instance) { _instance = instance; }
80
82 bool empty() const { return _variableOrder.empty(); }
83
85 size_t size() const { return _variableOrder.size(); }
86
88 ShaderPort* operator[](size_t index) { return _variableOrder[index]; }
89
91 const ShaderPort* operator[](size_t index) const { return _variableOrder[index]; }
92
94 const vector<ShaderPort*>& getVariableOrder() const { return _variableOrder; }
95
98 ShaderPort* operator[](const string& name);
99
102 const ShaderPort* operator[](const string& name) const;
103
106 ShaderPort* find(const string& name);
107
110 const ShaderPort* find(const string& name) const;
111
113 ShaderPort* find(const ShaderPortPredicate& predicate);
114
123 ShaderPort* add(const TypeDesc* type, const string& name, ValuePtr value = nullptr, bool shouldWiden = false);
124
126 void add(ShaderPortPtr port);
127
128 private:
129 string _name;
130 string _instance;
131 std::unordered_map<string, ShaderPortPtr> _variableMap;
132 vector<ShaderPort*> _variableOrder;
133};
134
138class MX_GENSHADER_API ShaderStage
139{
140 public:
141 using FunctionCallId = std::pair<const ShaderNode*, int>;
142 struct Scope
143 {
144 Syntax::Punctuation punctuation;
145 std::set<FunctionCallId> functions;
147 punctuation(p) { }
148 };
149
150 public:
152 ShaderStage(const string& name, ConstSyntaxPtr syntax);
153
155 const string& getName() const { return _name; }
156
158 const string& getFunctionName() const { return _functionName; }
159
161 void setSourceCode(const string& code) { _code = code; }
162
164 const string& getSourceCode() const { return _code; }
165
167 VariableBlockPtr createUniformBlock(const string& name, const string& instance = EMPTY_STRING);
168
170 VariableBlockPtr createInputBlock(const string& name, const string& instance = EMPTY_STRING);
171
173 VariableBlockPtr createOutputBlock(const string& name, const string& instance = EMPTY_STRING);
174
176 VariableBlock& getUniformBlock(const string& name);
177
179 const VariableBlock& getUniformBlock(const string& name) const;
180
182 VariableBlock& getInputBlock(const string& name);
183
185 const VariableBlock& getInputBlock(const string& name) const;
186
188 VariableBlock& getOutputBlock(const string& name);
189
191 const VariableBlock& getOutputBlock(const string& name) const;
192
194 VariableBlock& getConstantBlock();
195
197 const VariableBlock& getConstantBlock() const;
198
201 {
202 return _uniforms;
203 }
204
207 {
208 return _inputs;
209 }
210
213 {
214 return _outputs;
215 }
216
218 const StringSet& getIncludes() const
219 {
220 return _includes;
221 }
222
225 {
226 return _sourceDependencies;
227 }
228
230 void beginScope(Syntax::Punctuation punc = Syntax::CURLY_BRACKETS);
231
233 void endScope(bool semicolon = false, bool newline = true);
234
236 void beginLine();
237
239 void endLine(bool semicolon = true);
240
242 void newLine();
243
245 void addString(const string& str);
246
248 void addLine(const string& str, bool semicolon = true);
249
251 void addComment(const string& str);
252
254 void addBlock(const string& str, const FilePath& sourceFilename, GenContext& context);
255
257 void addInclude(const FilePath& includeFilename, const FilePath& sourceFilename, GenContext& context);
258
260 void addSourceDependency(const FilePath& file);
261
263 template <typename T>
264 void addValue(const T& value)
265 {
266 StringStream str;
267 str << value;
268 _code += str.str();
269 }
270
272 void addFunctionDefinition(const ShaderNode& node, GenContext& context);
273
278 void addFunctionCall(const ShaderNode& node, GenContext& context, bool emitCode = true);
279
281 bool isEmitted(const ShaderNode& node, GenContext& context) const;
282
284 void setFunctionName(const string& functionName)
285 {
286 _functionName = functionName;
287 }
288
289 private:
291 const string _name;
292
294 string _functionName;
295
297 ConstSyntaxPtr _syntax;
298
300 int _indentations;
301
303 vector<Scope> _scopes;
304
306 StringSet _includes;
307
309 StringSet _sourceDependencies;
310
312 std::set<size_t> _definedFunctions;
313
315 VariableBlock _constants;
316
318 VariableBlockMap _uniforms;
319
321 VariableBlockMap _inputs;
322
324 VariableBlockMap _outputs;
325
327 string _code;
328
329 friend class ShaderGenerator;
330};
331
333using ShaderStagePtr = std::shared_ptr<ShaderStage>;
334
336inline ShaderPort* addStageUniform(const string& block,
337 const TypeDesc* type,
338 const string& name,
339 ShaderStage& stage)
340{
341 VariableBlock& uniforms = stage.getUniformBlock(block);
342 return uniforms.add(type, name);
343}
344
346inline ShaderPort* addStageInput(const string& block,
347 const TypeDesc* type,
348 const string& name,
349 ShaderStage& stage,
350 bool shouldWiden = false)
351{
352 VariableBlock& inputs = stage.getInputBlock(block);
353 return inputs.add(type, name, {}, shouldWiden);
354}
355
357inline ShaderPort* addStageOutput(const string& block,
358 const TypeDesc* type,
359 const string& name,
360 ShaderStage& stage,
361 bool shouldWiden = false)
362{
363 VariableBlock& outputs = stage.getOutputBlock(block);
364 return outputs.add(type, name, {}, shouldWiden);
365}
366
368inline void addStageConnectorBlock(const string& block,
369 const string& instance,
370 ShaderStage& from,
371 ShaderStage& to)
372{
373 from.createOutputBlock(block, instance);
374 to.createInputBlock(block, instance);
375}
376
378inline void addStageConnector(const string& block,
379 const TypeDesc* type,
380 const string& name,
381 ShaderStage& from,
382 ShaderStage& to,
383 bool shouldWiden = false)
384{
385 addStageOutput(block, type, name, from, shouldWiden);
386 addStageInput(block, type, name, to, shouldWiden);
387}
388
389MATERIALX_NAMESPACE_END
390
391#endif
Cross-platform support for file and search paths.
Shader generation options class.
std::set< string > StringSet
A set of strings.
Definition: Library.h:61
Macros for declaring imported and exported symbols.
shared_ptr< ShaderStage > ShaderStagePtr
Shared pointer to a ShaderStage.
Definition: Library.h:36
std::stringstream StringStream
A string stream.
Definition: Library.h:31
Node element subclasses.
Shader graph class.
shared_ptr< class ShaderPort > ShaderPortPtr
Shared pointer to a ShaderPort.
Definition: ShaderNode.h:29
std::shared_ptr< VariableBlock > VariableBlockPtr
Shared pointer to a VariableBlock.
Definition: ShaderStage.h:52
void addStageConnectorBlock(const string &block, const string &instance, ShaderStage &from, ShaderStage &to)
Utility function for adding a connector block between stages.
Definition: ShaderStage.h:368
void addStageConnector(const string &block, const TypeDesc *type, const string &name, ShaderStage &from, ShaderStage &to, bool shouldWiden=false)
Utility function for adding a variable to a stage connector block.
Definition: ShaderStage.h:378
ShaderPort * addStageUniform(const string &block, const TypeDesc *type, const string &name, ShaderStage &stage)
Utility function for adding a new shader port to a uniform block.
Definition: ShaderStage.h:336
std::unordered_map< string, VariableBlockPtr > VariableBlockMap
Shared pointer to a map between string identifiers and VariableBlocks.
Definition: ShaderStage.h:54
std::function< bool(ShaderPort *)> ShaderPortPredicate
A standard function predicate taking an ShaderPort pointer and returning a boolean.
Definition: ShaderStage.h:56
ShaderPort * addStageInput(const string &block, const TypeDesc *type, const string &name, ShaderStage &stage, bool shouldWiden=false)
Utility function for adding a new shader port to an input block.
Definition: ShaderStage.h:346
ShaderPort * addStageOutput(const string &block, const TypeDesc *type, const string &name, ShaderStage &stage, bool shouldWiden=false)
Utility function for adding a new shader port to an output block.
Definition: ShaderStage.h:357
Base class for syntax handling for shader generators.
shared_ptr< const Syntax > ConstSyntaxPtr
Shared pointer to a constant Syntax.
Definition: Syntax.h:28
shared_ptr< Value > ValuePtr
A shared pointer to a Value.
Definition: Value.h:29
A generic file path, supporting both syntactic and file system operations.
Definition: File.h:27
A context class for shader generation.
Definition: GenContext.h:31
Base class for shader generators All third-party shader generators should derive from this class.
Definition: ShaderGenerator.h:31
Class representing a node in the shader generation DAG.
Definition: ShaderNode.h:326
An input or output port on a ShaderNode.
Definition: ShaderNode.h:123
A shader stage, containing the state and resulting source code for the stage.
Definition: ShaderStage.h:139
const VariableBlockMap & getUniformBlocks() const
Return a map of all uniform blocks.
Definition: ShaderStage.h:200
void setFunctionName(const string &functionName)
Set stage function name.
Definition: ShaderStage.h:284
void addValue(const T &value)
Add a value.
Definition: ShaderStage.h:264
VariableBlock & getOutputBlock(const string &name)
Return the output variable block with given name.
Definition: ShaderStage.cpp:185
const string & getName() const
Return the stage name.
Definition: ShaderStage.h:155
void setSourceCode(const string &code)
Set the stage source code.
Definition: ShaderStage.h:161
const VariableBlockMap & getInputBlocks() const
Return a map of all input blocks.
Definition: ShaderStage.h:206
VariableBlockPtr createOutputBlock(const string &name, const string &instance=EMPTY_STRING)
Create a new output variable block.
Definition: ShaderStage.cpp:143
const string & getFunctionName() const
Return the stage function name.
Definition: ShaderStage.h:158
const StringSet & getSourceDependencies() const
Return a set of all source dependencies.
Definition: ShaderStage.h:224
VariableBlockPtr createInputBlock(const string &name, const string &instance=EMPTY_STRING)
Create a new input variable block.
Definition: ShaderStage.cpp:131
VariableBlock & getUniformBlock(const string &name)
Return the uniform variable block with given name.
Definition: ShaderStage.cpp:155
const string & getSourceCode() const
Return the stage source code.
Definition: ShaderStage.h:164
const VariableBlockMap & getOutputBlocks() const
Return a map of all output blocks.
Definition: ShaderStage.h:212
const StringSet & getIncludes() const
Return a set of all include files.
Definition: ShaderStage.h:218
VariableBlock & getInputBlock(const string &name)
Return the input variable block with given name.
Definition: ShaderStage.cpp:170
Punctuation
Punctuation types.
Definition: Syntax.h:44
A type descriptor for MaterialX data types.
Definition: TypeDesc.h:28
A block of variables in a shader stage.
Definition: ShaderStage.h:61
size_t size() const
Return the number of variables in this block.
Definition: ShaderStage.h:85
const string & getName() const
Get the name of this block.
Definition: ShaderStage.h:70
void setName(const string &name)
Set the name of this block.
Definition: ShaderStage.h:73
ShaderPort * operator[](size_t index)
Return a variable by index.
Definition: ShaderStage.h:88
bool empty() const
Return true if the block has no variables.
Definition: ShaderStage.h:82
const string & getInstance() const
Get the instance name of this block.
Definition: ShaderStage.h:76
const ShaderPort * operator[](size_t index) const
Return a variable by index.
Definition: ShaderStage.h:91
const vector< ShaderPort * > & getVariableOrder() const
Return a const reference to our variable order vector.
Definition: ShaderStage.h:94
ShaderPort * add(const TypeDesc *type, const string &name, ValuePtr value=nullptr, bool shouldWiden=false)
Add a new shader port to this block.
Definition: ShaderStage.cpp:68
void setInstance(const string &instance)
Set the instance name of this block.
Definition: ShaderStage.h:79
Definition: ShaderStage.h:143