@@ -642,18 +642,22 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
642642 // / The key is the combination of unique IDs of the texture objects used by the SRB.
643643 struct ResourceKey
644644 {
645+ const Uint32 ResourceCacheVersion;
646+
645647 std::vector<Int32> UniqueIDs;
646648
647649 bool operator ==(const ResourceKey& rhs) const
648650 {
649- return UniqueIDs == rhs.UniqueIDs ;
651+ return ResourceCacheVersion == rhs. ResourceCacheVersion && UniqueIDs == rhs.UniqueIDs ;
650652 }
651653
652654 struct Hasher
653655 {
654656 size_t operator ()(const ResourceKey& Key) const
655657 {
656- return ComputeHashRaw (Key.UniqueIDs .data (), Key.UniqueIDs .size () * sizeof (Key.UniqueIDs [0 ]));
658+ return ComputeHash (
659+ Key.ResourceCacheVersion ,
660+ ComputeHashRaw (Key.UniqueIDs .data (), Key.UniqueIDs .size () * sizeof (Key.UniqueIDs [0 ])));
657661 }
658662 };
659663 };
@@ -717,6 +721,12 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
717721 }
718722 }
719723
724+ IBuffer* GetMaterialAttribsBuffer () const
725+ {
726+ VERIFY_EXPR (m_RequiredBufferSize == m_MaterialAttribsBuffer.GetDesc ().Size , " The buffer needs to be resized." );
727+ return m_MaterialAttribsBuffer.GetBuffer ();
728+ }
729+
720730 void UpdateMaterialAttribsData (Uint32 Offset, Uint32 Size, const GLTF_PBR_Renderer::PBRMaterialShaderAttribsData AttribsData)
721731 {
722732 if (Offset + Size > m_MaterialAttribsData.size ())
@@ -733,6 +743,7 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
733743
734744 IBuffer* CommitUpdates (IRenderDevice* pDevice, IDeviceContext* pContext)
735745 {
746+ VERIFY_EXPR (m_RequiredBufferSize == m_MaterialAttribsBuffer.GetDesc ().Size , " The buffer needs to be resized." );
736747 IBuffer* pBuffer = m_MaterialAttribsBuffer.GetBuffer ();
737748 if (m_DirtyRangeStart < m_DirtyRangeEnd)
738749 {
@@ -911,6 +922,19 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
911922 HnTextureRegistry& TexRegistry = RenderDelegate.GetTextureRegistry ();
912923 const USD_Renderer& UsdRenderer = *RenderDelegate.GetUSDRenderer ();
913924
925+ RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache (), IID_HnMaterialSRBCache};
926+ VERIFY_EXPR (SRBCache);
927+
928+ const Uint32 ResourceCacheVersion = TexRegistry.GetStorageVersion () + SRBCache->GetMaterialAttribsBufferVersion ();
929+ if (m_ResourceCacheVersion != ResourceCacheVersion)
930+ {
931+ m_SRB.Release ();
932+ m_PrimitiveAttribsVar = nullptr ;
933+ m_MaterialAttribsVar = nullptr ;
934+ m_JointTransformsVar = nullptr ;
935+ m_ResourceCacheVersion = ResourceCacheVersion;
936+ }
937+
914938 if (m_TextureAddressingAttribsDirty.load ())
915939 {
916940 if (!InitTextureAddressingAttribs (UsdRenderer, TexRegistry))
@@ -920,10 +944,6 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
920944 }
921945 }
922946
923- RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache (), IID_HnMaterialSRBCache};
924- VERIFY_EXPR (SRBCache);
925- IBuffer* pMaterialAttribsBuffer = SRBCache->PrepareMaterialAttribsBuffer (RenderDelegate.GetDevice (), RenderDelegate.GetDeviceContext ());
926-
927947 if (m_GPUDataDirty.load ())
928948 {
929949 VERIFY_EXPR (m_PSOFlags == HnRenderPass::GetMaterialPSOFlags (*this ));
@@ -936,21 +956,6 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
936956 m_GPUDataDirty.store (false );
937957 }
938958
939- const HN_MATERIAL_TEXTURES_BINDING_MODE BindingMode = static_cast <const HnRenderParam*>(RenderDelegate.GetRenderParam ())->GetTextureBindingMode ();
940-
941- const Uint32 TexStorageVersion = TexRegistry.GetStorageVersion ();
942- const Uint32 MaterialAttribsBufferVersion = SRBCache->GetMaterialAttribsBufferVersion ();
943- if (TexStorageVersion != m_TexRegistryStorageVersion ||
944- m_MaterialAttribsBufferVersion != MaterialAttribsBufferVersion)
945- {
946- m_SRB.Release ();
947- m_PrimitiveAttribsVar = nullptr ;
948- m_MaterialAttribsVar = nullptr ;
949- m_JointTransformsVar = nullptr ;
950- m_TexRegistryStorageVersion = TexStorageVersion;
951- m_MaterialAttribsBufferVersion = MaterialAttribsBufferVersion;
952- }
953-
954959 if (m_SRB)
955960 {
956961 return true ;
@@ -965,8 +970,9 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
965970 // Standalone textures not allocated in the atlas.
966971 std::unordered_map<PBR_Renderer::TEXTURE_ATTRIB_ID, ITexture*> StandaloneTextures;
967972
968- HnMaterialSRBCache::ResourceKey SRBKey;
973+ HnMaterialSRBCache::ResourceKey SRBKey{m_ResourceCacheVersion} ;
969974
975+ const HN_MATERIAL_TEXTURES_BINDING_MODE BindingMode = static_cast <const HnRenderParam*>(RenderDelegate.GetRenderParam ())->GetTextureBindingMode ();
970976 if (BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_LEGACY ||
971977 BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_ATLAS)
972978 {
@@ -1124,11 +1130,6 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
11241130 m_ShaderTextureIndexingId = SRBCache->AddShaderTextureIndexing (StaticShaderTexIds);
11251131 }
11261132 }
1127- else if (BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_DYNAMIC)
1128- {
1129- // Update SRB whenever texture storage version changes
1130- SRBKey.UniqueIDs .push_back (m_TexRegistryStorageVersion);
1131- }
11321133
11331134 m_SRB = SRBCache->GetSRB (SRBKey, [&]() {
11341135 RefCntAutoPtr<IShaderResourceBinding> pSRB;
@@ -1243,6 +1244,7 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
12431244 VERIFY_EXPR (m_MaterialAttribsVar != nullptr );
12441245 if (m_MaterialAttribsVar->Get () == nullptr )
12451246 {
1247+ IBuffer* pMaterialAttribsBuffer = SRBCache->GetMaterialAttribsBuffer ();
12461248 // Bind maximum possible buffer range
12471249 const Uint32 PBRMaterialAttribsMaxSize = UsdRenderer.GetPBRMaterialAttribsSize (PBR_Renderer::PSO_FLAG_ALL);
12481250 m_MaterialAttribsVar->SetBufferRange (pMaterialAttribsBuffer, 0 , PBRMaterialAttribsMaxSize);
@@ -1270,7 +1272,15 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
12701272 return true ;
12711273}
12721274
1273- void HnMaterial::CommitCacheResources (HnRenderDelegate& RenderDelegate)
1275+ void HnMaterial::BeginResourceUpdate (HnRenderDelegate& RenderDelegate)
1276+ {
1277+ RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache (), IID_HnMaterialSRBCache};
1278+ VERIFY_EXPR (SRBCache);
1279+
1280+ SRBCache->PrepareMaterialAttribsBuffer (RenderDelegate.GetDevice (), RenderDelegate.GetDeviceContext ());
1281+ }
1282+
1283+ void HnMaterial::EndResourceUpdate (HnRenderDelegate& RenderDelegate)
12741284{
12751285 RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache (), IID_HnMaterialSRBCache};
12761286 VERIFY_EXPR (SRBCache);
0 commit comments