7 #ifndef PXR_EXEC_VDF_EXECUTOR_DATA_MANAGER_H 8 #define PXR_EXEC_VDF_EXECUTOR_DATA_MANAGER_H 23 PXR_NAMESPACE_OPEN_SCOPE
46 template<
typename DerivedClass>
50 typename Vdf_ExecutorDataManagerTraits<DerivedClass>::DataHandle>
118 const VdfId destOutputId)
const;
152 const VdfId outputId,
153 const VdfMask &invalidationMask)
const;
161 const VdfMask &invalidationMask);
171 _invalidationTimestamp = timestamp;
177 return _invalidationTimestamp;
216 _invalidationTimestamp(
217 VdfExecutorInvalidationData::InitialInvalidationTimestamp + 1)
235 template<
typename DerivedClass>
252 return GetOutputValueForReading(
253 Base::_GetDataHandle(readOutput.
GetId()), mask);
256 template<
typename DerivedClass>
273 const bool hasValue =
274 Base::_IsValidDataHandle(handle) &&
275 Base::_GetBufferData(handle)->GetExecutorCache() &&
277 (Base::_GetBufferData(handle)
278 ->GetExecutorCacheMask().IsAnySet() &&
279 Base::_GetBufferData(handle)
280 ->GetExecutorCacheMask().Contains(mask)));
283 ? Base::_GetBufferData(handle)->GetExecutorCache()
287 template<
typename DerivedClass>
294 if (!Base::_IsValidDataHandle(handle)) {
305 return CreateOutputCache(output, bufferData);
308 template<
typename DerivedClass>
319 const DataHandle handle = Base::_GetOrCreateDataHandle(output.
GetId());
323 VdfVector *outputValue = bufferData->GetExecutorCache();
326 outputValue = CreateOutputCache(output, bufferData);
331 Base::_Touch(handle);
334 const VdfMask &cacheMask = bufferData->GetExecutorCacheMask();
335 const bool mergeData =
343 outputValue->
Merge(value, mask);
345 outputValue->
Copy(value, mask);
349 SetComputedOutputMask(bufferData, mergeData ? cacheMask | mask : mask);
352 template<
typename DerivedClass>
363 const DataHandle handle = Base::_GetOrCreateDataHandle(output.
GetId());
367 if (bufferData->GetExecutorCache()) {
372 bufferData->TakeOwnership(value);
373 bufferData->SetExecutorCacheMask(mask);
377 Base::_Touch(handle);
383 template<
typename DerivedClass>
387 const VdfId destOutputId)
const 389 const DataHandle handle = Base::_GetDataHandle(destOutputId);
398 template<
typename DerivedClass>
413 template<
typename DerivedClass>
421 const DataHandle sourceHandle = Base::_GetDataHandle(sourceOutput.
GetId());
422 if (!Base::_IsValidDataHandle(sourceHandle)) {
432 Base::_GetOrCreateDataHandle(destOutput.
GetId());
435 Base::_GetBufferData(sourceHandle)->Clone(Base::_GetBufferData(destHandle));
438 Base::_GetInvalidationData(sourceHandle)->Clone(
439 Base::_GetInvalidationData(destHandle));
442 Base::_SetInvalidationTimestamp(
443 destHandle, Base::_GetInvalidationTimestamp(sourceHandle));
446 Base::_Untouch(destHandle);
447 if (Base::_Untouch(sourceHandle)) {
448 Base::_Touch(sourceHandle);
449 Base::_Touch(destHandle);
453 if (
VdfSMBLData *smblData = Base::_GetSMBLData(destHandle)) {
458 template<
typename DerivedClass>
461 const VdfId outputId,
462 const VdfMask &invalidationMask)
const 466 const DataHandle handle = Base::_GetDataHandle(outputId);
467 if (!Base::_IsValidDataHandle(handle)) {
474 const bool wasTouched = Base::_IsTouched(handle);
477 Base::_GetInvalidationData(handle)->IsInvalid(
478 invalidationMask, wasTouched);
481 template<
typename DerivedClass>
485 const VdfMask &invalidationMask)
491 if (!Base::_IsValidDataHandle(handle)) {
498 const bool didInvalidate = Base::_GetInvalidationData(handle)->Invalidate(
499 invalidationMask, Base::_Untouch(handle));
507 Base::_SetInvalidationTimestamp(handle, GetInvalidationTimestamp());
523 Base::_GetOrCreateSMBLData(handle)->InvalidateCacheMask(
549 template<
typename DerivedClass>
553 Base::_Touch(Base::_GetOrCreateDataHandle(output.
GetId()));
556 template<
typename DerivedClass>
584 "Vdf",
"VdfExecutorDataManager<DerivedClass>::PassBuffer (keep)");
588 VdfVector *keptValue = CreateOutputCache(fromOutput, fromBuffer);
595 keptValue->
Copy(*result, keepMask);
607 template<
typename DerivedClass>
626 Base::_IsValidDataHandle(sourceHandle) &&
627 Base::_IsValidDataHandle(destHandle) &&
628 Base::_GetInvalidationTimestamp(destHandle) ==
629 _invalidationTimestamp &&
630 Base::_GetInvalidationTimestamp(sourceHandle) !=
631 _invalidationTimestamp;
634 PXR_NAMESPACE_CLOSE_SCOPE
#define TF_DEV_AXIOM(cond)
The same as TF_AXIOM, but compiled only in dev builds.
A VdfNetwork is a collection of VdfNodes and their connections.
A class that fully represents a connection between two VdfNodes.
const VdfNetwork & GetNetwork() const
Returns the network to which this node belongs.
VdfId GetId() const
The unique id of this output.
bool TakeOutputValue(const VdfOutput &output, VdfVector *value, const VdfMask &mask)
Transfers ownership of value to the given output, returning true if the transfer of ownership succeed...
bool IsEmpty() const
Returns whether or not this vector is empty.
Vdf_ExecutorDataManagerTraits< DerivedClass >::DataHandle DataHandle
The data handle type defined via the specialized traits class.
void DuplicateOutputData(const VdfOutput &sourceOutput, const VdfOutput &destOutput)
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.
void UpdateInvalidationTimestamp(VdfInvalidationTimestamp timestamp)
Increments the the current invalidation timestamp on this executor.
VDF_API void Merge(const VdfVector &rhs, const VdfMask::Bits &bits)
Merges the contents of rhs into this vector.
This class provides functionality to manage the executor specific data associated with each output in...
This class is used to abstract away knowledge of the cache data used for each node.
Vdf_ExecutorDataManagerInterface< DerivedClass, DataHandle > Base
The base class type.
const VdfMask & GetExecutorCacheMask() const
Get the available mask.
~VdfExecutorDataManager()=default
Prevent destruction via base class pointers (static polymorphism only).
VDF_API const VdfOutputSpec & GetSpec() const
Returns the connector specification object for this output.
const VdfOutput & GetSourceOutput() const
Returns the output (ie. source) for this connection.
const VdfInput & GetTargetInput() const
Returns the input connector (ie. target) for this connection.
void ResetExecutorCache(const VdfMask &mask)
Reset the executor cache without releasing any memory and set the executor cache mask to mask.
void SetComputedOutputMask(VdfExecutorBufferData *bufferData, const VdfMask &mask)
Marks the output whose data is bufferData as computed for the entries in mask.
VdfVector * CreateOutputCache(const VdfOutput &output, VdfExecutorBufferData *bufferData) const
Creates a new cache for an output, given the output data object.
VdfVector * GetExecutorCache() const
Returns the executor cache stored at this buffer data instance.
bool Vdf_IsPoolOutput(const VdfOutput &output)
Returns true if output is a pool output, i.e., an output that has an associated input,...
VdfSMBLData holds per-output data that is meant to be consumed by the executor.
void Touch(const VdfOutput &output) const
Marks the data at the given output as having been touched by evaluation.
bool IsAllZeros() const
Returns true if this mask has all entries unset.
This object is responsible for storing the executor buffer data, comprised of the executor cache vect...
bool IsOutputInvalid(const VdfId outputId, const VdfMask &invalidationMask) const
Returns true if the output is already invalid for the given invalidationMask.
void YieldOwnership()
Yields ownership of the internal vector, i.e.
VdfVector * PassBuffer(const VdfOutput &fromOutput, VdfExecutorBufferData *fromBuffer, const VdfOutput &toOutput, VdfExecutorBufferData *toBuffer, const VdfMask &keepMask)
This method is called to pass a buffer from fromOutput to toOutput.
bool IsAnySet() const
Returns true, if there is at least a single set entry.
VdfVector * SwapExecutorCache(VdfExecutorBufferData *rhs)
Swaps the executor cache at this buffer, with that of another buffer.
void SetExecutorCacheMask(const VdfMask &mask)
Sets the available mask.
A VdfOutput represents an output on a node.
const VdfNode & GetNode() const
Returns the owning node for this output.
const VdfVector * GetInputValue(const VdfConnection &connection, const VdfMask &mask) const
Returns the input value flowing across the given connection with the given mask.
VdfVector * CreateExecutorCache(const VdfOutputSpec &spec)
Creates a new executor cache for this buffer.
The interface contract for the static polymorphism used by executor data manager implementations.
VdfExecutorDataManager()
Constructor.
unsigned int VdfInvalidationTimestamp
Type of the timestamp that identifies the most recent round of invalidation.
void Copy(const VdfVector &rhs, const VdfMask &mask)
Copies the contents of rhs into this vector.
VdfInvalidationTimestamp GetInvalidationTimestamp() const
Returns the current invalidation timestamp on this executor.
bool HasInvalidationTimestampMismatch(const DataHandle sourceHandle, const DataHandle destHandle) const
Returns true, if the invalidation timestamps between sourceData and destData do not match,...
VdfVector * GetOrCreateOutputValueForWriting(const VdfOutput &output, const DataHandle handle) const
Returns a new or existing output value for writing data into.
void SetOutputValue(const VdfOutput &output, const VdfVector &value, const VdfMask &mask)
Sets the cached value for a given output, creating the output cache if necessary.
bool IsEmpty() const
Returns true if this mask is empty, i.e.
VdfVector * GetOutputValueForReading(const DataHandle handle, const VdfMask &mask) const
Returns the cached value for a given output and mask.
void SetReferenceOutputValue(const VdfVector *sourceValue, const VdfId destOutputId) const
Called to set destOutput's buffer output to be a reference to the sourceValue.
bool InvalidateOutput(const VdfOutput &output, const VdfMask &invalidationMask)
Marks output as invalid.
Forward definition of the traits class, which will be specialized by the derived data manager impleme...
uint64_t VdfId
The unique identifier type for Vdf objects.