Skip to content

Commit 1b2046e

Browse files
HnGeometryPool: do not keep a reference to the buffer when pool allocation is used
1 parent 1744a40 commit 1b2046e

File tree

1 file changed

+47
-29
lines changed

1 file changed

+47
-29
lines changed

Hydrogent/src/HnGeometryPool.cpp

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,9 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
217217
const VertexStream& ExistingStream = stream_it.second;
218218
if (m_Streams.find(SourceName) == m_Streams.end())
219219
{
220-
VERIFY(ExistingStream.Buffer, "ExistingStream.Buffer must not be null for existing data as it is set in the Initialize() method and the data must be initialized.");
221-
AddStream(SourceName, ExistingStream.ElementSize, nullptr, ExistingStream.Buffer);
220+
IBuffer* pSrcBuffer = ExistingData->GetBuffer(SourceName);
221+
VERIFY(pSrcBuffer, "pSrcBuffer must not be null for existing data as it must be initialized.");
222+
AddStream(SourceName, ExistingStream.ElementSize, nullptr, pSrcBuffer);
222223
}
223224
}
224225
}
@@ -235,7 +236,11 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
235236
IBuffer* GetBuffer(const pxr::TfToken& Name) const
236237
{
237238
auto it = m_Streams.find(Name);
238-
return it != m_Streams.end() ? it->second.Buffer : nullptr;
239+
if (it == m_Streams.end())
240+
return nullptr;
241+
242+
VERIFY_EXPR(!m_PoolAllocation || !it->second.Buffer);
243+
return m_PoolAllocation ? m_PoolAllocation->GetBuffer(it->second.PoolIndex) : it->second.Buffer;
239244
}
240245

241246
Uint32 GetNumVertices() const
@@ -280,7 +285,7 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
280285
if (src_stream_it != ExistingData->m_Streams.end())
281286
{
282287
VERIFY_EXPR(Stream.ElementSize == src_stream_it->second.ElementSize);
283-
VERIFY_EXPR(src_stream_it->second.Buffer);
288+
VERIFY_EXPR(m_PoolAllocation || src_stream_it->second.Buffer);
284289
Stream.Buffer = std::move(src_stream_it->second.Buffer);
285290
}
286291
else
@@ -311,28 +316,34 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
311316
continue;
312317
}
313318

319+
IBuffer* pBuffer = nullptr;
314320
const Uint32 DataSize = static_cast<Uint32>(m_NumVertices * Stream.ElementSize);
315321
if (m_PoolAllocation)
316322
{
317323
VERIFY(m_PoolAllocation->GetVertexCount() == m_NumVertices, "Unexpected number of vertices in the pool allocation.");
318-
Stream.Buffer = m_PoolAllocation->GetBuffer(Stream.PoolIndex);
324+
pBuffer = m_PoolAllocation->GetBuffer(Stream.PoolIndex);
319325
}
320-
else if (!Stream.Buffer)
326+
else
321327
{
322-
const auto BufferName = m_Name + " - " + StreamName.GetString();
323-
BufferDesc Desc{
324-
BufferName.c_str(),
325-
DataSize,
326-
BIND_VERTEX_BUFFER,
327-
USAGE_DEFAULT,
328-
};
329-
pDevice->CreateBuffer(Desc, nullptr, &Stream.Buffer);
328+
if (!Stream.Buffer)
329+
{
330+
const auto BufferName = m_Name + " - " + StreamName.GetString();
331+
BufferDesc Desc{
332+
BufferName.c_str(),
333+
DataSize,
334+
BIND_VERTEX_BUFFER,
335+
USAGE_DEFAULT,
336+
};
337+
pDevice->CreateBuffer(Desc, nullptr, &Stream.Buffer);
338+
}
339+
pBuffer = Stream.Buffer;
330340
}
341+
VERIFY_EXPR(pBuffer != nullptr);
331342

