Skip to content

Commit 7bfa360

Browse files
Hydrogent: properly update draw item buffers when cached buffers resize
1 parent 0caa2be commit 7bfa360

File tree

6 files changed

+54
-7
lines changed

6 files changed

+54
-7
lines changed

Hydrogent/include/HnDrawItem.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,14 @@ class HnDrawItem final : public pxr::HdDrawItem
6161

6262
struct GeometryData
6363
{
64-
RefCntAutoPtr<IBuffer> Positions;
65-
RefCntAutoPtr<IBuffer> Normals;
66-
RefCntAutoPtr<IBuffer> VertexColors;
67-
RefCntAutoPtr<IBuffer> Joints;
64+
IBuffer* Positions = nullptr;
65+
IBuffer* Normals = nullptr;
66+
IBuffer* VertexColors = nullptr;
67+
IBuffer* Joints = nullptr;
6868

69-
std::array<RefCntAutoPtr<IBuffer>, 2> TexCoords;
69+
std::array<IBuffer*, 2> TexCoords{};
7070

71-
operator bool() const { return Positions; }
71+
operator bool() const { return Positions != nullptr; }
7272
};
7373

7474
void SetGeometryData(GeometryData&& Data) { m_GeometryData = std::move(Data); }

Hydrogent/interface/HnMesh.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class HnMesh final : public pxr::HdMesh
129129

130130
entt::entity GetEntity() const { return m_Entity; }
131131

132+
static Uint32 GetCacheResourceVersion(const HnRenderDelegate& RenderDelegate);
133+
132134
protected:
133135
// This callback from Rprim gives the prim an opportunity to set
134136
// additional dirty bits based on those already set.
@@ -273,6 +275,8 @@ class HnMesh final : public pxr::HdMesh
273275
std::atomic<Uint32> m_GeometryVersion{0};
274276
std::atomic<Uint32> m_MaterialVersion{0};
275277
std::atomic<Uint32> m_SkinningPrimvarsVersion{0};
278+
Uint32 m_IndexPoolVersion = ~0u;
279+
Uint32 m_VertexPoolVersion = ~0u;
276280
std::atomic<bool> m_DrawItemGpuTopologyDirty{false};
277281
std::atomic<bool> m_DrawItemGpuGeometryDirty{false};
278282

Hydrogent/interface/HnRenderPass.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ class HnRenderPass final : public pxr::HdRenderPass
282282
uint32_t MeshMaterial = ~0u;
283283
uint32_t MeshCulling = ~0u;
284284
uint32_t Material = ~0u;
285+
uint32_t MeshResourceCache = ~0u;
285286
} m_GlobalAttribVersions;
286287

287288
DRAW_LIST_ITEM_DIRTY_FLAGS m_DrawListItemsDirtyFlags = DRAW_LIST_ITEM_DIRTY_FLAG_ALL;

Hydrogent/src/HnMesh.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,30 @@ void HnMesh::UpdateDrawItemGpuTopology(HnRenderDelegate& RenderDelegate)
11921192

11931193
void HnMesh::CommitGPUResources(HnRenderDelegate& RenderDelegate)
11941194
{
1195+
const GLTF::ResourceManager& ResMgr = RenderDelegate.GetResourceManager();
1196+
const Uint32 IndexPoolVersion = ResMgr.GetIndexBufferVersion();
1197+
const Uint32 VertexPoolVersion = ResMgr.GetVertexPoolsVersion();
1198+
if (m_VertexHandle)
1199+
{
1200+
if (m_IndexPoolVersion != IndexPoolVersion)
1201+
{
1202+
// Update index buffer
1203+
m_DrawItemGpuTopologyDirty.store(true);
1204+
}
1205+
1206+
if (m_VertexPoolVersion != VertexPoolVersion)
1207+
{
1208+
// Update vertex buffers
1209+
m_DrawItemGpuGeometryDirty.store(true);
1210+
}
1211+
}
1212+
else
1213+
{
1214+
// The mesh has not been initialized yet.
1215+
// m_DrawItemGpuGeometryDirty and m_DrawItemGpuTopologyDirty will be set
1216+
// by UpdateRepr() when the mesh is initialized.
1217+
}
1218+
11951219
if (m_DrawItemGpuTopologyDirty.load())
11961220
{
11971221
UpdateDrawItemGpuTopology(RenderDelegate);
@@ -1201,13 +1225,22 @@ void HnMesh::CommitGPUResources(HnRenderDelegate& RenderDelegate)
12011225
{
12021226
UpdateDrawItemGpuGeometry(RenderDelegate);
12031227
}
1228+
1229+
m_IndexPoolVersion = IndexPoolVersion;
1230+
m_VertexPoolVersion = VertexPoolVersion;
12041231
}
12051232

12061233
IBuffer* HnMesh::GetVertexBuffer(const pxr::TfToken& Name) const
12071234
{
12081235
return m_VertexHandle ? m_VertexHandle->GetBuffer(Name) : nullptr;
12091236
}
12101237

1238+
Uint32 HnMesh::GetCacheResourceVersion(const HnRenderDelegate& RenderDelegate)
1239+
{
1240+
const GLTF::ResourceManager& ResMgr = RenderDelegate.GetResourceManager();
1241+
return ResMgr.GetIndexBufferVersion() + ResMgr.GetVertexPoolsVersion();
1242+
}
1243+
12111244
} // namespace USD
12121245

12131246
} // namespace Diligent

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,9 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
810810
}
811811

812812
{
813-
const auto MeshVersion = m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::MeshGeometry);
813+
const auto MeshVersion =
814+
m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::MeshGeometry) +
815+
HnMesh::GetCacheResourceVersion(*this);
814816
if (m_MeshResourcesVersion != MeshVersion)
815817
{
816818
std::lock_guard<std::mutex> Guard{m_MeshesMtx};

Hydrogent/src/HnRenderPass.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,13 @@ HnRenderPass::EXECUTE_RESULT HnRenderPass::Execute(HnRenderPassState& RPState, c
425425
m_GlobalAttribVersions.MeshCulling = MeshCullingVersion;
426426
}
427427

428+
const Uint32 MeshResourceCacheVersion = HnMesh::GetCacheResourceVersion(State.RenderDelegate);
429+
if (m_GlobalAttribVersions.MeshResourceCache != MeshResourceCacheVersion)
430+
{
431+
m_GlobalAttribVersions.MeshResourceCache = MeshResourceCacheVersion;
432+
m_DrawListItemsDirtyFlags |= DRAW_LIST_ITEM_DIRTY_FLAG_MESH_DATA;
433+
}
434+
428435
// If either mesh material or mesh geometry changes, call UpdateDrawListGPUResources(), but
429436
// don't set the dirty flags in the m_DrawListItemsDirtyFlags. The UpdateDrawListGPUResources()
430437
// method will check the version of each individual mesh and only update those that have changed.

0 commit comments

Comments
 (0)