@@ -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
12831313void 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
0 commit comments