7 #ifndef PXR_EXEC_VDF_SCHEDULE_H
8 #define PXR_EXEC_VDF_SCHEDULE_H
46 template <
typename Iterator>
49 template <
typename IteratorConvertible>
51 _begin(begin), _end(end) {}
53 Iterator
begin()
const {
return _begin; }
54 Iterator
end()
const {
return _end; }
55 bool empty()
const {
return _begin == _end; }
98 return _scheduleNodeIndex >= 0 && _secondaryIndex >= 0;
116 return _scheduleNodeIndex == rhs._scheduleNodeIndex &&
117 _secondaryIndex == rhs._secondaryIndex;
121 return !(*
this == rhs);
138 OutputId(
int scheduleNodeIndex,
int secondaryIndex) :
139 _scheduleNodeIndex(scheduleNodeIndex),
140 _secondaryIndex(secondaryIndex)
147 int _scheduleNodeIndex;
297 return _nodeInvocations[invocationIndex].requestMask;
306 const OutputId &outputId,
308 const VdfMask **affectsMask)
const;
316 const VdfMask **affectsMask)
const {
318 *requestMask = &_nodeInvocations[invocationIndex].requestMask;
319 *affectsMask = &_nodeInvocations[invocationIndex].affectsMask;
337 return _nodeInvocations[invocationIndex].keepMask;
372 return _numUniqueInputDeps;
378 return _computeTasks.size();
384 return _inputsTasks.size();
390 return _numPrepTasks;
396 return _numKeepTasks;
403 int scheduleNodeIndex = _GetScheduleNodeIndex(node);
406 _nodesToComputeTasks[scheduleNodeIndex].taskId,
407 _nodesToComputeTasks[scheduleNodeIndex].taskId +
408 _nodesToComputeTasks[scheduleNodeIndex].taskNum);
423 int scheduleNodeIndex = _GetScheduleNodeIndex(node);
424 return scheduleNodeIndex >= 0
425 ? _nodesToKeepTasks[scheduleNodeIndex]
426 : VdfScheduleTaskInvalid;
434 return _computeTasks[
index];
442 return _inputsTasks[
index];
450 std::vector<VdfScheduleInputDependency>::const_iterator
begin =
460 std::vector<VdfScheduleInputDependency>::const_iterator
begin =
470 std::vector<VdfScheduleInputDependency>::const_iterator
begin =
479 const OutputId outputId)
const;
515 return outputId._scheduleNodeIndex;
576 void _SetIsValidForNetwork(
const VdfNetwork *network);
582 int _GetScheduleNodeIndex(
const VdfNode &node)
const;
587 int _EnsureNodeInSchedule(
const VdfNode &node);
599 std::vector<int> _nodesToIndexMap;
615 bool _isSmallSchedule;
623 size_t _numUniqueInputDeps;
628 size_t _numKeepTasks;
629 size_t _numPrepTasks;
635 std::vector<VdfScheduleInputDependency> _inputDeps;
639 std::vector<VdfScheduleNodeTasks> _nodesToComputeTasks;
640 std::vector<VdfScheduleTaskIndex> _nodesToKeepTasks;
652 #define VDF_FOR_EACH_SCHEDULED_OUTPUT_ID(OUTPUT_ID_NAME,VDF_SCHEDULE,VDF_NODE) \
653 for (VdfSchedule::OutputId __endId = \
654 (VDF_SCHEDULE).GetOutputIdsEnd(VDF_NODE), \
655 OUTPUT_ID_NAME = (VDF_SCHEDULE).GetOutputIdsBegin(VDF_NODE) ; \
656 OUTPUT_ID_NAME != __endId; ++OUTPUT_ID_NAME)
VDF_API bool IsAffective(const OutputId &outputId) const
VDF_API const VdfMask & GetAffectsMask(const OutputId &outputId) const
IteratorRange< std::vector< VdfScheduleInput >::const_iterator > InputsRange
VDF_API const VdfMask & GetKeepMask(const OutputId &outputId) const
VDF_API void SetPassToOutput(const OutputId &outputId, const VdfOutput *output)
size_t GetNumInputsTasks() const
IteratorRange< Vdf_CountingIterator< VdfScheduleTaskId >> TaskIdRange
InputDependencyRange GetRequiredInputDependencies(const VdfScheduleComputeTask &task) const
TaskIdRange GetComputeTaskIds(const VdfScheduleInputDependency &input) const
VDF_API const VdfOutput * GetPassToOutput(const OutputId &outputId) const
const VdfNetwork * GetNetwork() const
ScheduleNodeVector & GetScheduleNodeVector()
VDF_API OutputId GetOrCreateOutputId(const VdfOutput &output)
VDF_API const VdfOutput * GetFromBufferOutput(const OutputId &outputId) const
#define PXR_NAMESPACE_OPEN_SCOPE
VDF_API OutputId GetOutputId(const VdfOutput &output) const
std::vector< T, Vdf_DefaultInitAllocator< T >> Vdf_DefaultInitVector
VDF_API void SetRequest(const VdfRequest &request)
const VdfScheduleComputeTask & GetComputeTask(const VdfScheduleTaskIndex index) const
std::vector< VdfScheduleNode > ScheduleNodeVector
VDF_API bool IsScheduled(const VdfNode &node) const
void GetRequestAndAffectsMask(const VdfScheduleTaskIndex invocationIndex, const VdfMask **requestMask, const VdfMask **affectsMask) const
VDF_API void ForEachScheduledOutput(const VdfNode &node, const VdfScheduledOutputCallback &callback) const
bool IsSmallSchedule() const
A VdfMask is placed on connections to specify the data flowing through them.
size_t GetNumComputeTasks() const
VdfScheduleTaskIndex requiredsIndex
VDF_API void DeduplicateInputs()
VDF_API OutputId GetOutputIdsBegin(const VdfNode &node) const
VDF_API void SetKeepMask(const OutputId &outputId, const VdfMask &mask)
VDF_API InputsRange GetInputs(const VdfNode &node) const
std::function< void(const VdfOutput *, const VdfMask &)> VdfScheduledOutputCallback
VDF_API OutputId GetOutputIdsEnd(const VdfNode &node) const
VDF_API void SetFromBufferOutput(const OutputId &outputId, const VdfOutput *output)
VDF_API const VdfOutput * GetOutput(const OutputId &outputId) const
#define TF_DEV_AXIOM(cond)
Fast bit array that keeps track of the number of bits set and can find the next set in a timely manne...
const TaskIdRange GetComputeTaskIds(const VdfNode &node) const
const VdfMask & GetRequestMask(const VdfScheduleTaskIndex invocationIndex) const
InputDependencyRange GetPrereqInputDependencies(const VdfScheduleInputsTask &task) const
VdfScheduleTaskNum requiredsNum
int GetScheduleNodeIndex(const OutputId &outputId) const
VDF_API void SetOutputToClear(const VdfNode &node, const VdfOutput *outputToClear)
Contains a specification of how to execute a particular VdfNetwork.
size_t GetNumUniqueInputDependencies() const
VDF_API const VdfNode * GetNode(const OutputId &outputId) const
const VdfScheduleInputsTask & GetInputsTask(const VdfScheduleTaskIndex index) const
const VdfRequest & GetRequest() const
VDF_API void AddInput(const VdfConnection &connection, const VdfMask &mask)
size_t GetNumPrepTasks() const
bool operator!=(const OutputId &rhs) const
const VdfScheduleTaskIndex GetKeepTaskIndex(const VdfNode &node) const
const ScheduleNodeVector & GetScheduleNodeVector() const
Used to make a VdfSchedule.
size_t GetNumKeepTasks() const
IteratorRange< std::vector< VdfScheduleInputDependency >::const_iterator > InputDependencyRange
bool operator==(const OutputId &rhs) const
VDF_API void GetRequestAndAffectsMask(const OutputId &outputId, const VdfMask **requestMask, const VdfMask **affectsMask) const
VdfSchedule & operator=(const VdfSchedule &)=delete
PcpNodeRef_ChildrenIterator begin(const PcpNodeRef::child_const_range &r)
Support for range-based for loops for PcpNodeRef children ranges.
VDF_API const VdfMask & GetRequestMask(const OutputId &outputId) const
#define PXR_NAMESPACE_CLOSE_SCOPE
bool VdfScheduleTaskIsInvalid(uint32_t task)
const TfBits & GetScheduledNodeBits() const
void SetHasSMBL(bool enable)
uint32_t VdfScheduleTaskIndex
uint32_t VdfScheduleInputDependencyUniqueIndex
VDF_API void SetAffectsMask(const OutputId &outputId, const VdfMask &mask)
SIM_API const UT_StringHolder distance
VDF_API void SetRequestMask(const OutputId &outputId, const VdfMask &mask)
VDF_API void InitializeFromNetwork(const VdfNetwork &network)
VDF_API const VdfOutput * GetOutputToClear(const VdfNode &node) const
InputDependencyRange GetOptionalInputDependencies(const VdfScheduleInputsTask &task) const
const VdfMask & GetKeepMask(const VdfScheduleTaskIndex invocationIndex) const
VDF_API VdfScheduleInputDependencyUniqueIndex GetUniqueIndex(const OutputId outputId) const
IteratorRange(IteratorConvertible begin, IteratorConvertible end)