MaterialX 1.38.2
ShaderStage.h
Go to the documentation of this file.
1//
2// TM & (c) 2017 Lucasfilm Entertainment Company Ltd. and Lucasfilm Ltd.
3// All rights reserved. See LICENSE.txt for license.
4//
5
6#ifndef MATERIALX_SHADERSTAGE_H
7#define MATERIALX_SHADERSTAGE_H
8
11
13
17
18#include <MaterialXCore/Node.h>
19
20#include <sstream>
21
22// Macro for begin/end of statements to be picked up by a given shader stage.
23// For shaders that are multi-stage all code generation statements adding code
24// to the shader should be wrapped inside such begin/end stating its target.
25#define BEGIN_SHADER_STAGE(stage, name) if (stage.getName() == name) {
26#define END_SHADER_STAGE(stage, name) }
27
28namespace MaterialX
29{
30
31namespace Stage
32{
39 extern MX_GENSHADER_API const string PIXEL;
40}
41
42class VariableBlock;
44using VariableBlockPtr = std::shared_ptr<VariableBlock>;
46using VariableBlockMap = std::unordered_map<string, VariableBlockPtr>;
48using ShaderPortPredicate = std::function<bool(ShaderPort*)>;
49
52class MX_GENSHADER_API VariableBlock
53{
54 public:
55 VariableBlock(const string& name, const string& instance) :
56 _name(name),
57 _instance(instance)
58 {}
59
61 const string& getName() const { return _name; }
62
64 void setName(const string& name) { _name = name; }
65
67 const string& getInstance() const { return _instance; }
68
70 void setInstance(const string& instance) { _instance = instance; }
71
73 bool empty() const { return _variableOrder.empty(); }
74
76 size_t size() const { return _variableOrder.size(); }
77
79 ShaderPort* operator[](size_t index) { return _variableOrder[index]; }
80
82 const ShaderPort* operator[](size_t index) const { return _variableOrder[index]; }
83
85 const vector<ShaderPort*>& getVariableOrder() const { return _variableOrder; }
86
89 ShaderPort* operator[](const string& name);
90
93 const ShaderPort* operator[](const string& name) const;
94
97 ShaderPort* find(const string& name);
98
101 const ShaderPort* find(const string& name) const;
102
104 ShaderPort* find(const ShaderPortPredicate& predicate);
105
107 ShaderPort* add(const TypeDesc* type, const string& name, ValuePtr value = nullptr);
108
110 void add(ShaderPortPtr port);
111
112 private:
113 string _name;
114 string _instance;
115 std::unordered_map<string, ShaderPortPtr> _variableMap;
116 vector<ShaderPort*> _variableOrder;
117};
118
119
123class MX_GENSHADER_API ShaderStage
124{
125 public:
127 ShaderStage(const string& name, ConstSyntaxPtr syntax);
128
130 const string& getName() const { return _name; }
131
133 const string& getFunctionName() const { return _functionName; }
134
136 const string& getSourceCode() const { return _code; }
137
139 VariableBlockPtr createUniformBlock(const string& name, const string& instance = EMPTY_STRING);
140
142 VariableBlockPtr createInputBlock(const string& name, const string& instance = EMPTY_STRING);
143
145 VariableBlockPtr createOutputBlock(const string& name, const string& instance = EMPTY_STRING);
146
148 VariableBlock& getUniformBlock(const string& name);
149
151 const VariableBlock& getUniformBlock(const string& name) const;
152
154 VariableBlock& getInputBlock(const string& name);
155
157 const VariableBlock& getInputBlock(const string& name) const;
158
160 VariableBlock& getOutputBlock(const string& name);
161
163 const VariableBlock& getOutputBlock(const string& name) const;
164
166 VariableBlock& getConstantBlock();
167
169 const VariableBlock& getConstantBlock() const;
170
173 {
174 return _uniforms;
175 }
176
179 {
180 return _inputs;
181 }
182
185 {
186 return _outputs;
187 }
188
189 protected:
191 void beginScope(Syntax::Punctuation punc = Syntax::CURLY_BRACKETS);
192
194 void endScope(bool semicolon = false, bool newline = true);
195
197 void beginLine();
198
200 void endLine(bool semicolon = true);
201
203 void newLine();
204
206 void addString(const string& str);
207
209 void addLine(const string& str, bool semicolon = true);
210
212 void addComment(const string& str);
213
215 void addBlock(const string& str, GenContext& context);
216
219 void addInclude(const string& file, GenContext& context);
220
222 template<typename T>
223 void addValue(const T& value)
224 {
225 StringStream str;
226 str << value;
227 _code += str.str();
228 }
229
231 void addFunctionDefinition(const ShaderNode& node, GenContext& context);
232
234 void setFunctionName(const string& functionName)
235 {
236 _functionName = functionName;
237 }
238
239 private:
241 const string _name;
242
244 string _functionName;
245
247 ConstSyntaxPtr _syntax;
248
250 int _indentations;
251
253 vector<Syntax::Punctuation> _scopes;
254
256 StringSet _includes;
257
259 std::set<size_t> _definedFunctions;
260
262 VariableBlock _constants;
263
265 VariableBlockMap _uniforms;
266
268 VariableBlockMap _inputs;
269
271 VariableBlockMap _outputs;
272
274 string _code;
275
276 friend class ShaderGenerator;
277};
278
280using ShaderStagePtr = std::shared_ptr<ShaderStage>;
281
283inline ShaderPort* addStageUniform(const string& block,
284 const TypeDesc* type,
285 const string& name,
286 ShaderStage& stage)
287{
288 VariableBlock& uniforms = stage.getUniformBlock(block);
289 return uniforms.add(type, name);
290}
291
293inline ShaderPort* addStageInput(const string& block,
294 const TypeDesc* type,
295 const string& name,
296 ShaderStage& stage)
297{
298 VariableBlock& inputs = stage.getInputBlock(block);
299 return inputs.add(type, name);
300}
301
303inline ShaderPort* addStageOutput(const string& block,
304 const TypeDesc* type,
305 const string& name,
306 ShaderStage& stage)
307{
308 VariableBlock& outputs = stage.getOutputBlock(block);
309 return outputs.add(type, name);
310}
311
313inline void addStageConnectorBlock(const string& block,
314 const string& instance,
315 ShaderStage& from,
316 ShaderStage& to)
317{
318 from.createOutputBlock(block, instance);
319 to.createInputBlock(block, instance);
320}
321
323inline void addStageConnector(const string& block,
324 const TypeDesc* type,
325 const string& name,
326 ShaderStage& from,
327 ShaderStage& to)
328{
329 addStageOutput(block, type, name, from);
330 addStageInput(block, type, name, to);
331}
332
333} // namespace MaterialX
334
335#endif
Shader generation options class.
std::set< string > StringSet
A set of strings.
Definition: Library.h:60
Macros for declaring imported and exported symbols.
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:30
std::shared_ptr< VariableBlock > VariableBlockPtr
Shared pointer to a VariableBlock.
Definition: ShaderStage.h:44
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:283
ShaderPort * addStageOutput(const string &block, const TypeDesc *type, const string &name, ShaderStage &stage)
Utility function for adding a new shader port to an output block.
Definition: ShaderStage.h:303
std::unordered_map< string, VariableBlockPtr > VariableBlockMap
Shared pointer to a map between string identifiers and VariableBlocks.
Definition: ShaderStage.h:46
void addStageConnector(const string &block, const TypeDesc *type, const string &name, ShaderStage &from, ShaderStage &to)
Utility function for adding a variable to a stage connector block.
Definition: ShaderStage.h:323
void addStageConnectorBlock(const string &block, const string &instance, ShaderStage &from, ShaderStage &to)
Utility function for adding a connector block between stages.
Definition: ShaderStage.h:313
std::function< bool(ShaderPort *)> ShaderPortPredicate
A standard function predicate taking an ShaderPort pointer and returning a boolean.
Definition: ShaderStage.h:48
ShaderPort * addStageInput(const string &block, const TypeDesc *type, const string &name, ShaderStage &stage)
Utility function for adding a new shader port to an input block.
Definition: ShaderStage.h:293
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:30
A context class for shader generation.
Definition: GenContext.h:27
Base class for shader generators All third-party shader generators should derive from this class.
Definition: ShaderGenerator.h:30
Class representing a node in the shader generation DAG.
Definition: ShaderNode.h:326
An input or output port on a ShaderNode.
Definition: ShaderNode.h:125
A shader stage, containing the state and resulting source code for the stage.
Definition: ShaderStage.h:124
const VariableBlockMap & getUniformBlocks() const
Return a map of all uniform blocks.
Definition: ShaderStage.h:172
void setFunctionName(const string &functionName)
Set stage function name.
Definition: ShaderStage.h:234
void addValue(const T &value)
Add a value.
Definition: ShaderStage.h:223
VariableBlock & getOutputBlock(const string &name)
Return the output variable block with given name.
Definition: ShaderStage.cpp:169
const string & getName() const
Return the stage name.
Definition: ShaderStage.h:130
const VariableBlockMap & getInputBlocks() const
Return a map of all input blocks.
Definition: ShaderStage.h:178
VariableBlockPtr createOutputBlock(const string &name, const string &instance=EMPTY_STRING)
Create a new output variable block.
Definition: ShaderStage.cpp:127
const string & getFunctionName() const
Return the stage function name.
Definition: ShaderStage.h:133
VariableBlockPtr createInputBlock(const string &name, const string &instance=EMPTY_STRING)
Create a new input variable block.
Definition: ShaderStage.cpp:115
VariableBlock & getUniformBlock(const string &name)
Return the uniform variable block with given name.
Definition: ShaderStage.cpp:139
const string & getSourceCode() const
Return the stage source code.
Definition: ShaderStage.h:136
const VariableBlockMap & getOutputBlocks() const
Return a map of all output blocks.
Definition: ShaderStage.h:184
VariableBlock & getInputBlock(const string &name)
Return the input variable block with given name.
Definition: ShaderStage.cpp:154
Punctuation
Punctuation types.
Definition: Syntax.h:44
A type descriptor for MaterialX data types.
Definition: TypeDesc.h:29
A block of variables in a shader stage.
Definition: ShaderStage.h:53
size_t size() const
Return the number of variables in this block.
Definition: ShaderStage.h:76
const string & getName() const
Get the name of this block.
Definition: ShaderStage.h:61
void setName(const string &name)
Set the name of this block.
Definition: ShaderStage.h:64
ShaderPort * operator[](size_t index)
Return a variable by index.
Definition: ShaderStage.h:79
bool empty() const
Return true if the block has no variables.
Definition: ShaderStage.h:73
const string & getInstance() const
Get the instance name of this block.
Definition: ShaderStage.h:67
const ShaderPort * operator[](size_t index) const
Return a variable by index.
Definition: ShaderStage.h:82
const vector< ShaderPort * > & getVariableOrder() const
Return a const reference to our variable order vector.
Definition: ShaderStage.h:85
ShaderPort * add(const TypeDesc *type, const string &name, ValuePtr value=nullptr)
Add a new shader port to this block.
Definition: ShaderStage.cpp:67
void setInstance(const string &instance)
Set the instance name of this block.
Definition: ShaderStage.h:70