7#ifndef PXR_IMAGING_HD_CHANGE_TRACKER_H
8#define PXR_IMAGING_HD_CHANGE_TRACKER_H
11#include "pxr/imaging/hd/api.h"
12#include "pxr/imaging/hd/version.h"
13#include "pxr/imaging/hd/rprimCollection.h"
14#include "pxr/imaging/hd/types.h"
15#include "pxr/usd/sdf/path.h"
16#include "pxr/base/tf/hashmap.h"
18#include <tbb/concurrent_hash_map.h>
21PXR_NAMESPACE_OPEN_SCOPE
40 enum RprimDirtyBits : HdDirtyBits {
47 DirtyDisplayStyle = 1 << 4,
49 DirtyPrimvar = 1 << 6,
50 DirtyMaterialId = 1 << 7,
51 DirtyTopology = 1 << 8,
52 DirtyTransform = 1 << 9,
53 DirtyVisibility = 1 << 10,
54 DirtyNormals = 1 << 11,
55 DirtyDoubleSided = 1 << 12,
56 DirtyCullStyle = 1 << 13,
57 DirtySubdivTags = 1 << 14,
58 DirtyWidths = 1 << 15,
59 DirtyInstancer = 1 << 16,
60 DirtyInstanceIndex = 1 << 17,
62 DirtyRenderTag = 1 << 19,
63 DirtyComputationPrimvarDesc = 1 << 20,
64 DirtyCategories = 1 << 21,
65 DirtyVolumeField = 1 << 22,
66 AllSceneDirtyBits = ((1<<23) - 1),
70 CustomBitsBegin = 1 << 24,
71 CustomBitsEnd = 1 << 30,
72 CustomBitsMask = 0x7f << 24,
80 enum TaskDirtyBits : HdDirtyBits {
82 DirtyCollection = 1 << 3,
83 DirtyRenderTags = 1 << 4,
206 return (dirtyBits & AllDirty) != 0;
211 return (dirtyBits & AllDirty) == 0;
216 return (dirtyBits & Varying) != 0;
275 static bool IsReprDirty(HdDirtyBits dirtyBits,
SdfPath const &
id);
495 return _varyingStateVersion;
508 return _rprimIndexVersion;
515 return _sprimIndexVersion;
522 return _bprimIndexVersion;
529 return _instancerIndexVersion;
539 return _sceneStateVersion;
567 static std::string StringifyDirtyBits(HdDirtyBits dirtyBits);
570 static void DumpDirtyBits(HdDirtyBits dirtyBits);
581 static void _LogCacheAccess(
TfToken const& cacheName,
584 typedef TfHashMap<SdfPath, HdDirtyBits, SdfPath::Hash> _IDStateMap;
585 typedef TfHashMap<TfToken, int, TfToken::HashFunctor> _CollectionStateMap;
586 typedef TfHashMap<TfToken, unsigned, TfToken::HashFunctor> _GeneralStateMap;
588 struct _PathHashCompare {
592 static size_t hash(
const SdfPath& path)
595 typedef tbb::concurrent_hash_map<SdfPath, SdfPathSet, _PathHashCompare>
599 _IDStateMap _rprimState;
600 _IDStateMap _instancerState;
601 _IDStateMap _taskState;
602 _IDStateMap _sprimState;
603 _IDStateMap _bprimState;
604 _GeneralStateMap _generalState;
607 _CollectionStateMap _collectionState;
611 _DependencyMap _instancerRprimDependencies;
612 _DependencyMap _instancerSprimDependencies;
613 _DependencyMap _instancerInstancerDependencies;
619 _DependencyMap _sprimSprimTargetDependencies;
621 _DependencyMap _sprimSprimSourceDependencies;
623 _DependencyMap _sprimRprimTargetDependencies;
626 void _AddDependency(_DependencyMap &depMap,
628 void _RemoveDependency(_DependencyMap &depMap,
635 unsigned _varyingStateVersion;
640 unsigned _rprimIndexVersion;
641 unsigned _sprimIndexVersion;
642 unsigned _bprimIndexVersion;
643 unsigned _instancerIndexVersion;
648 unsigned _sceneStateVersion;
651 unsigned _visChangeCount;
654 unsigned _instanceIndicesChangeCount;
657 unsigned _rprimRenderTagVersion;
660 unsigned _taskRenderTagsVersion;
671 bool _disableEmulationAPI;
673 void _SetDisableEmulationAPI(
bool);
684 void _MarkRprimDirty(
SdfPath const&
id, HdDirtyBits bits=AllDirty);
685 void _MarkSprimDirty(
SdfPath const&
id, HdDirtyBits bits=AllDirty);
686 void _MarkBprimDirty(
SdfPath const&
id, HdDirtyBits bits=AllDirty);
687 void _MarkInstancerDirty(
SdfPath const&
id, HdDirtyBits bits=AllDirty);
688 void _MarkTaskDirty(
SdfPath const&
id, HdDirtyBits bits=AllDirty);
692PXR_NAMESPACE_CLOSE_SCOPE
Tracks changes from the HdSceneDelegate, providing invalidation cues to the render engine.
HD_API void MarkSprimDirty(SdfPath const &id, HdDirtyBits bits)
Set the dirty flags to bits.
HD_API bool IsRprimDirty(SdfPath const &id)
Returns true if the rprim identified by id has any dirty flags set.
HD_API HdDirtyBits GetRprimDirtyBits(SdfPath const &id) const
Returns the dirty bits for the rprim with id.
HD_API HdDirtyBits GetInstancerDirtyBits(SdfPath const &id)
Returns the dirty bits for the instancer with id.
HD_API bool IsTransformDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty transform.
HD_API void MarkTaskClean(SdfPath const &id, HdDirtyBits newBits=Clean)
Set the dirty flags to newBits.
unsigned GetRprimIndexVersion() const
Returns the current version of the Render Index's RPrim set.
HD_API void SprimInserted(SdfPath const &id, HdDirtyBits initialDirtyState)
Start tracking sprim with the given id.
unsigned GetBprimIndexVersion() const
Returns the current version of the Render Index's BPrim set.
HD_API HdDirtyBits GetTaskDirtyBits(SdfPath const &id)
Get the dirty bits for Task with the given id.
HD_API bool IsPrimIdDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty primID.
HD_API void RemoveSprimRprimDependency(SdfPath const &sprimId, SdfPath const &rprimId)
Remove a dependency between sprimId and rprim rprimId.
HD_API bool IsSubdivTagsDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty subdiv tags.
HD_API void MarkInstancerClean(SdfPath const &id, HdDirtyBits newBits=Clean)
Clean the specified dirty bits for the instancer with id.
HD_API void AddState(TfToken const &name)
Adds a named state for tracking.
HD_API void MarkAllRprimsDirty(HdDirtyBits bits)
Flag all the Rprim with the given id as being dirty.
static bool IsVarying(HdDirtyBits dirtyBits)
Returns true if the varying flag is set.
HD_API void RemoveSprimSprimDependency(SdfPath const &parentSprimId, SdfPath const &sprimId)
Remove a dependency between sprimId and parent sprim parentSprimId.
static HD_API bool IsVisibilityDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has dirty visibility. id is for perflog.
HD_API void MarkBprimClean(SdfPath const &id, HdDirtyBits newBits=Clean)
Set the dirty flags to newBits.
HD_API void AddCollection(TfToken const &collectionName)
Adds a named collection for tracking.
HD_API void MarkSprimClean(SdfPath const &id, HdDirtyBits newBits=Clean)
Set the dirty flags to newBits.
HD_API void MarkStateDirty(TfToken const &name)
Marks a named state as being dirty., this bumps the version of the state.
HD_API void AddInstancerRprimDependency(SdfPath const &instancerId, SdfPath const &rprimId)
Insert a dependency between rprimId and parent instancer instancerId.
static HD_API bool IsTopologyDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty topology. id is for perflog.
HD_API void BprimInserted(SdfPath const &id, HdDirtyBits initialDirtyState)
Start tracking bprim with the given id.
static HD_API bool IsDoubleSidedDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has dirty doubleSided state. id is for perflog.
unsigned GetSceneStateVersion() const
Returns the current version of the scene state.
HD_API bool IsExtentDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty extent.
HD_API void InstancerInserted(SdfPath const &id, HdDirtyBits initialDirtyState)
Start tracking Instancer with the given id.
HD_API bool IsDisplayStyleDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty display style.
HD_API void RemoveInstancerRprimDependency(SdfPath const &instancerId, SdfPath const &rprimId)
Remove a dependency between rprimId and parent instancer instancerId.
HD_API void AddSprimSprimDependency(SdfPath const &parentSprimId, SdfPath const &sprimId)
Insert a dependency between sprimId and parent sprim parentSprimId.
HD_API bool IsTopologyDirty(SdfPath const &id)
Returns true if the rprim identified by id has a dirty topology.
unsigned GetSprimIndexVersion() const
Returns the current version of the Render Index's SPrim set.
static HD_API bool IsCullStyleDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has dirty cullstyle. id is for perflog.
HD_API unsigned GetVisibilityChangeCount() const
Returns the number of changes to visibility.
HD_API unsigned GetStateVersion(TfToken const &name) const
Returns the current version of the named state.
HD_API void InstancerRemoved(SdfPath const &id)
Stop tracking Instancer with the given id.
HD_API void RemoveSprimFromSprimSprimDependencies(SdfPath const &sprimId)
Remove all dependencies involving sprimId as a parent or child.
unsigned GetInstancerIndexVersion() const
Returns the current version of the Render Index's Instancer set.
HD_API void MarkRprimClean(SdfPath const &id, HdDirtyBits newBits=Clean)
Clear the dirty flags for an HdRprim.
HD_API bool IsAnyPrimvarDirty(SdfPath const &id)
Returns true if the rprim identified by id has any dirty primvars.
HD_API void RemoveInstancerSprimDependency(SdfPath const &instancerId, SdfPath const &sprimId)
Remove a dependency between sprimId and parent instancer instancerId.
HD_API bool IsPrimvarDirty(SdfPath const &id, TfToken const &name)
Returns true if the rprim identified by id with primvar name is dirty.
HD_API bool IsDoubleSidedDirty(SdfPath const &id)
Returns true if the rprim identified by id has dirty doubleSided state.
static HD_API bool IsInstancerDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty instancer. id is for perflog.
HD_API void AddInstancerSprimDependency(SdfPath const &instancerId, SdfPath const &sprimId)
Insert a dependency between sprimId and parent instancer instancerId.
HD_API HdDirtyBits GetSprimDirtyBits(SdfPath const &id)
Get the dirty bits for sprim with the given id.
HD_API void ResetVaryingState()
Clear Varying bit of all prims.
HD_API void BprimRemoved(SdfPath const &id)
Stop tracking bprim with the given id.
HD_API bool IsVisibilityDirty(SdfPath const &id)
Returns true if the rprim identified by id has dirty visibility.
static HD_API void MarkPrimvarDirty(HdDirtyBits *dirtyBits, TfToken const &name)
Set the primvar dirty flag to dirtyBits.
unsigned GetVaryingStateVersion() const
Returns the current version of varying state.
static HD_API bool IsDisplayStyleDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty display style. id is for perflog.
HD_API bool IsCullStyleDirty(SdfPath const &id)
Returns true if the rprim identified by id has dirty cullstyle.
HD_API void ResetRprimVaryingState(SdfPath const &id)
Reset the varying state on one Rprim This is done for Rprims, where we choose not to clean them (due ...
HD_API void AddSprimRprimDependency(SdfPath const &sprimId, SdfPath const &rprimId)
Insert a dependency between sprimId and rprim rprimId.
static HD_API bool IsPrimIdDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty primID. id is for perflog.
HD_API void MarkInstancerDirty(SdfPath const &id, HdDirtyBits bits=AllDirty)
Flag the Instancer with the given id as being dirty.
HD_API void MarkBprimDirty(SdfPath const &id, HdDirtyBits bits)
Set the dirty flags to bits.
static HD_API bool IsAnyPrimvarDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has any dirty primvars.
HD_API HdDirtyBits GetBprimDirtyBits(SdfPath const &id)
Get the dirty bits for bprim with the given id.
static HD_API bool IsInstanceIndexDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty instance index. id is for perflog.
HD_API void TaskInserted(SdfPath const &id, HdDirtyBits initialDirtyState)
Start tracking Task with the given id.
HD_API void MarkRprimDirty(SdfPath const &id, HdDirtyBits bits=AllDirty)
Flag the Rprim with the given id as being dirty.
static bool IsDirty(HdDirtyBits dirtyBits)
Returns true if the dirtyBits has any flags set other than the varying flag.
HD_API unsigned GetInstanceIndicesChangeCount() const
Returns the number of changes to instance index.
HD_API void RprimInserted(SdfPath const &id, HdDirtyBits initialDirtyState)
Start tracking Rprim with the given id.
HD_API void MarkCollectionDirty(TfToken const &collectionName)
Marks a named collection as being dirty, this bumps the version of the collection.
static HD_API bool IsTransformDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty transform. id is for perflog.
HD_API unsigned GetCollectionVersion(TfToken const &collectionName) const
Returns the current version of the named collection.
static HD_API bool IsPrimvarDirty(HdDirtyBits dirtyBits, SdfPath const &id, TfToken const &name)
Returns true if the dirtyBits has a dirty primvar name.
static HD_API bool IsExtentDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty extent. id is for perflog.
static HD_API bool IsSubdivTagsDirty(HdDirtyBits dirtyBits, SdfPath const &id)
Returns true if the dirtyBits has a dirty subdiv tags. id is for perflog.
HD_API void MarkTaskDirty(SdfPath const &id, HdDirtyBits bits=AllDirty)
Set the dirty flags to bits.
HD_API unsigned GetTaskRenderTagsVersion() const
Retrieve the current version number of the task's render tags opinion.
static bool IsClean(HdDirtyBits dirtyBits)
Returns true if the dirtyBits has no flags set except the varying flag.
HD_API unsigned GetRenderTagVersion() const
Retrieve the current version number of the rprim render tag set XXX Rename to GetRprimRenderTagVersio...
HD_API void SprimRemoved(SdfPath const &id)
Stop tracking sprim with the given id.
HD_API void AddInstancerInstancerDependency(SdfPath const &parentInstancerId, SdfPath const &instancerId)
Insert a dependency between instancerId and parent instancer parentInstancerId.
HD_API void RprimRemoved(SdfPath const &id)
Stop tracking Rprim with the given id.
HD_API void MarkPrimvarDirty(SdfPath const &id, TfToken const &name)
Mark the primvar for the rprim with id as being dirty.
HD_API void TaskRemoved(SdfPath const &id)
Stop tracking Task with the given id.
HD_API void RemoveInstancerInstancerDependency(SdfPath const &parentInstancerId, SdfPath const &instancerId)
Remove a dependency between instancerId and parent instancer parentInstancerId.
Used for faster iteration of dirty Rprims by the render index.
The Hydra render index is a flattened representation of the client scene graph, which may be composed...
Concrete scene container which can be externally populated and dirtied.
Scene delegate which observes notices from an HdSceneIndex and applies them to an HdRenderIndex.
A path value used to locate objects in layers or scenegraphs.
Token for efficient comparison, assignment, and hashing of known strings.
size_t hash_value(const TfToken &x)
Overload hash_value for TfToken.