7#ifndef PXR_EXEC_VDF_PARALLEL_EXECUTOR_DATA_MANAGER_H
8#define PXR_EXEC_VDF_PARALLEL_EXECUTOR_DATA_MANAGER_H
18#include "pxr/exec/vdf/parallelExecutorDataManagerInterface.h"
22PXR_NAMESPACE_OPEN_SCOPE
41template <
typename DerivedClass >
45 typename Vdf_ParallelExecutorDataManagerTraits<DerivedClass>::DataHandle
123 const VdfId destOutputId)
const;
153 const VdfId outputId,
154 const VdfMask &invalidationMask)
const;
165 const VdfMask &invalidationMask);
178 _invalidationTimestamp = timestamp;
184 return _invalidationTimestamp;
200 _invalidationTimestamp(
201 VdfExecutorInvalidationData::InitialInvalidationTimestamp + 1)
226template<
typename DerivedClass>
242 return GetOutputValueForReading(
253 return Base::_IsValidDataHandle(dataHandle)
254 ? _GetOutputValueForReading(
255 Base::_GetPrivateBufferData(dataHandle), mask)
259template<
typename DerivedClass>
271 if (!Base::_IsValidDataHandle(dataHandle)) {
277 if (
VdfVector *value = _GetOutputValueForReading(publicData, mask)) {
283 Base::_GetTransferredBufferData(dataHandle);
285 ? _GetOutputValueForReading(transferData, mask)
289template<
typename DerivedClass>
296 if (!Base::_IsValidDataHandle(handle)) {
310 return CreateOutputCache(output, bufferData);
313template <
typename DerivedClass >
326 Base::_Touch(outputId);
329 const DataHandle handle = Base::_GetOrCreateDataHandle(outputId);
336 const bool mergeData =
344 const VdfMask privateMask = publicMask | mask;
347 outputValue->
Merge(*publicValue, publicMask - mask);
348 outputValue->
Merge(value, mask);
353 outputValue->
Copy(value, mask);
360 Base::_PublishPrivateBufferData(handle);
363template <
typename DerivedClass >
376 Base::_Touch(outputId);
379 const DataHandle handle = Base::_GetOrCreateDataHandle(outputId);
382 return Base::_TransferBufferData(handle, value, mask);
385template <
typename DerivedClass >
389 const VdfId destOutputId)
const
391 const DataHandle handle = Base::_GetDataHandle(destOutputId);
400template <
typename DerivedClass >
407 "Vdf",
"VdfParallelExecutorDataManager::CreateOutputCache");
417template <
typename DerivedClass >
425 "Vdf",
"VdfParallelExecutorDataManager::CreateOutputCache");
435template <
typename DerivedClass >
447 const VdfId destOutputId = destOutput.
GetId();
448 const VdfId sourceOutputId = sourceOutput.
GetId();
449 Base::_Untouch(destOutputId);
450 if (Base::_Untouch(sourceOutputId)) {
451 Base::_Touch(sourceOutputId);
452 Base::_Touch(destOutputId);
457 const DataHandle sourceHandle = Base::_GetDataHandle(sourceOutputId);
458 if (!Base::_IsValidDataHandle(sourceHandle)) {
463 const DataHandle destHandle = Base::_GetOrCreateDataHandle(destOutputId);
466 Base::_GetPublicBufferData(sourceHandle)->Clone(
467 Base::_GetPublicBufferData(destHandle));
470 Base::_GetInvalidationData(sourceHandle)->Clone(
471 Base::_GetInvalidationData(destHandle));
474 Base::_SetInvalidationTimestamp(
475 destHandle, Base::_GetInvalidationTimestamp(sourceHandle));
478template <
typename DerivedClass >
481 const VdfId outputId,
482 const VdfMask &invalidationMask)
const
485 const bool wasTouched = Base::_IsTouched(outputId);
492 const DataHandle handle = Base::_GetDataHandle(outputId);
493 if (!Base::_IsValidDataHandle(handle)) {
499 return Base::_GetInvalidationData(handle)->IsInvalid(
500 invalidationMask, wasTouched);
503template <
typename DerivedClass >
507 const VdfMask &invalidationMask)
513 const bool wasTouched = Base::_Untouch(outputId);
517 ? Base::_GetOrCreateDataHandle(outputId)
518 : Base::_GetDataHandle(outputId);
522 if (!Base::_IsValidDataHandle(handle)) {
529 const bool didInvalidate = Base::_GetInvalidationData(handle)->Invalidate(
530 invalidationMask, wasTouched);
538 Base::_SetInvalidationTimestamp(handle, GetInvalidationTimestamp());
576 Base::_ResetTransferredBufferData(handle);
586template <
typename DerivedClass >
591 Base::_Touch(output.
GetId());
594template <
typename DerivedClass >
613 Base::_IsValidDataHandle(sourceHandle) &&
614 Base::_IsValidDataHandle(destHandle) &&
615 Base::_GetInvalidationTimestamp(sourceHandle) !=
616 _invalidationTimestamp &&
617 Base::_GetInvalidationTimestamp(destHandle) ==
618 _invalidationTimestamp;
621template <
typename DerivedClass >
639 const bool hasValue =
645 return hasValue ? value :
nullptr;
648PXR_NAMESPACE_CLOSE_SCOPE
Fast, compressed bit array which is capable of performing logical operations without first decompress...
The interface contract for the static polymorphism used by parallel executor data manager implementat...
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.
const VdfMask & GetExecutorCacheMask() const
Get the available mask.
VdfVector * GetExecutorCache() const
Returns the executor cache stored at this buffer data instance.
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.
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.
VdfMask::Bits const & GetBits() const
Get this mask's content as CtCompressedfBits.
bool Contains(const VdfMask &mask) const
Returns true if mask is a subset-of or equal to this mask, false otherwise.
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.
This class provides functionality to manage executor data stored as VdfExecutorData from multiple thr...
static VdfVector * CreateOutputCache(const VdfOutput &output, VdfExecutorBufferData *bufferData, const VdfMask::Bits &bits)
Creates a new cache for an output, given the output data object.
bool IsOutputInvalid(const VdfId outputId, const VdfMask &invalidationMask) const
Returns true if the output is already invalid for the given invalidationMask.
Vdf_ParallelExecutorDataManagerTraits< DerivedClass >::DataHandle DataHandle
The data handle type defined via the specialized traits class.
~VdfParallelExecutorDataManager()
Prevent destruction via base class pointers (static polymorphism only).
VdfVector * GetInputValue(const VdfConnection &connection, const VdfMask &mask) const
Returns the input value flowing across the given connection with the given mask.
VdfParallelExecutorDataManager()
Constructor.
const VdfInvalidationTimestamp & GetInvalidationTimestamp() const
Returns the current invalidation timestamp on this executor.
void UpdateInvalidationTimestamp(const VdfInvalidationTimestamp ×tamp)
Increments the the current invalidation timestamp on this executor.
static VdfVector * CreateOutputCache(const VdfOutput &output, VdfExecutorBufferData *bufferData)
Creates a new cache for an output, given the output data object.
Vdf_ParallelExecutorDataManagerInterface< DerivedClass, DataHandle > Base
The base class type.
void Touch(const VdfOutput &output) const
Marks the data at the given output as having been touched by evaluation.
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 * GetOutputValueForReading(const DataHandle dataHandle, const VdfMask &mask) const
Returns the cached value for a given output and mask.
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.
bool TakeOutputValue(const VdfOutput &output, VdfVector *value, const VdfMask &mask)
Transfers the ownership of value to the given output.
bool InvalidateOutput(const VdfOutput &output, const VdfMask &invalidationMask)
Marks output as invalid.
bool HasInvalidationTimestampMismatch(const DataHandle &sourceHandle, const DataHandle &destHandle) const
Returns true, if the invalidation timestamps between sourceExecutorData and destExecutorData do not m...
VdfVector * GetOrCreateOutputValueForWriting(const VdfOutput &output, const DataHandle dataHandle) const
Returns a new or existing output value.
This class is used to abstract away knowledge of the cache data used for each node.
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...