HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
registry.h
Go to the documentation of this file.
1 //
2 // Copyright 2018 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 
8 #ifndef PXR_USD_SDR_REGISTRY_H
9 #define PXR_USD_SDR_REGISTRY_H
10 
11 /// \file sdr/registry.h
12 
13 #include "pxr/pxr.h"
14 #include "pxr/base/tf/singleton.h"
15 #include "pxr/usd/sdr/api.h"
16 #include "pxr/usd/sdr/declare.h"
19 #include "pxr/usd/sdr/shaderNode.h"
22 #include "pxr/usd/sdf/assetPath.h"
23 #include <map>
24 #include <mutex>
25 
27 
28 /// \class SdrRegistry
29 ///
30 /// The registry provides access to shader node information.
31 /// "Discovery Plugins" are responsible for finding the nodes that should
32 /// be included in the registry.
33 ///
34 /// Discovery plugins are found through the plugin system. If additional
35 /// discovery plugins need to be specified, a client can pass them to
36 /// `SetExtraDiscoveryPlugins()`.
37 ///
38 /// When the registry is first told about the discovery plugins, the plugins
39 /// will be asked to discover nodes. These plugins will generate
40 /// `SdrShaderNodeDiscoveryResult` instances, which only contain basic
41 /// metadata. Once the client asks for information that would require the
42 /// node's contents to be parsed (eg, what its inputs and outputs are), the
43 /// registry will begin the parsing process on an as-needed basis. See
44 /// `SdrShaderNodeDiscoveryResult` for the information that can be retrieved
45 /// without triggering a parse.
46 class SdrRegistry : public TfWeakBase
47 {
48 public:
49  using DiscoveryPluginRefPtrVec = SdrDiscoveryPluginRefPtrVector;
50 
51  /// Get the single `SdrRegistry` instance.
52  SDR_API
53  static SdrRegistry& GetInstance();
54 
55  /// Allows the client to set any additional discovery plugins that would
56  /// otherwise NOT be found through the plugin system. Runs the discovery
57  /// process for the specified plugins immediately.
58  ///
59  /// Note that this method cannot be called after any nodes in the registry
60  /// have been parsed (eg, through GetNode*()), otherwise an error will
61  /// result.
62  SDR_API
64 
65  /// Allows the client to set any additional discovery plugins that would
66  /// otherwise NOT be found through the plugin system. Runs the discovery
67  /// process for the specified plugins immediately.
68  ///
69  /// Note that this method cannot be called after any nodes in the registry
70  /// have been parsed (eg, through GetNode*()), otherwise an error will
71  /// result.
72  SDR_API
73  void SetExtraDiscoveryPlugins(const std::vector<TfType>& pluginTypes);
74 
75 
76  /// Allows the client to explicitly set additional discovery results that
77  /// would otherwise NOT be found through the plugin system. For example
78  /// to support lazily-loaded plugins which cannot be easily discovered
79  /// in advance.
80  ///
81  /// This method will not immediately spawn a parse call which will be
82  /// deferred until a GetShaderNode*() method is called.
83  SDR_API
84  void AddDiscoveryResult(SdrShaderNodeDiscoveryResult&& discoveryResult);
85 
86  /// Copy version of the method above.
87  /// For performance reasons, one should prefer to use the rvalue reference
88  /// form.
89  /// \overload
90  SDR_API
91  void AddDiscoveryResult(
92  const SdrShaderNodeDiscoveryResult& discoveryResult);
93 
94  /// Allows the client to set any additional parser plugins that would
95  /// otherwise NOT be found through the plugin system.
96  ///
97  /// Note that this method cannot be called after any nodes in the registry
98  /// have been parsed (eg, through GetNode*()), otherwise an error will
99  /// result.
100  SDR_API
101  void SetExtraParserPlugins(const std::vector<TfType>& pluginTypes);
102 
103  /// Get the locations where the registry is searching for nodes.
104  ///
105  /// Depending on which discovery plugins were used, this may include
106  /// non-filesystem paths.
107  SDR_API
108  SdrStringVec GetSearchURIs() const;
109 
110  /// Get identifiers of all the shader nodes that the registry is aware of.
111  ///
112  /// This will not run the parsing plugins on the nodes that have been
113  /// discovered, so this method is relatively quick. Optionally, "function"
114  /// can be specified to only get the identifiers of nodes that belong
115  /// to that function group and a filter can be specified to get just the
116  /// default version (the default) or all versions of the node.
117  SDR_API
119  GetShaderNodeIdentifiers(const TfToken& function = TfToken(),
122 
123  /// Get the names of all the shader nodes that the registry is aware of.
124  ///
125  /// This will not run the parsing plugins on the nodes that have been
126  /// discovered, so this method is relatively quick. Optionally, "function"
127  /// can be specified to only get the names of nodes that belong to
128  /// that function group.
129  SDR_API
130  SdrStringVec GetShaderNodeNames(const TfToken& function = TfToken()) const;
131 
132  /// Get the shader node with the specified \p identifier, and an optional
133  /// \p shadingSystemPriority list specifying the set of node shading
134  /// systems (see `SdrShaderNode::GetShadingSystem()`) that should be
135  /// searched.
136  ///
137  /// If no shadingSystemPriority is specified, the first encountered node
138  /// with the specified identifier will be returned (first is arbitrary)
139  /// if found.
140  ///
141  /// If a shadingSystemPriority list is specified, then this will iterate
142  /// through each shading system and try to find a node matching by
143  /// identifier. This is equivalent to calling
144  /// SdrRegistry::GetShaderNodeByIdentifierAndSystem for each shading system
145  /// until a node is found.
146  ///
147  /// Nodes of the same identifier but different shading system can exist
148  /// in the registry. If a node 'Foo' with shading systems 'abc' and 'xyz'
149  /// exist in the registry, and you want to make sure the 'abc' version
150  /// is fetched before the 'xyz' version, the priority list would be
151  /// specified as ['abc', 'xyz']. If the 'abc' version did not exist in
152  /// the registry, then the 'xyz' version would be returned.
153  ///
154  /// Returns `nullptr` if a node matching the arguments can't be found.
155  SDR_API
157  const SdrIdentifier& identifier,
158  const SdrTokenVec& shadingSystemPriority = SdrTokenVec());
159 
160  /// Get the shader node with the specified \p identifier and
161  /// \p shadingSystem.
162  ///
163  /// If there is no matching node for shadingSystem, nullptr is returned.
164  SDR_API
166  const SdrIdentifier& identifier,
167  const TfToken& shadingSystem);
168 
169  /// Get the shader node with the specified \p identifier and \p sourceType.
170  /// If there is no matching node for the sourceType, nullptr is returned.
171  ///
172  /// \deprecated
173  /// Deprecated in favor of GetShaderNodeByIdentifierAndSystem
174  SDR_API
176  const SdrIdentifier& identifier,
177  const TfToken& nodeType);
178 
179  /// Get the shader node with the specified name.
180  ///
181  /// An optional priority list specifies the list of node shading systems
182  /// (\sa SdrShaderNode::GetShadingSystem()) that should be searched in
183  /// order.
184  ///
185  /// Optionally, a filter can be specified to consider just the default
186  /// versions of nodes matching \p name (the default) or all versions
187  /// of the nodes.
188  ///
189  /// \sa GetShaderNodeByIdentifier().
190  SDR_API
192  const std::string& name,
193  const SdrTokenVec& shadingSystemPriority = SdrTokenVec(),
195 
196  /// A convenience wrapper around \c GetShaderNodeByName().
197  ///
198  /// Instead of providing a priority list, an exact shading system is
199  /// specified, and `nullptr` is returned if a node with the exact
200  /// identifier and shading system does not exist.
201  ///
202  /// Optionally, a filter can be specified to consider just the default
203  /// versions of nodes matching \p name (the default) or all versions
204  /// of the nodes.
205  SDR_API
207  const std::string& name,
208  const TfToken& shadingSystem,
210 
211  /// A convenience wrapper around \c GetShaderNodeByName(). Instead of
212  /// providing a priority list, an exact type is specified, and
213  /// `nullptr` is returned if a node with the exact identifier and
214  /// type does not exist.
215  ///
216  /// Optionally, a filter can be specified to consider just the default
217  /// versions of nodes matching \p name (the default) or all versions
218  /// of the nodes.
219  ///
220  /// \deprecated
221  /// Deprecated in favor of GetShaderNodeByNameAndSystem
222  SDR_API
224  const std::string& name,
225  const TfToken& nodeType,
227 
228  /// Parses the given \p asset, constructs a SdrShaderNode from it and adds it to
229  /// the registry.
230  ///
231  /// Nodes created from an asset using this API can be looked up by the
232  /// unique identifier and shadingSystem of the returned node, or by URI,
233  /// which will be set to the unresolved asset path value.
234  ///
235  /// \p metadata contains additional metadata needed for parsing and
236  /// compiling the source code in the file pointed to by \p asset correctly.
237  /// This metadata supplements the metadata available in the asset and
238  /// overrides it in cases where there are key collisions.
239  ///
240  /// \p subidentifier is optional, and it would be used to indicate a
241  /// particular definition in the asset file if the asset contains multiple
242  /// node definitions.
243  ///
244  /// \p shadingSystem is optional, and it is only needed to indicate a
245  /// particular type if the asset file is capable of representing a node
246  /// definition of multiple source types.
247  ///
248  /// Returns a valid node if the asset is parsed successfully using one
249  /// of the registered parser plugins.
250  SDR_API
252  const SdfAssetPath &shaderAsset,
253  const SdrTokenMap &metadata=SdrTokenMap(),
254  const TfToken &subIdentifier=TfToken(),
255  const TfToken &shadingSystem=TfToken());
256 
257  /// Parses the given \p sourceCode string, constructs a SdrShaderNode from
258  /// it and adds it to the registry. The parser to be used is determined
259  /// by the specified \p shadingSystem.
260  ///
261  /// Nodes created from source code using this API can be looked up by the
262  /// unique identifier and sourceType of the returned node.
263  ///
264  /// \p metadata contains additional metadata needed for parsing and
265  /// compiling the source code correctly. This metadata supplements the
266  /// metadata available in \p sourceCode and overrides it cases where there
267  /// are key collisions.
268  ///
269  /// Returns a valid node if the given source code is parsed successfully
270  /// using the parser plugins that is registered for the specified
271  /// \p shadingSystem.
272  SDR_API
274  const std::string &sourceCode,
275  const TfToken &shadingSystem,
276  const SdrTokenMap &metadata=SdrTokenMap());
277 
278  /// Get all shader nodes matching the given identifier (multiple nodes of
279  /// the same identifier, but different shading systems, may exist). If no
280  /// nodes match the identifier, an empty vector is returned.
281  SDR_API
283 
284  /// Get all shader nodes matching the given name. Only nodes matching the
285  /// specified name will be parsed. Optionally, a filter can be specified
286  /// to get just the default version (the default) or all versions of the
287  /// node. If no nodes match an empty vector is returned.
288  SDR_API
290  const std::string& name,
292 
293  /// Get all shader nodes, optionally restricted to the nodes
294  /// that fall under a specified family and/or the default version.
295  ///
296  /// Note that this will parse \em all nodes that the registry is aware of
297  /// (unless a function is specified), so this may take some time to run
298  /// the first time it is called.
299  SDR_API
301  const TfToken& function = TfToken(),
303 
304  /// Get all shader nodes, optionally restricted to the nodes
305  /// that fall under a specified family and/or the default version.
306  ///
307  /// \deprecated
308  /// Deprecated in favor of SdrRegistry::GetShaderNodesByFunction
309  SDR_API
311  const TfToken& family = TfToken(),
313 
314  /// Parses all unparsed shader nodes and returns all shader nodes in the
315  /// registry.
316  ///
317  /// `GetAllShaderNodes`'s first invocation is potentially expensive depending
318  /// on parser plugins and number of nodes in the system.
319  ///
320  /// Results are in no particular order. If ordering is desired, nodes
321  /// ordered by identifier are retrievable via the SdrShaderNodeQuery API.
322  SDR_API
324 
325  /// Get a sorted list of all shader node shading systems that may be present
326  /// on the nodes in the registry.
327  ///
328  /// Shading systems originate from the discovery process, but there is no
329  /// guarantee that the discovered shading systems will also have a registered
330  /// parser plugin. The actual supported shading systems here depend on the
331  /// parsers that are available. Also note that some parser plugins may not
332  /// advertise a shading system.
333  ///
334  /// See the documentation for `SdrParserPlugin` and
335  /// `SdrShaderNode::GetShadingSystem()` for more information.
336  SDR_API
338 
339  /// Get a sorted list of all shader node source types that may be present
340  /// on the nodes in the registry.
341  ///
342  /// \deprecated
343  /// Deprecated in favor of GetAllShaderNodeShadingSystems
344  SDR_API
346 
347  /// Run an SdrShaderNodeQuery.
348  ///
349  /// Note that SdrRegistry::RunQuery will cause all nodes in the registry
350  /// to be parsed in order to examine data on these nodes in their
351  /// final form.
352  SDR_API
354 
355  /// Parses all unparsed shader nodes.
356  ///
357  /// `ParseAll` front-loads node parsing so that subsequent calls to node
358  /// getters don't incur the cost of parsing. `ParseAll`'s first invocation
359  /// is potentially expensive depending on parser plugins and number of nodes
360  /// in the system.
361  SDR_API
362  void ParseAll();
363 
364 protected:
365  // Allow TF to construct the class
366  friend class TfSingleton<SdrRegistry>;
367  SdrRegistry(const SdrRegistry&) = delete;
368  SdrRegistry& operator=(const SdrRegistry&) = delete;
369 
370  SDR_API
371  SdrRegistry();
372 
373  SDR_API
374  ~SdrRegistry();
375 
376 private:
378  friend class _DiscoveryContext;
379 
380  using _TypeToParserPluginMap =
381  std::unordered_map<TfToken, SdrParserPlugin*, TfToken::HashFunctor>;
382 
383  // Node cache data structure, stored SdrShaderNodes keyed by
384  // identifier and shading system.
385  using _ShaderNodeMapKey = std::pair<SdrIdentifier, TfToken>;
386  using _ShaderNodeMap =
387  std::unordered_map<_ShaderNodeMapKey, SdrShaderNodeUniquePtr, TfHash>;
388 
389  // Discovery results data structure, SdrShaderNodeDiscoveryResults
390  // multimap keyed ny identifier
391  using _DiscoveryResultsByIdentifier = std::unordered_multimap<
393  using _DiscoveryResultsByIdentifierRange =
394  std::pair<_DiscoveryResultsByIdentifier::const_iterator,
395  _DiscoveryResultsByIdentifier::const_iterator>;
396 
397  // Discovery results data structure: a multimap of raw pointers to
398  // SdrShaderNodeDiscoveryResults (i.e. pointers to the discovery results
399  // stored in a _DiscoveryResultsByIdentifier) keyed by name.
400  using _DiscoveryResultPtrsByName = std::unordered_multimap<
401  std::string, const SdrShaderNodeDiscoveryResult *, TfHash>;
402  using _DiscoveryResultPtrsByNameRange =
403  std::pair<_DiscoveryResultPtrsByName::const_iterator,
404  _DiscoveryResultPtrsByName::const_iterator>;
405 
406  // The discovery result data structures are not concurrent and must be kept
407  // in sync, thus they need some locking infrastructure.
408  mutable std::mutex _discoveryResultMutex;
409 
410  // The node map is not a concurrent data structure, thus it needs some
411  // locking infrastructure. Ensure that _discoveryResultMutex is not
412  // acquired after _nodeMapMutex is acquired, to avoid deadlock.
413  mutable std::mutex _nodeMapMutex;
414 
415  // Runs each discovery plugin provided and adds the results to the
416  // internal discovery result maps
417  void _RunDiscoveryPlugins(
418  const DiscoveryPluginRefPtrVec& discoveryPlugins);
419 
420  // Takes the discovery and puts in the maps that hold the discovery
421  // results, keeping them in sync.
422  void _AddDiscoveryResultNoLock(SdrShaderNodeDiscoveryResult&& dr);
423 
424  // Finds and instantiates the discovery plugins
425  void _FindAndInstantiateDiscoveryPlugins();
426 
427  // Finds and instantiates the parser plugins
428  void _FindAndInstantiateParserPlugins();
429 
430  // Instantiates the specified parser plugins and adds them to
431  // the registry.
432  void _InstantiateParserPlugins(const std::set<TfType>& parserPluginTypes);
433 
434  // Parses the node for the discovery result if adding it to the node map if
435  // able and adds the discovery result to the discovery result maps.
436  // Intended for the GetShadeNodeFromAsset and GetShaderNodeFromSourceCode
437  // APIs which can add nodes that don't already appear in the discovery
438  // results.
439  SdrShaderNodeConstPtr _ParseNodeFromAssetOrSourceCode(
441 
442  // Implementation helper for getting the first node of the given
443  // shadingSystem in the range of node discovery results for a paricular
444  // identifier.
445  SdrShaderNodeConstPtr _GetNodeInIdentifierRangeWithShadingSystem(
446  _DiscoveryResultsByIdentifierRange range,
447  const TfToken& shadingSystem);
448 
449  // Implementation helper for getting the first node of the given
450  // shadingSystem and matching the given version filter in the range
451  // of node discovery results for a paricular name.
452  SdrShaderNodeConstPtr _GetNodeInNameRangeWithShadingSystem(
453  _DiscoveryResultPtrsByNameRange range, const TfToken& shadingSystem,
455 
456  // Thread-safe find of a shader node in the cache by key.
457  SdrShaderNodeConstPtr _FindNodeInCache(
458  const _ShaderNodeMapKey &key) const;
459 
460  // Thread-safe insertion of a node into the cache with a given key. If a
461  // node with the same key already exists in the cache, the pointer to the
462  // existing node will be returned, otherwise the pointer to pointer to the
463  // inserted node is returned.
464  SdrShaderNodeConstPtr _InsertNodeInCache(
465  _ShaderNodeMapKey &&key, SdrShaderNodeUniquePtr &&node);
466 
467  // Finds an existing node in the node cache for the discovery result if one
468  // exists. Otherwise it parses the new node, inserts it into the cache, and
469  // returns it. If there was an error parsing or validating the node,
470  // `nullptr` will be returned.
471  SdrShaderNodeConstPtr _FindOrParseNodeInCache(
472  const SdrShaderNodeDiscoveryResult& dr);
473 
474  // Return the parser plugin for a discovery type. Returns null if no parser
475  // plugin has that discovery type.
477  _GetParserForDiscoveryType(const TfToken& discoveryType) const;
478 
479  // The discovery plugins that were found through libplug and/or provided by
480  // the client
481  DiscoveryPluginRefPtrVec _discoveryPlugins;
482 
483  // The parser plugins that have been discovered via the plugin system. Maps
484  // a discovery result's "discovery type" to a specific parser.
485  _TypeToParserPluginMap _parserPluginMap;
486 
487  // The parser plugins. This has ownership of the plugin objects.
488  std::vector<std::unique_ptr<SdrParserPlugin>> _parserPlugins;
489 
490  // The preliminary discovery results prior to parsing. These are stored
491  // in a multimap by identifier and a multimap by name. If accessing or
492  // mutating, _discoveryResultMutex should be used.
493  _DiscoveryResultsByIdentifier _discoveryResultsByIdentifier;
494  _DiscoveryResultPtrsByName _discoveryResultPtrsByName;
495 
496  // Set of all possible shading systems as determined by the existing
497  // discovery results. Populated along with the discovery result multimaps.
498  // If accessing or mutating, _discoveryResultMutex should be used.
499  TfToken::Set _allShadingSystems;
500 
501  // Maps a node's identifier and source type to a node instance. If accessing
502  // or mutating, _nodeMapMutex should be used.
503  _ShaderNodeMap _nodeMap;
504 };
505 
507 
508 #endif // PXR_USD_SDR_REGISTRY_H
GLenum query
Definition: glad.h:2772
std::vector< std::string > SdrStringVec
Definition: declare.h:61
SDR_API SdrShaderNodeQueryResult RunQuery(const SdrShaderNodeQuery &query)
SdrDiscoveryPluginRefPtrVector DiscoveryPluginRefPtrVec
Definition: registry.h:49
SdrVersionFilter
Enumeration used to select nodes by version.
Definition: declare.h:183
GLenum GLint * range
Definition: glcorearb.h:1925
SDR_API SdrShaderNodeConstPtr GetShaderNodeByIdentifier(const SdrIdentifier &identifier, const SdrTokenVec &shadingSystemPriority=SdrTokenVec())
SDR_API SdrShaderNodeConstPtr GetShaderNodeFromSourceCode(const std::string &sourceCode, const TfToken &shadingSystem, const SdrTokenMap &metadata=SdrTokenMap())
SDR_API SdrShaderNodeConstPtr GetShaderNodeByName(const std::string &name, const SdrTokenVec &shadingSystemPriority=SdrTokenVec(), SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
SdrRegistry & operator=(const SdrRegistry &)=delete
#define PXR_NAMESPACE_OPEN_SCOPE
Definition: pxr.h:73
SDR_API SdrShaderNodePtrVec GetShaderNodesByFunction(const TfToken &function=TfToken(), SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
static SDR_API SdrRegistry & GetInstance()
Get the single SdrRegistry instance.
std::vector< SdrIdentifier > SdrIdentifierVec
Definition: declare.h:34
SdrShaderNode const * SdrShaderNodeConstPtr
Definition: declare.h:45
SDR_API SdrShaderNodeConstPtr GetShaderNodeFromAsset(const SdfAssetPath &shaderAsset, const SdrTokenMap &metadata=SdrTokenMap(), const TfToken &subIdentifier=TfToken(), const TfToken &shadingSystem=TfToken())
Definition: hash.h:472
SDR_API ~SdrRegistry()
SDR_API SdrStringVec GetSearchURIs() const
SdrShaderNodeConstPtrVec SdrShaderNodePtrVec
Definition: declare.h:48
Definition: token.h:70
SDR_API SdrShaderNodeConstPtr GetShaderNodeByNameAndSystem(const std::string &name, const TfToken &shadingSystem, SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
SDR_API SdrShaderNodePtrVec GetAllShaderNodes()
SDR_API SdrShaderNodeConstPtr GetShaderNodeByIdentifierAndType(const SdrIdentifier &identifier, const TfToken &nodeType)
SDR_API void AddDiscoveryResult(SdrShaderNodeDiscoveryResult &&discoveryResult)
SDR_API void SetExtraParserPlugins(const std::vector< TfType > &pluginTypes)
GLuint const GLchar * name
Definition: glcorearb.h:786
SDR_API SdrTokenVec GetAllShaderNodeShadingSystems() const
SDR_API SdrShaderNodeConstPtr GetShaderNodeByNameAndType(const std::string &name, const TfToken &nodeType, SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
SDR_API SdrShaderNodePtrVec GetShaderNodesByIdentifier(const SdrIdentifier &identifier)
SDR_API SdrTokenVec GetAllShaderNodeSourceTypes() const
SDR_API void ParseAll()
std::unique_ptr< SdrShaderNode > SdrShaderNodeUniquePtr
Definition: declare.h:46
friend class _DiscoveryContext
Definition: registry.h:377
#define PXR_NAMESPACE_CLOSE_SCOPE
Definition: pxr.h:74
SDR_API SdrRegistry()
std::vector< TfToken > SdrTokenVec
Definition: declare.h:39
SdrShaderNodeQueryResult stores the results of an SdrShaderNodeQuery.
SDR_API SdrStringVec GetShaderNodeNames(const TfToken &function=TfToken()) const
SDR_API SdrIdentifierVec GetShaderNodeIdentifiers(const TfToken &function=TfToken(), SdrVersionFilter filter=SdrVersionFilterDefaultOnly) const
SDR_API void SetExtraDiscoveryPlugins(DiscoveryPluginRefPtrVec plugins)
#define SDR_API
Definition: api.h:23
SDR_API SdrShaderNodePtrVec GetShaderNodesByName(const std::string &name, SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
std::unordered_map< TfToken, std::string, TfToken::HashFunctor > SdrTokenMap
Definition: declare.h:41
std::set< TfToken, TfTokenFastArbitraryLessThan > Set
Definition: token.h:166
SDR_API SdrShaderNodePtrVec GetShaderNodesByFamily(const TfToken &family=TfToken(), SdrVersionFilter filter=SdrVersionFilterDefaultOnly)
SDR_API SdrShaderNodeConstPtr GetShaderNodeByIdentifierAndSystem(const SdrIdentifier &identifier, const TfToken &shadingSystem)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glcorearb.h:1297