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.
#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,...
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.
Forward definition of the traits class, which will be specialized by the derived data manager impleme...