Skip to content

Commit 957b53a

Browse files
HnMesh: some updates to SRB cache
1 parent 8c206b0 commit 957b53a

File tree

3 files changed

+55
-18
lines changed

3 files changed

+55
-18
lines changed

Hydrogent/interface/HnMaterial.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ class HnMaterial final : public pxr::HdMaterial
7878
/// Creates an SRB cache that should be passed to UpdateSRB().
7979
static RefCntAutoPtr<IObject> CreateSRBCache();
8080

81+
static void InitSRBCache(HnRenderDelegate& RenderDelegate);
8182
static void BeginResourceUpdate(HnRenderDelegate& RenderDelegate);
8283
bool UpdateSRB(HnRenderDelegate& RenderDelegate);
8384
static void EndResourceUpdate(HnRenderDelegate& RenderDelegate);

Hydrogent/src/HnMaterial.cpp

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,12 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
637637

638638
IMPLEMENT_QUERY_INTERFACE_IN_PLACE(IID_HnMaterialSRBCache, ObjectBase<IObject>)
639639

640+
void Initialize(HnRenderDelegate& RenderDelegate)
641+
{
642+
m_ConstantBufferOffsetAlignment = RenderDelegate.GetDevice()->GetAdapterInfo().Buffer.ConstantBufferOffsetAlignment;
643+
m_MaxAttribsDataSize = RenderDelegate.GetUSDRenderer()->GetPBRMaterialAttribsSize(PBR_Renderer::PSO_FLAG_ALL);
644+
}
645+
640646
/// SRB cache key
641647
///
642648
/// The key is the combination of unique IDs of the texture objects used by the SRB.
@@ -697,14 +703,16 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
697703
return it->second;
698704
}
699705

700-
Uint32 AllocateBufferOffset(Uint32 Size, Uint32 Alignment, Uint32 MaxAttribsDataSize)
706+
Uint32 AllocateBufferOffset(Uint32 Size)
701707
{
702708
std::lock_guard<std::mutex> Lock{m_CurrBufferOffsetMtx};
703709

704-
const Uint32 Offset = AlignUp(m_CurrBufferOffset, Alignment);
710+
VERIFY(m_ConstantBufferOffsetAlignment != 0 && m_MaxAttribsDataSize != 0, "The cache is not initialized");
711+
712+
const Uint32 Offset = AlignUp(m_CurrBufferOffset, m_ConstantBufferOffsetAlignment);
705713
m_CurrBufferOffset = Offset + Size;
706714
// Reserve enough space for the maximum possible attribs data size.
707-
m_RequiredBufferSize = AlignUp(Offset + MaxAttribsDataSize, Alignment);
715+
m_RequiredBufferSize = AlignUp(Offset + m_MaxAttribsDataSize, m_ConstantBufferOffsetAlignment);
708716
return Offset;
709717
}
710718

@@ -760,6 +768,11 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
760768
return pBuffer;
761769
}
762770

771+
Uint32 GetMaxAttribsDataSize() const
772+
{
773+
return m_MaxAttribsDataSize;
774+
}
775+
763776
Uint32 GetMaterialAttribsBufferVersion() const
764777
{
765778
return m_MaterialAttribsBuffer.GetVersion();
@@ -784,6 +797,9 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
784797

785798
std::unordered_map<ShaderTextureIndexingIdType, const StaticShaderTextureIdsArrayType&> m_IdToIndexing;
786799

800+
Uint32 m_ConstantBufferOffsetAlignment = 0;
801+
Uint32 m_MaxAttribsDataSize = 0;
802+
787803
std::mutex m_CurrBufferOffsetMtx;
788804
Uint32 m_CurrBufferOffset = 0;
789805
Uint32 m_RequiredBufferSize = 0;
@@ -810,9 +826,7 @@ void HnMaterial::AllocateBufferSpace(HnRenderDelegate& RenderDelegate)
810826
RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache};
811827
VERIFY_EXPR(SRBCache);
812828

