7#ifndef PXR_EXEC_VDF_EXECUTOR_DATA_MANAGER_H
8#define PXR_EXEC_VDF_EXECUTOR_DATA_MANAGER_H
23PXR_NAMESPACE_OPEN_SCOPE
46template<
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)
235template<
typename DerivedClass>
252 return GetOutputValueForReading(
253 Base::_GetDataHandle(readOutput.
GetId()), mask);
256template<
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()
287template<
typename DerivedClass>
294 if (!Base::_IsValidDataHandle(handle)) {
305 return CreateOutputCache(output, bufferData);
308template<
typename DerivedClass>
319 const DataHandle handle = Base::_GetOrCreateDataHandle(output.
GetId());
326 outputValue = CreateOutputCache(output, bufferData);
331 Base::_Touch(handle);
335 const bool mergeData =
343 outputValue->
Merge(value, mask);
345 outputValue->
Copy(value, mask);
349 SetComputedOutputMask(bufferData, mergeData ? cacheMask | mask : mask);
352template<
typename DerivedClass>
363 const DataHandle handle = Base::_GetOrCreateDataHandle(output.
GetId());
377 Base::_Touch(handle);
383template<
typename DerivedClass>
387 const VdfId destOutputId)
const
389 const DataHandle handle = Base::_GetDataHandle(destOutputId);
398template<
typename DerivedClass>
413template<
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)) {
458template<
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);
481template<
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(
549template<
typename DerivedClass>
553 Base::_Touch(Base::_GetOrCreateDataHandle(output.
GetId()));
556template<
typename DerivedClass>
584 "Vdf",
"VdfExecutorDataManager<DerivedClass>::PassBuffer (keep)");
588 VdfVector *keptValue = CreateOutputCache(fromOutput, fromBuffer);
595 keptValue->
Copy(*result, keepMask);
607template<
typename DerivedClass>
626 Base::_IsValidDataHandle(sourceHandle) &&
627 Base::_IsValidDataHandle(destHandle) &&
628 Base::_GetInvalidationTimestamp(destHandle) ==
629 _invalidationTimestamp &&
630 Base::_GetInvalidationTimestamp(sourceHandle) !=
631 _invalidationTimestamp;
634PXR_NAMESPACE_CLOSE_SCOPE
The interface contract for the static polymorphism used by executor data manager implementations.
A class that fully represents a connection between two VdfNodes.
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.
This object is responsible for storing the executor buffer data, comprised of the executor cache vect...
void ResetExecutorCache(const VdfMask &mask)
Reset the executor cache without releasing any memory and set the executor cache mask to mask.
VdfVector * SwapExecutorCache(VdfExecutorBufferData *rhs)
Swaps the executor cache at this buffer, with that of another buffer.
const VdfMask & GetExecutorCacheMask() const
Get the available mask.
VdfVector * GetExecutorCache() const
Returns the executor cache stored at this buffer data instance.
void TakeOwnership(VdfVector *v)
Assumes ownership of the given vector.
VdfVector * CreateExecutorCache(const VdfOutputSpec &spec)
Creates a new executor cache for this buffer.
void SetExecutorCacheMask(const VdfMask &mask)
Sets the available mask.
void YieldOwnership()
Yields ownership of the internal vector, i.e.
This class provides functionality to manage the executor specific data associated with each output in...
VdfInvalidationTimestamp GetInvalidationTimestamp() const
Returns the current invalidation timestamp on this executor.
bool IsOutputInvalid(const VdfId outputId, const VdfMask &invalidationMask) const
Returns true if the output is already invalid for the given invalidationMask.
Vdf_ExecutorDataManagerInterface< DerivedClass, DataHandle > Base
The base class type.
VdfVector * GetOutputValueForReading(const DataHandle handle, const VdfMask &mask) const
Returns the cached value for a given output and mask.
~VdfExecutorDataManager()=default
Prevent destruction via base class pointers (static polymorphism only).
bool HasInvalidationTimestampMismatch(const DataHandle sourceHandle, const DataHandle destHandle) const
Returns true, if the invalidation timestamps between sourceData and destData do not match,...
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.
const VdfVector * GetInputValue(const VdfConnection &connection, const VdfMask &mask) const
Returns the input value flowing across the given connection with the given mask.
void SetComputedOutputMask(VdfExecutorBufferData *bufferData, const VdfMask &mask)
Marks the output whose data is bufferData as computed for the entries in mask.
VdfExecutorDataManager()
Constructor.
void Touch(const VdfOutput &output) const
Marks the data at the given output as having been touched by evaluation.
void UpdateInvalidationTimestamp(VdfInvalidationTimestamp timestamp)
Increments the the current invalidation timestamp on this executor.
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.
VdfVector * GetOrCreateOutputValueForWriting(const VdfOutput &output, const DataHandle handle) const
Returns a new or existing output value for writing data into.
void DuplicateOutputData(const VdfOutput &sourceOutput, const VdfOutput &destOutput)
Duplicates the output data associated with sourceOutput and copies it to destOutput.
void SetReferenceOutputValue(const VdfVector *sourceValue, const VdfId destOutputId) const
Called to set destOutput's buffer output to be a reference to the sourceValue.
Vdf_ExecutorDataManagerTraits< DerivedClass >::DataHandle DataHandle
The data handle type defined via the specialized traits class.
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...
VdfVector * CreateOutputCache(const VdfOutput &output, VdfExecutorBufferData *bufferData) const
Creates a new cache for an output, given the output data object.
bool InvalidateOutput(const VdfOutput &output, const VdfMask &invalidationMask)
Marks output as invalid.
A VdfMask is placed on connections to specify the data flowing through them.
bool IsAnySet() const
Returns true, if there is at least a single set entry.
bool IsAllZeros() const
Returns true if this mask has all entries unset.
bool IsEmpty() const
Returns true if this mask is empty, i.e.
A VdfNetwork is a collection of VdfNodes and their connections.
const VdfNetwork & GetNetwork() const
Returns the network to which this node belongs.
A VdfOutput represents an output on a node.
const VdfNode & GetNode() const
Returns the owning node for this output.
VdfId GetId() const
The unique id of this output.
VDF_API const VdfOutputSpec & GetSpec() const
Returns the connector specification object for this output.
VdfSMBLData holds per-output data that is meant to be consumed by the executor.
This class is used to abstract away knowledge of the cache data used for each node.
bool IsEmpty() const
Returns whether or not this vector is empty.
void Copy(const VdfVector &rhs, const VdfMask &mask)
Copies the contents of rhs into this vector.
VDF_API void Merge(const VdfVector &rhs, const VdfMask::Bits &bits)
Merges the contents of rhs into this vector.
uint64_t VdfId
The unique identifier type for Vdf objects.
unsigned int VdfInvalidationTimestamp
Type of the timestamp that identifies the most recent round of invalidation.
#define TF_DEV_AXIOM(cond)
The same as TF_AXIOM, but compiled only in dev builds.
bool Vdf_IsPoolOutput(const VdfOutput &output)
Returns true if output is a pool output, i.e., an output that has an associated input,...
Forward definition of the traits class, which will be specialized by the derived data manager impleme...