dataManagerBasedExecutor.h
Go to the documentation of this file.
1 //
2 // Copyright 2025 Pixar
3 //
4 // Licensed under the terms set forth in the LICENSE.txt file available at
5 // https://openusd.org/license.
6 //
7 #ifndef PXR_EXEC_VDF_DATA_MANAGER_BASED_EXECUTOR_H
8 #define PXR_EXEC_VDF_DATA_MANAGER_BASED_EXECUTOR_H
9 
11 
12 #include "pxr/pxr.h"
13 
15 #include "pxr/exec/vdf/output.h"
16 #include "pxr/exec/vdf/vector.h"
17 
18 PXR_NAMESPACE_OPEN_SCOPE
19 
29 
30 template<typename DataManagerType, typename BaseClass>
31 class VdfDataManagerBasedExecutor : public BaseClass
32 {
33 public:
34 
38 
42  const VdfExecutorInterface *parentExecutor) :
43  BaseClass(parentExecutor)
44  {}
45 
49 
52  virtual void Resize(const VdfNetwork &network) override {
53  _dataManager.Resize(network);
54  }
55 
61  virtual void SetOutputValue(
62  const VdfOutput &output,
63  const VdfVector &value,
64  const VdfMask &mask) override {
65  _dataManager.SetOutputValue(output, value, mask);
66  }
67 
70  virtual bool TakeOutputValue(
71  const VdfOutput &output,
72  VdfVector *value,
73  const VdfMask &mask) override {
74  return _dataManager.TakeOutputValue(output, value, mask);
75  }
76 
80  virtual void DuplicateOutputData(
81  const VdfOutput &sourceOutput,
82  const VdfOutput &destOutput) override {
83  _dataManager.DuplicateOutputData(sourceOutput, destOutput);
84  }
85 
88  virtual bool IsEmpty() const override {
89  return _dataManager.IsEmpty();
90  }
91 
96  const VdfOutput &source,
97  const VdfOutput &dest) const override {
98  return _dataManager.HasInvalidationTimestampMismatch(
99  _dataManager.GetDataHandle(source.GetId()),
100  _dataManager.GetDataHandle(dest.GetId()));
101  }
102 
103 protected:
104 
107  virtual const VdfVector *_GetInputValue(
108  const VdfConnection &connection,
109  const VdfMask &mask) const override {
110  return _dataManager.GetInputValue(connection, mask);
111  }
112 
116  const VdfOutput &output,
117  const VdfMask &mask) const override {
118  return _dataManager.GetOutputValueForReading(
119  _dataManager.GetDataHandle(output.GetId()), mask);
120  }
121 
125  const VdfOutput &output) const override {
126  return _dataManager.GetOrCreateOutputValueForWriting(
127  output, _dataManager.GetDataHandle(output.GetId()));
128  }
129 
133  const VdfId outputId, const VdfId nodeId) override {
134  _dataManager.ClearDataForOutput(outputId);
135  }
136 
140  virtual bool _IsOutputInvalid(
141  const VdfId outputId,
142  const VdfMask &invalidationMask) const override {
143  return _dataManager.IsOutputInvalid(outputId, invalidationMask);
144  }
145 
156  virtual bool _InvalidateOutput(
157  const VdfOutput &output,
158  const VdfMask &invalidationMask) override
159  {
160  return _dataManager.InvalidateOutput(output, invalidationMask);
161  }
162 
167  virtual void _UpdateInvalidationTimestamp() override
168  {
169  _dataManager.UpdateInvalidationTimestamp(
170  BaseClass::GetExecutorInvalidationTimestamp());
171  }
172 
177  const VdfOutput &destOutput,
178  const VdfOutput &sourceOutput,
179  const VdfMask &sourceMask) const override {
180  // XXX: We are getting the cached output value from the executor, which
181  // may give us a pointer into the parent executor data manager. We
182  // cannot take ownership of values stored outside of this
183  // executor's data manager. We have to come up with a way to
184  // support reference outputs as a core concept!
185  const VdfVector *sourceValue =
186  _GetOutputValueForReading(sourceOutput, sourceMask);
187  _dataManager.SetReferenceOutputValue(sourceValue, destOutput.GetId());
188  }
189 
194  virtual void _TouchOutput(const VdfOutput &output) const override
195  {
196  _dataManager.DataManagerType::Base::Touch(output);
197  }
198 
199 
200 protected:
201 
202  // This object manages the data needed for this executor, including all
203  // the cached output values.
204  DataManagerType _dataManager;
205 };
206 
207 PXR_NAMESPACE_CLOSE_SCOPE
208 
209 #endif
A VdfNetwork is a collection of VdfNodes and their connections.
Definition: network.h:59
virtual bool TakeOutputValue(const VdfOutput &output, VdfVector *value, const VdfMask &mask) override
Transfers the value to the given output.
A class that fully represents a connection between two VdfNodes.
Definition: connection.h:29
Base class for executors that use a data manager.
VdfId GetId() const
The unique id of this output.
Definition: output.h:100
virtual void _TouchOutput(const VdfOutput &output) const override
Mark the output as having been visited.
virtual void DuplicateOutputData(const VdfOutput &sourceOutput, const VdfOutput &destOutput) override
Duplicates the output data associated with sourceOutput and copies it to destOutput.
A VdfMask is placed on connections to specify the data flowing through them.
Definition: mask.h:36
virtual void SetOutputValue(const VdfOutput &output, const VdfVector &value, const VdfMask &mask) override
Sets the cached value for a given output.
This class is used to abstract away knowledge of the cache data used for each node.
Definition: vector.h:58
VdfDataManagerBasedExecutor()
Default constructor.
virtual bool HasInvalidationTimestampMismatch(const VdfOutput &source, const VdfOutput &dest) const override
Returns true, if the invalidation timestamps between the source and dest outputs do not match,...
virtual VdfVector * _GetOutputValueForWriting(const VdfOutput &output) const override
Returns an output value for writing.
virtual const VdfVector * _GetInputValue(const VdfConnection &connection, const VdfMask &mask) const override
Returns value for the cache that flows across connection.
virtual void _UpdateInvalidationTimestamp() override
Called before invalidation begins to update the timestamp that will be written for every VdfOutput vi...
virtual bool _InvalidateOutput(const VdfOutput &output, const VdfMask &invalidationMask) override
Called during invalidation to mark outputs as invalid and determine when the traversal can terminate ...
virtual ~VdfDataManagerBasedExecutor()
Destructor.
virtual bool IsEmpty() const override
Returns true of the data manager is empty.
VdfDataManagerBasedExecutor(const VdfExecutorInterface *parentExecutor)
Construct with a parent executor.
A VdfOutput represents an output on a node.
Definition: output.h:31
void _ClearDataForOutput(const VdfId outputId, const VdfId nodeId) override
Clears the buffer data for a specific output on this executor.
virtual void Resize(const VdfNetwork &network) override
Resize the executor data manager to accommodate the given network.
virtual const VdfVector * _GetOutputValueForReading(const VdfOutput &output, const VdfMask &mask) const override
Returns an output value for reading.
virtual bool _IsOutputInvalid(const VdfId outputId, const VdfMask &invalidationMask) const override
Returns true if the output is already invalid for the given invalidationMask.
Abstract base class for classes that execute a VdfNetwork to compute a requested set of values.
virtual void _SetReferenceOutputValue(const VdfOutput &destOutput, const VdfOutput &sourceOutput, const VdfMask &sourceMask) const override
Called to set destOutput's buffer output to be a reference to the buffer output of sourceOutput.
uint64_t VdfId
The unique identifier type for Vdf objects.
Definition: types.h:107