813-
const Uint32 ConstantBufferOffsetAlignment = RenderDelegate.GetDevice()->GetAdapterInfo().Buffer.ConstantBufferOffsetAlignment;
814-
const Uint32 MaxAttribsDataSize = UsdRenderer.GetPBRMaterialAttribsSize(PBR_Renderer::PSO_FLAG_ALL);
815-
m_PBRMaterialAttribsBufferOffset = SRBCache->AllocateBufferOffset(m_PBRMaterialAttribsSize, ConstantBufferOffsetAlignment, MaxAttribsDataSize);
829+
m_PBRMaterialAttribsBufferOffset = SRBCache->AllocateBufferOffset(m_PBRMaterialAttribsSize);
816830
}
817831
}
818832

@@ -1246,7 +1260,7 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
12461260
{
12471261
IBuffer* pMaterialAttribsBuffer = SRBCache->GetMaterialAttribsBuffer();
12481262
// Bind maximum possible buffer range
1249-
const Uint32 PBRMaterialAttribsMaxSize = UsdRenderer.GetPBRMaterialAttribsSize(PBR_Renderer::PSO_FLAG_ALL);
1263+
const Uint32 PBRMaterialAttribsMaxSize = SRBCache->GetMaxAttribsDataSize();
12501264
m_MaterialAttribsVar->SetBufferRange(pMaterialAttribsBuffer, 0, PBRMaterialAttribsMaxSize);
12511265
}
12521266

@@ -1272,23 +1286,43 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
12721286
return true;
12731287
}
12741288

1275-
void HnMaterial::BeginResourceUpdate(HnRenderDelegate& RenderDelegate)
1289+
void HnMaterial::InitSRBCache(HnRenderDelegate& RenderDelegate)
12761290
{
1277-
RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache};
1278-
VERIFY_EXPR(SRBCache);
1291+
if (RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache})
1292+
{
1293+
SRBCache->Initialize(RenderDelegate);
1294+
}
1295+
else
1296+
{
1297+
UNEXPECTED("Material SRB cache must not be null");
1298+
}
1299+
}
12791300

1280-
SRBCache->PrepareMaterialAttribsBuffer(RenderDelegate.GetDevice(), RenderDelegate.GetDeviceContext());
1301+
void HnMaterial::BeginResourceUpdate(HnRenderDelegate& RenderDelegate)
1302+
{
1303+
if (RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache})
1304+
{
1305+
SRBCache->PrepareMaterialAttribsBuffer(RenderDelegate.GetDevice(), RenderDelegate.GetDeviceContext());
1306+
}
1307+
else
1308+
{
1309+
UNEXPECTED("Material SRB cache must not be null");
1310+
}
12811311
}
12821312

12831313
void HnMaterial::EndResourceUpdate(HnRenderDelegate& RenderDelegate)
12841314
{
1285-
RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache};
1286-
VERIFY_EXPR(SRBCache);
1287-
1288-
IDeviceContext* pContext = RenderDelegate.GetDeviceContext();
1289-
IBuffer* pBuffer = SRBCache->CommitUpdates(RenderDelegate.GetDevice(), pContext);
1290-
StateTransitionDesc Barrier{pBuffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
1291-
pContext->TransitionResourceStates(1, &Barrier);
1315+
if (RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache})
1316+
{
1317+
IDeviceContext* pContext = RenderDelegate.GetDeviceContext();
1318+
IBuffer* pBuffer = SRBCache->CommitUpdates(RenderDelegate.GetDevice(), pContext);
1319+
StateTransitionDesc Barrier{pBuffer, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_CONSTANT_BUFFER, STATE_TRANSITION_FLAG_UPDATE_STATE};
1320+
pContext->TransitionResourceStates(1, &Barrier);
1321+
}
1322+
else
1323+
{
1324+
UNEXPECTED("Material SRB cache must not be null");
1325+
}
12921326
}
12931327

12941328
} // namespace USD

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@ HnRenderDelegate::HnRenderDelegate(const CreateInfo& CI) :
422422
},
423423
m_ShadowMapManager{CreateShadowMapManager(CI)}
424424
{
425+
HnMaterial::InitSRBCache(*this);
426+
425427
const Uint32 ConstantBufferOffsetAlignment = m_pDevice->GetAdapterInfo().Buffer.ConstantBufferOffsetAlignment;
426428

427429
m_MainPassFrameAttribsAlignedSize = AlignUpNonPw2(m_USDRenderer->GetPRBFrameAttribsSize(), ConstantBufferOffsetAlignment);

0 commit comments

Comments
 (0)