332343
if (const pxr::HdBufferSource* pSource = source_it->second.Source.get())
333344
{
334345
VERIFY(pSource->GetNumElements() == m_NumVertices, "Unexpected number of elements in vertex data source ", StreamName);
335-
pContext->UpdateBuffer(Stream.Buffer, GetStartVertex() * Stream.ElementSize, DataSize, pSource->GetData(), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
346+
pContext->UpdateBuffer(pBuffer, GetStartVertex() * Stream.ElementSize, DataSize, pSource->GetData(), RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
336347
}
337348
else if (IBuffer* pSrcBuffer = source_it->second.Buffer)
338349
{
@@ -342,15 +353,15 @@ class HnGeometryPool::VertexData final : public GeometryPoolData
342353
pSrcBuffer,
343354
ExistingData->GetStartVertex() * Stream.ElementSize,
344355
RESOURCE_STATE_TRANSITION_MODE_TRANSITION,
345-
Stream.Buffer,
356+
pBuffer,
346357
GetStartVertex() * Stream.ElementSize,
347358
DataSize,
348359
RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
349360
}
350361
else
351362
{
352363
// We have taken the buffer from the existing data - no need to copy
353-
VERIFY(Stream.Buffer == pSrcBuffer, "Unexpected buffer for vertex stream '", StreamName, "'");
364+
VERIFY(pBuffer == pSrcBuffer, "Unexpected buffer for vertex stream '", StreamName, "'");
354365
}
355366
}
356367
else
@@ -628,7 +639,8 @@ class HnGeometryPool::IndexData final : public GeometryPoolData
628639

629640
IBuffer* GetBuffer() const
630641
{
631-
return m_Buffer;
642+
VERIFY_EXPR(!m_Suballocation || !m_Buffer);
643+
return m_Suballocation ? m_Suballocation->GetBuffer() : m_Buffer;
632644
}
633645

634646
Uint32 GetStartIndex() const
@@ -687,27 +699,33 @@ class HnGeometryPool::IndexData final : public GeometryPoolData
687699
}
688700
}
689701

702+
IBuffer* pBuffer = nullptr;
690703
if (m_Suballocation)
691704
{
692-
m_Buffer = m_Suballocation->GetBuffer();
705+
pBuffer = m_Suballocation->GetBuffer();
693706
VERIFY_EXPR(m_Suballocation->GetSize() == m_StagingData->Size);
694707
}
695-
else if (!m_Buffer)
708+
else
696709
{
697-
BufferDesc Desc{
698-
m_Name.c_str(),
699-
m_StagingData->Size,
700-
BIND_INDEX_BUFFER,
701-
USAGE_DEFAULT,
702-
};
703-
pDevice->CreateBuffer(Desc, nullptr, &m_Buffer);
710+
if (!m_Buffer)
711+
{
712+
BufferDesc Desc{
713+
m_Name.c_str(),
714+
m_StagingData->Size,
715+
BIND_INDEX_BUFFER,
716+
USAGE_DEFAULT,
717+
};
718+
pDevice->CreateBuffer(Desc, nullptr, &m_Buffer);
719+
}
720+
pBuffer = m_Buffer;
704721
}
722+
VERIFY_EXPR(pBuffer != nullptr);
705723

706-
pContext->UpdateBuffer(m_Buffer, GetStartIndex() * sizeof(Uint32), m_StagingData->Size, m_StagingData->Ptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
724+
pContext->UpdateBuffer(pBuffer, GetStartIndex() * sizeof(Uint32), m_StagingData->Size, m_StagingData->Ptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION);
707725

708726
if (!m_Suballocation)
709727
{
710-
StateTransitionDesc Barrier{m_Buffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_INDEX_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
728+
StateTransitionDesc Barrier{pBuffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_INDEX_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
711729
pContext->TransitionResourceStates(1, &Barrier);
712730
}
713731

0 commit comments

Comments
 (0)