7#ifndef PXR_IMAGING_HD_RENDER_INDEX_H
8#define PXR_IMAGING_HD_RENDER_INDEX_H
11#include "pxr/imaging/hd/api.h"
12#include "pxr/imaging/hd/version.h"
13#include "pxr/imaging/hd/changeTracker.h"
14#include "pxr/imaging/hd/dirtyList.h"
15#include "pxr/imaging/hd/perfLog.h"
16#include "pxr/imaging/hd/primTypeIndex.h"
17#include "pxr/imaging/hd/resourceRegistry.h"
18#include "pxr/imaging/hd/sortedIds.h"
19#include "pxr/imaging/hd/tokens.h"
21#include "pxr/imaging/hd/sceneIndex.h"
22#include "pxr/imaging/hd/mergingSceneIndex.h"
23#include "pxr/imaging/hd/legacyPrimSceneIndex.h"
24#include "pxr/imaging/hd/legacyTaskFactory.h"
25#include "pxr/imaging/hd/noticeBatchingSceneIndex.h"
27#include "pxr/imaging/hf/perfLog.h"
29#include "pxr/usd/sdf/path.h"
32#include "pxr/base/tf/hashmap.h"
34#include <tbb/enumerable_thread_specific.h>
37#include <unordered_map>
40PXR_NAMESPACE_OPEN_SCOPE
48class HdRenderDelegate;
54using HdDriverVector = std::vector<HdDriver*>;
55using HdRprimCollectionVector = std::vector<HdRprimCollection>;
56using HdTaskSharedPtr = std::shared_ptr<class HdTask>;
57using HdResourceRegistrySharedPtr = std::shared_ptr<class HdResourceRegistry>;
58using HdTaskSharedPtrVector = std::vector<HdTaskSharedPtr>;
59using HdTaskContext = std::unordered_map<
TfToken,
107 typedef std::vector<HdDrawItem const*> HdDrawItemPtrVector;
128 HdRenderDelegate *renderDelegate,
129 HdDriverVector
const& drivers,
130 const std::string &instanceName=std::string(),
131 const std::string &appName=std::string());
144 HdRenderDelegate *renderDelegate,
145 HdDriverVector
const& drivers,
146 HdSceneIndexBaseRefPtr
const &terminalSceneIndex);
157 New(HdRenderDelegate *renderDelegate);
195 void SyncAll(HdTaskSharedPtrVector *tasks, HdTaskContext *taskContext);
239 return _rprimMap.find(
id) != _rprimMap.end();
295 return _instancerMap.find(
id) != _instancerMap.end();
312 template <
typename T>
331 return _taskMap.find(
id) != _taskMap.end();
403 void InsertSceneIndex(
404 const HdSceneIndexBaseRefPtr &inputScene,
405 SdfPath const& scenePathPrefix,
406 bool needsPrefixing =
true);
409 void RemoveSceneIndex(
410 const HdSceneIndexBaseRefPtr &inputScene);
418 HdSceneIndexBaseRefPtr GetEmulationSceneIndex()
const;
432 HdDriverVector
const& GetDrivers()
const;
480 std::string GetInstanceName()
const;
486 HdRenderDelegate *renderDelegate,
487 HdDriverVector
const& drivers,
488 const std::string &instanceName,
489 const std::string &appName,
490 HdSceneIndexBaseRefPtr
const &terminalSceneIndex =
nullptr,
491 bool createFrontEndEmulationOnly =
false);
499 void _CompactPrimIds();
502 void _AllocatePrimId(
HdRprim* prim);
504 using HdTaskCreateFnc =
510 void _InsertSceneDelegateTask(
513 HdLegacyTaskFactorySharedPtr factory);
515 template <
typename T>
516 static inline const TfToken & _GetTypeId();
538 void _InsertRprim(
TfToken const& typeId,
541 void _InsertSprim(
TfToken const& typeId,
544 void _InsertBprim(
TfToken const& typeId,
551 HdTaskSharedPtr
const &task);
553 void _RemoveRprim(
SdfPath const&
id);
556 void _RemoveInstancer(
SdfPath const&
id);
558 void _RemoveRprimSubtree(
const SdfPath &root,
560 void _RemoveInstancerSubtree(
const SdfPath &root,
562 void _RemoveExtComputationSubtree(
const SdfPath &root,
564 void _RemoveTaskSubtree(
const SdfPath &root,
566 void _RemoveTask(
SdfPath const &
id);
577 class _NoticeBatchingContext;
579 HdLegacyPrimSceneIndexRefPtr _emulationSceneIndex;
580 std::unique_ptr<_NoticeBatchingContext> _emulationBatchingCtx;
582 std::unique_ptr<class HdSceneIndexAdapterSceneDelegate> _siSd;
584 HdMergingSceneIndexRefPtr _mergingSceneIndex;
585 std::unique_ptr<_NoticeBatchingContext> _mergingBatchingCtx;
587 HdSceneIndexBaseRefPtr _terminalSceneIndex;
591 HdTaskSharedPtr task;
594 typedef std::unordered_map<SdfPath, _TaskInfo, SdfPath::Hash> _TaskMap;
595 typedef TfHashMap<SdfPath, _RprimInfo, SdfPath::Hash> _RprimMap;
596 typedef std::vector<SdfPath> _RprimPrimIDVector;
598 typedef Hd_PrimTypeIndex<HdSprim> _SprimIndex;
599 typedef Hd_PrimTypeIndex<HdBprim> _BprimIndex;
602 Hd_SortedIds _rprimIds;
604 _RprimPrimIDVector _rprimPrimIdMap;
608 _SprimIndex _sprimIndex;
609 _BprimIndex _bprimIndex;
613 typedef TfHashMap<SdfPath, HdInstancer*, SdfPath::Hash> _InstancerMap;
614 _InstancerMap _instancerMap;
616 HdRenderDelegate *_renderDelegate;
617 HdDriverVector _drivers;
619 HdSceneIndexBaseRefPtr _finalEmulationSceneIndex;
621 std::string _instanceName;
626 HdRprimCollectionVector _collectionsToSync;
630 std::atomic<int> _syncAllDepth;
635 void _InitPrimTypes();
638 bool _CreateFallbackPrims();
641 void _DestroyFallbackPrims();
643 typedef tbb::enumerable_thread_specific<HdDrawItemPtrVector>
644 _ConcurrentDrawItems;
646 void _AppendDrawItems(
const SdfPathVector &rprimIds,
650 _ConcurrentDrawItems* result);
655 static void _ConfigureReprs();
670 _InsertSceneDelegateTask(
671 delegate,
id, HdMakeLegacyTaskFactory<T>());
674PXR_NAMESPACE_CLOSE_SCOPE
Bprim (buffer prim) is a base class of managing a blob of data that is used to communicate between th...
Tracks changes from the HdSceneDelegate, providing invalidation cues to the render engine.
Used for faster iteration of dirty Rprims by the render index.
A draw item is a light-weight representation of an HdRprim's resources and material to be used for re...
HdDriver represents a device object, commonly a render device, that is owned by the application and p...
Hydra Representation of a Client defined computation.
This class exists to facilitate point cloud style instancing.
The Hydra render index is a flattened representation of the client scene graph, which may be composed...
HD_API void MergingSceneIndexNoticeBatchEnd()
Flushes any queued scene index observer notices from the merging scene index and disables further que...
static HD_API HdRenderIndex * New(HdRenderDelegate *renderDelegate, HdDriverVector const &drivers, const std::string &instanceName=std::string(), const std::string &appName=std::string())
Create a render index with the given render delegate.
HD_API HdInstancer * GetInstancer(SdfPath const &id) const
Returns the instancer of id.
HD_API void RemoveRprim(SdfPath const &id)
Remove a rprim from index.
HD_API HdTaskSharedPtr const & GetTask(SdfPath const &id) const
Returns the task for the given id.
HD_API void RemoveInstancer(SdfPath const &id)
Remove an instancer from index.
HD_API SdfPathVector GetBprimSubtree(TfToken const &typeId, SdfPath const &root)
Returns the subtree rooted under the given path for the given bprim type.
HD_API void RemoveTask(SdfPath const &id)
void InsertTask(HdSceneDelegate *delegate, SdfPath const &id)
TfToken UpdateRenderTag(SdfPath const &id, HdDirtyBits bits)
Like GetRenderTag, but updates the render tag if dirty.
HD_API bool IsBprimTypeSupported(TfToken const &typeId) const
Returns whether the bprim type is supported by this render index.
HD_API void EnqueueCollectionToSync(HdRprimCollection const &collection)
Hydra's core currently needs to know the collections used by tasks to aggregate the reprs that need t...
HD_API void InsertBprim(TfToken const &typeId, HdSceneDelegate *delegate, SdfPath const &bprimId)
Insert a bprim into index.
HD_API HdBprim * GetFallbackBprim(TfToken const &typeId) const
Returns the fallback prim for the Bprim of the given type.
HD_API void Clear()
Clear all r (render), s (state) and b (buffer) prims.
HD_API HdSceneDelegate * GetSceneDelegateForRprim(SdfPath const &id) const
Returns the scene delegate for the given rprim.
HD_API void SyncAll(HdTaskSharedPtrVector *tasks, HdTaskContext *taskContext)
Syncs input tasks, B & S prims, (external) computations and updates the Rprim dirty list to then sync...
HD_API bool IsRprimTypeSupported(TfToken const &typeId) const
Returns whether the rprim type is supported by this render index.
HD_API HdSceneIndexBaseRefPtr GetTerminalSceneIndex() const
The terminal scene index that is driving what is in the render index through emulation.
bool HasRprim(SdfPath const &id)
Returns true if rprim id exists in index.
HD_API void SceneIndexEmulationNoticeBatchBegin()
An application or legacy scene delegate may prefer for the scene index observer notices generated fro...
HD_API HdSprim * GetFallbackSprim(TfToken const &typeId) const
Returns the fullback prim for the Sprim of the given type.
HD_API void RemoveSubtree(const SdfPath &root, HdSceneDelegate *sceneDelegate)
Clear all entries in the render index under the given root and belong to a specified delegate.
HD_API const SdfPathVector & GetRprimIds()
Returns a sorted list of all Rprims in the render index.
static HdRenderIndex * New(HdRenderDelegate *renderDelegate)
Create a render index for "front-end" emulation.
HD_API void SceneIndexEmulationNoticeBatchEnd()
Flushes any queued scene index observer notices and disables further queueing.
static HD_API bool IsSceneIndexEmulationEnabled()
Returns true if scene index features are available This is true by default but can be controlled via ...
HD_API HdDrawItemPtrVector GetDrawItems(HdRprimCollection const &collection, TfTokenVector const &renderTags)
Returns a list of relevant draw items that match the criteria specified.
HD_API void MergingSceneIndexNoticeBatchBegin()
Consolidate notices generated by the merging scene index to vectorized batches.
HD_API HdRprim const * GetRprim(SdfPath const &id) const
Returns the rprim of id.
static HdRenderIndex * New(HdRenderDelegate *renderDelegate, HdDriverVector const &drivers, HdSceneIndexBaseRefPtr const &terminalSceneIndex)
Create a render index with the given render delegate that populates itself by observing the given sce...
HD_API TfToken GetRenderTag(SdfPath const &id) const
Returns the render tag for the given rprim.
HD_API void InsertRprim(TfToken const &typeId, HdSceneDelegate *sceneDelegate, SdfPath const &rprimId)
Insert a rprim into index.
HD_API SdfPath GetRprimPathFromPrimId(int primId) const
Given a prim id, returns the path of the corresponding rprim or an empty path if none is found.
HD_API HdResourceRegistrySharedPtr GetResourceRegistry() const
Returns a shared ptr to the resource registry of the current render delegate.
bool HasTask(SdfPath const &id)
bool HasInstancer(SdfPath const &id)
Returns true if instancer id exists in index.
HD_API bool IsSprimTypeSupported(TfToken const &typeId) const
Returns whether the sprim type is supported by this render index.
HD_API SdfPathVector GetRprimSubtree(SdfPath const &root)
Returns the subtree rooted under the given path.
HD_API bool IsSyncAllInProgress() const
Returns true while a thread is invoking SyncAll().
HD_API bool GetSceneDelegateAndInstancerIds(SdfPath const &id, SdfPath *sceneDelegateId, SdfPath *instancerId) const
Query function to return the id's of the scene delegate and instancer associated with the Rprim at th...
HD_API void InsertInstancer(HdSceneDelegate *delegate, SdfPath const &id)
Insert an instancer into index.
HD_API SdfPathVector GetSprimSubtree(TfToken const &typeId, SdfPath const &root)
Returns the subtree rooted under the given path for the given sprim type.
HD_API void InsertSprim(TfToken const &typeId, HdSceneDelegate *delegate, SdfPath const &sprimId)
Insert a sprim into index.
HD_API HdRenderDelegate * GetRenderDelegate() const
Currently, a render index only supports connection to one type of render delegate,...
A named, semantic collection of objects.
The render engine state for a given rprim from the scene graph.
Adapter class providing data exchange with the client scene graph.
Scene delegate which observes notices from an HdSceneIndex and applies them to an HdRenderIndex.
Sprim (state prim) is a base class of managing state for non-drawable scene entity (e....
A path value used to locate objects in layers or scenegraphs.
Token for efficient comparison, assignment, and hashing of known strings.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
Functor to use for hash maps from tokens to other things.
std::vector< TfToken > TfTokenVector
Convenience types.