Skip to content

Commit ea9b1dc

Browse files
HnGeometryPool: reworked space reserving
1 parent a952254 commit ea9b1dc

File tree

3 files changed

+66
-28
lines changed

3 files changed

+66
-28
lines changed

Hydrogent/include/HnGeometryPool.hpp

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,32 @@ class HnGeometryPool final
9797
Int64 GetPendingVertexDataSize() const { return m_PendingVertexDataSize.load(); }
9898
Int64 GetPendingIndexDataSize() const { return m_PendingIndexDataSize.load(); }
9999

100-
Int64 ReserveDataSize(Uint64 Size);
101-
void ReleaseReservedDataSize(Uint64 Size);
100+
class ReservedSpace
101+
{
102+
public:
103+
ReservedSpace(ReservedSpace&& Other) noexcept;
104+
105+
ReservedSpace& operator=(const ReservedSpace&) = delete;
106+
ReservedSpace& operator=(ReservedSpace&&) = delete;
107+
108+
~ReservedSpace();
109+
void Release();
110+
111+
Uint64 GetTotalPendingSize() const { return m_TotalPendingSize; }
112+
113+
private:
114+
ReservedSpace(HnGeometryPool& Pool, Uint64 Size, Uint64 TotalPendingSize) noexcept;
115+
116+
private:
117+
friend class HnGeometryPool;
118+
HnGeometryPool& m_Pool;
119+
Uint64 m_Size = 0;
120+
Uint64 m_TotalPendingSize = 0;
121+
};
122+
ReservedSpace ReserveSpace(Uint64 Size);
123+
124+
private:
125+
void ReleaseReservedSpace(Uint64 Size);
102126

103127
private:
104128
RefCntAutoPtr<IRenderDevice> m_pDevice;

Hydrogent/src/HnGeometryPool.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,15 +1017,49 @@ void HnGeometryPool::Commit(IDeviceContext* pContext)
10171017
}
10181018
}
10191019

1020-
Int64 HnGeometryPool::ReserveDataSize(Uint64 Size)
1020+
HnGeometryPool::ReservedSpace::ReservedSpace(HnGeometryPool& Pool,
1021+
Uint64 Size,
1022+
Uint64 TotalPendingSize) noexcept :
1023+
m_Pool{Pool},
1024+
m_Size{Size},
1025+
m_TotalPendingSize{TotalPendingSize}
10211026
{
1022-
return GetPendingVertexDataSize() +
1027+
}
1028+
1029+
HnGeometryPool::ReservedSpace::ReservedSpace(ReservedSpace&& Other) noexcept :
1030+
m_Pool{Other.m_Pool},
1031+
m_Size{Other.m_Size},
1032+
m_TotalPendingSize{Other.m_TotalPendingSize}
1033+
{
1034+
Other.m_Size = 0;
1035+
Other.m_TotalPendingSize = 0;
1036+
}
1037+
1038+
void HnGeometryPool::ReservedSpace::Release()
1039+
{
1040+
if (m_Size != 0)
1041+
{
1042+
m_Pool.ReleaseReservedSpace(m_Size);
1043+
m_Size = 0;
1044+
}
1045+
}
1046+
1047+
HnGeometryPool::ReservedSpace::~ReservedSpace()
1048+
{
1049+
Release();
1050+
}
1051+
1052+
HnGeometryPool::ReservedSpace HnGeometryPool::ReserveSpace(Uint64 Size)
1053+
{
1054+
const Int64 TotalPendingSize =
1055+
GetPendingVertexDataSize() +
10231056
GetPendingIndexDataSize() +
10241057
m_ReservedDataSize.fetch_add(static_cast<Int64>(Size)) +
10251058
static_cast<Int64>(Size);
1059+
return {*this, Size, static_cast<Uint64>(TotalPendingSize)};
10261060
}
10271061

1028-
void HnGeometryPool::ReleaseReservedDataSize(Uint64 Size)
1062+
void HnGeometryPool::ReleaseReservedSpace(Uint64 Size)
10291063
{
10301064
VERIFY_EXPR(m_ReservedDataSize.load() >= static_cast<Int64>(Size));
10311065
m_ReservedDataSize.fetch_add(-static_cast<Int64>(Size));

Hydrogent/src/HnMesh.cpp

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -412,30 +412,10 @@ bool HnMesh::UpdateRepr(pxr::HdSceneDelegate& SceneDelegate,
412412
ExpectedGeometryDataSize += MeshUtils.GetTotalIndexCount(IndexCountFlags) * sizeof(Uint32);
413413
}
414414

415-
class GeometryPoolReservedDataGuard
415+
HnGeometryPool::ReservedSpace ReservedSpace = GeometryPool.ReserveSpace(ExpectedGeometryDataSize);
416+
if (GeometryLoadBudget > 0 && ReservedSpace.GetTotalPendingSize() > GeometryLoadBudget)
416417
{
417-
public:
418-
GeometryPoolReservedDataGuard(HnGeometryPool& Pool, Uint64 Size) :
419-
m_Pool{Pool},
420-
m_Size{Size},
421-
m_TotalSize{static_cast<Uint64>(Pool.ReserveDataSize(Size))}
422-
{
423-
}
424-
~GeometryPoolReservedDataGuard()
425-
{
426-
m_Pool.ReleaseReservedDataSize(m_Size);
427-
}
428-
Uint64 GetTotalSize() const { return m_TotalSize; }
429-
430-
private:
431-
HnGeometryPool& m_Pool;
432-
const Uint64 m_Size;
433-
const Uint64 m_TotalSize;
434-
};
435-
GeometryPoolReservedDataGuard ReservedDataGuard{GeometryPool, ExpectedGeometryDataSize};
436-
if (GeometryLoadBudget > 0 && ReservedDataGuard.GetTotalSize() > GeometryLoadBudget)
437-
{
438-
if (ReservedDataGuard.GetTotalSize() == ExpectedGeometryDataSize)
418+
if (ReservedSpace.GetTotalPendingSize() == ExpectedGeometryDataSize)
439419
{
440420
LOG_WARNING_MESSAGE("Syncing rprim ", Id, " requires ", ExpectedGeometryDataSize,
441421
" bytes of geometry data, which exceeds the budget ", GeometryLoadBudget, ".");

0 commit comments

Comments
 (0)