Skip to content

Commit 8c206b0

Browse files
HnMaterial: fixed issue with SRB cache not tracking material attribs buffer version
1 parent 67b9491 commit 8c206b0

File tree

3 files changed

+44
-35
lines changed

3 files changed

+44
-35
lines changed

Hydrogent/interface/HnMaterial.hpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@ 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 BeginResourceUpdate(HnRenderDelegate& RenderDelegate);
8182
bool UpdateSRB(HnRenderDelegate& RenderDelegate);
82-
static void CommitCacheResources(HnRenderDelegate& RenderDelegate);
83+
static void EndResourceUpdate(HnRenderDelegate& RenderDelegate);
8384

8485
IShaderResourceBinding* GetSRB() const { return m_SRB; }
8586
IShaderResourceBinding* GetSRB(Uint32 PrimitiveAttribsOffset) const
@@ -204,11 +205,8 @@ class HnMaterial final : public pxr::HdMaterial
204205
// The offset in the cbMaterialAttribs buffer.
205206
Uint32 m_PBRMaterialAttribsBufferOffset = ~0u;
206207

207-
// Current texture storage version
208-
Uint32 m_TexRegistryStorageVersion = 0;
209-
210-
// Current material attribs buffer version
211-
Uint32 m_MaterialAttribsBufferVersion = ~0u;
208+
// Texture registry storage version + material attribs buffer version.
209+
Uint32 m_ResourceCacheVersion = ~0u;
212210

213211
ShaderTextureIndexingIdType m_ShaderTextureIndexingId = 0;
214212
};

Hydrogent/src/HnMaterial.cpp

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,13 +741,14 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
741741
{
742742
std::lock_guard<std::mutex> Guard{m_MaterialsMtx};
743743

744+
HnMaterial::BeginResourceUpdate(*this);
744745
bool AllMaterialsUpdated = true;
745746
for (auto* pMat : m_Materials)
746747
{
747748
if (!pMat->UpdateSRB(*this))
748749
AllMaterialsUpdated = false;
749750
}
750-
HnMaterial::CommitCacheResources(*this);
751+
HnMaterial::EndResourceUpdate(*this);
751752

752753
if (AllMaterialsUpdated)
753754
{

0 commit comments

Comments
 (0)