Used for faster iteration of dirty rprims, filtered by mask. More...
Public Member Functions | |
HD_API | HdDirtyList (HdRprimCollection const &collection, HdRenderIndex &index) |
HD_API SdfPathVector const & | GetDirtyRprims () |
Returns a reference of dirty ids. More... | |
HD_API bool | ApplyEdit (HdRprimCollection const &newCollection) |
Update the tracking state for this HdDirtyList with the new collection, if the update cannot be applied, return false. More... | |
Used for faster iteration of dirty rprims, filtered by mask.
GetDirtyRprims implicitly refresh and cache the list if needed. The returning prims list will be used for sync.
DirtyList construction can expensive. We have 3 layer versioning to make it efficient.
Constantly updating Prims in a stable set (fast) when munging or playing back, the same set of prims are being updated, while the remaining prims (could be huge – for example a large set) are static. Those animating prims can be distinguished by the Varying bit. The Varying bit is set on a prim when any dirty bit is set, and stays even after clean the dirty bit until HdChangeTracker::ResetVaryingState clears out.
DirtyList caches those prims in a list at the first time (described in 3.), and returns the list for the subsequent queries. Since that list is conservatively picked by the Varying bit instead of the actual DirtyBits needed for various reprs, consumer of DirtyList needs to check the dirtybits again (this is a common pattern in HdRprim, HdMesh and other).
Varying state changed (medium cost) when a exisitng prim newly starts updating (start munging), or when a majority of the dirtylist stop updating, we need to reconstruct the dirtylist. HdChangeTracker::GetVaryingStateVersion() tells the right timing to refresh, by comparing the cached version number in the dirtylist.
To construct a dirtylist, the Varying bit is checked instead of other dirtybits, since effective dirtybits may differ over prims, by prim type (mesh vs curve) or by per-prim repr style (flat vs smooth)
example: [x]=Varying [x*]=Dirty,Varying
say in change tracker: A B C D E [F*] [G] [H*] [I*] [J] [K] L M N ... then the dirtylist will be: F*, G, H*, I*, J, K
Note that G, J and K are not dirty, but it exists in the dirtylist. This optimization gives the maximum efficiency when all of Varying prims are being updated.
Definition at line 101 of file dirtyList.h.
HD_API bool ApplyEdit | ( | HdRprimCollection const & | newCollection | ) |
Update the tracking state for this HdDirtyList with the new collection, if the update cannot be applied, return false.
HD_API SdfPathVector const& GetDirtyRprims | ( | ) |
Returns a reference of dirty ids.
If the change tracker hasn't changed any state since the last time GetDirtyRprims gets called, it simply returns an empty list. Otherwise depending on what changed, it will return a list of prims to be synced. Therefore, it is expected that GetDirtyRprims is called only once per render index sync.