diff --git a/Hydrogent/interface/HnMaterial.hpp b/Hydrogent/interface/HnMaterial.hpp index b6923d26..21aef7a6 100644 --- a/Hydrogent/interface/HnMaterial.hpp +++ b/Hydrogent/interface/HnMaterial.hpp @@ -79,36 +79,37 @@ class HnMaterial final : public pxr::HdMaterial /// Creates an SRB cache that should be passed to UpdateSRB(). static RefCntAutoPtr CreateSRBCache(); - static void InitSRBCache(HnRenderDelegate& RenderDelegate); - static void BeginResourceUpdate(HnRenderDelegate& RenderDelegate); - bool UpdateSRB(HnRenderDelegate& RenderDelegate); - static void EndResourceUpdate(HnRenderDelegate& RenderDelegate); + static Uint32 GetResourceCacheVersion(HnRenderDelegate& RenderDelegate); + static void InitSRBCache(HnRenderDelegate& RenderDelegate); + static void BeginResourceUpdate(HnRenderDelegate& RenderDelegate); + bool UpdateSRB(HnRenderDelegate& RenderDelegate); + static void EndResourceUpdate(HnRenderDelegate& RenderDelegate); IShaderResourceBinding* GetSRB() const { return m_SRB; } IShaderResourceBinding* GetSRB(Uint32 PrimitiveAttribsOffset) const { - VERIFY_EXPR(m_PrimitiveAttribsVar != nullptr); - m_PrimitiveAttribsVar->SetBufferOffset(PrimitiveAttribsOffset); + VERIFY_EXPR(m_SRBVars.PrimitiveAttribs != nullptr); + m_SRBVars.PrimitiveAttribs->SetBufferOffset(PrimitiveAttribsOffset); return m_SRB; } void ApplyMaterialAttribsBufferOffset(Uint32& CurrentOffset) const { - VERIFY_EXPR(m_MaterialAttribsVar != nullptr); + VERIFY_EXPR(m_SRBVars.MaterialAttribs != nullptr); VERIFY_EXPR(m_PBRMaterialAttribsBufferOffset != ~0u); if (CurrentOffset != m_PBRMaterialAttribsBufferOffset) { - m_MaterialAttribsVar->SetBufferOffset(m_PBRMaterialAttribsBufferOffset); + m_SRBVars.MaterialAttribs->SetBufferOffset(m_PBRMaterialAttribsBufferOffset); CurrentOffset = m_PBRMaterialAttribsBufferOffset; } } void SetJointsBufferOffset(Uint32 Offset) const { - if (m_JointTransformsVar == nullptr) + if (m_SRBVars.JointTransforms == nullptr) { UNEXPECTED("Joint transforms variable is not initialized, which indicates that skinning is not enabled in the renderer."); return; } - m_JointTransformsVar->SetBufferOffset(Offset); + m_SRBVars.JointTransforms->SetBufferOffset(Offset); } const GLTF::Material& GetMaterialData() const { return m_MaterialData; } @@ -176,9 +177,13 @@ class HnMaterial final : public pxr::HdMaterial std::unordered_map m_Textures; RefCntAutoPtr m_SRB; - IShaderResourceVariable* m_PrimitiveAttribsVar = nullptr; // cbPrimitiveAttribs - IShaderResourceVariable* m_MaterialAttribsVar = nullptr; // cbMaterialAttribs - IShaderResourceVariable* m_JointTransformsVar = nullptr; // cbJointTransforms + struct SRBVariables + { + IShaderResourceVariable* PrimitiveAttribs = nullptr; // cbPrimitiveAttribs + IShaderResourceVariable* MaterialAttribs = nullptr; // cbMaterialAttribs + IShaderResourceVariable* JointTransforms = nullptr; // cbJointTransforms + }; + SRBVariables m_SRBVars; GLTF::Material m_MaterialData; diff --git a/Hydrogent/src/HnMaterial.cpp b/Hydrogent/src/HnMaterial.cpp index 79cf4c08..a42faa72 100644 --- a/Hydrogent/src/HnMaterial.cpp +++ b/Hydrogent/src/HnMaterial.cpp @@ -621,7 +621,7 @@ class HnMaterialSRBCache : public ObjectBase m_BufferRegionMgr{ VariableSizeAllocationsManager::CreateInfo{ DefaultRawMemoryAllocator::GetAllocator(), - 2048, + 64 << 10, true, // DisableDebugValidation, }, }, @@ -630,7 +630,7 @@ class HnMaterialSRBCache : public ObjectBase DynamicBufferCreateInfo{ BufferDesc{ "Material attribs buffer", - 64 << 10, // 64 KB, + 0, BIND_UNIFORM_BUFFER, USAGE_DEFAULT, }, @@ -970,10 +970,9 @@ static bool ApplyStandardStaticTextureIndexing(const PBR_Renderer::CreateInfo& return true; } -bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) +Uint32 HnMaterial::GetResourceCacheVersion(HnRenderDelegate& RenderDelegate) { - HnTextureRegistry& TexRegistry = RenderDelegate.GetTextureRegistry(); - const USD_Renderer& UsdRenderer = *RenderDelegate.GetUSDRenderer(); + HnTextureRegistry& TexRegistry = RenderDelegate.GetTextureRegistry(); RefCntAutoPtr SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache}; VERIFY_EXPR(SRBCache); @@ -992,12 +991,19 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) ResourceCacheVersion += TexRegistry.GetStorageVersion(); } + return ResourceCacheVersion; +} + +bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) +{ + HnTextureRegistry& TexRegistry = RenderDelegate.GetTextureRegistry(); + const USD_Renderer& UsdRenderer = *RenderDelegate.GetUSDRenderer(); + + const Uint32 ResourceCacheVersion = GetResourceCacheVersion(RenderDelegate); if (m_ResourceCacheVersion != ResourceCacheVersion) { m_SRB.Release(); - m_PrimitiveAttribsVar = nullptr; - m_MaterialAttribsVar = nullptr; - m_JointTransformsVar = nullptr; + m_SRBVars = {}; m_ResourceCacheVersion = ResourceCacheVersion; } @@ -1010,6 +1016,9 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) } } + RefCntAutoPtr SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache}; + VERIFY_EXPR(SRBCache); + if (m_GPUDataDirty.load()) { VERIFY_EXPR(m_PSOFlags == HnRenderPass::GetMaterialPSOFlags(*this)); @@ -1038,6 +1047,7 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) HnMaterialSRBCache::ResourceKey SRBKey{m_ResourceCacheVersion}; + const HN_MATERIAL_TEXTURES_BINDING_MODE BindingMode = static_cast(RenderDelegate.GetRenderParam())->GetTextureBindingMode(); if (BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_LEGACY || BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_ATLAS) { @@ -1305,28 +1315,28 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate) if (m_SRB) { - m_MaterialAttribsVar = m_SRB->GetVariableByName(SHADER_TYPE_PIXEL, "cbMaterialAttribs"); - VERIFY_EXPR(m_MaterialAttribsVar != nullptr); - if (m_MaterialAttribsVar->Get() == nullptr) + m_SRBVars.MaterialAttribs = m_SRB->GetVariableByName(SHADER_TYPE_PIXEL, "cbMaterialAttribs"); + VERIFY_EXPR(m_SRBVars.MaterialAttribs != nullptr); + if (m_SRBVars.MaterialAttribs->Get() == nullptr) { IBuffer* pMaterialAttribsBuffer = SRBCache->GetMaterialAttribsBuffer(); // Bind maximum possible buffer range const Uint32 PBRMaterialAttribsMaxSize = SRBCache->GetMaxAttribsDataSize(); - m_MaterialAttribsVar->SetBufferRange(pMaterialAttribsBuffer, 0, PBRMaterialAttribsMaxSize); + m_SRBVars.MaterialAttribs->SetBufferRange(pMaterialAttribsBuffer, 0, PBRMaterialAttribsMaxSize); } - m_JointTransformsVar = m_SRB->GetVariableByName(SHADER_TYPE_VERTEX, UsdRenderer.GetJointTransformsVarName()); - VERIFY_EXPR(m_JointTransformsVar != nullptr || RendererSettings.MaxJointCount == 0); + m_SRBVars.JointTransforms = m_SRB->GetVariableByName(SHADER_TYPE_VERTEX, UsdRenderer.GetJointTransformsVarName()); + VERIFY_EXPR(m_SRBVars.JointTransforms != nullptr || RendererSettings.MaxJointCount == 0); const Uint32 PBRPrimitiveAttribsSize = UsdRenderer.GetPBRPrimitiveAttribsSize(PBR_Renderer::PSO_FLAG_ALL); const Uint32 PrimitiveArraySize = std::max(UsdRenderer.GetSettings().PrimitiveArraySize, 1u); m_PBRPrimitiveAttribsBufferRange = PBRPrimitiveAttribsSize * PrimitiveArraySize; - m_PrimitiveAttribsVar = m_SRB->GetVariableByName(SHADER_TYPE_PIXEL, "cbPrimitiveAttribs"); - VERIFY_EXPR(m_PrimitiveAttribsVar != nullptr); - if (m_PrimitiveAttribsVar->Get() == nullptr) + m_SRBVars.PrimitiveAttribs = m_SRB->GetVariableByName(SHADER_TYPE_PIXEL, "cbPrimitiveAttribs"); + VERIFY_EXPR(m_SRBVars.PrimitiveAttribs != nullptr); + if (m_SRBVars.PrimitiveAttribs->Get() == nullptr) { - m_PrimitiveAttribsVar->SetBufferRange(UsdRenderer.GetPBRPrimitiveAttribsCB(), 0, m_PBRPrimitiveAttribsBufferRange); + m_SRBVars.PrimitiveAttribs->SetBufferRange(UsdRenderer.GetPBRPrimitiveAttribsCB(), 0, m_PBRPrimitiveAttribsBufferRange); } } else diff --git a/Hydrogent/src/HnRenderDelegate.cpp b/Hydrogent/src/HnRenderDelegate.cpp index dc218a17..5426cbac 100644 --- a/Hydrogent/src/HnRenderDelegate.cpp +++ b/Hydrogent/src/HnRenderDelegate.cpp @@ -787,9 +787,7 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker) } { - // Tex storage version is incremented every time a new texture is created. - const Uint32 TexStorageVersion = m_TextureRegistry->GetStorageVersion() + m_TextureRegistry->GetAtlasVersion(); - if (m_MaterialResourcesVersion != m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::Material) + TexStorageVersion) + if (m_MaterialResourcesVersion != m_RenderParam->GetAttribVersion(HnRenderParam::GlobalAttrib::Material) + HnMaterial::GetResourceCacheVersion(*this)) { std::lock_guard Guard{m_MaterialsMtx}; @@ -805,7 +803,8 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker) if (AllMaterialsUpdated) { // Make global material attrib dirty to let the render passes update PSOs - m_MaterialResourcesVersion = m_RenderParam->MakeAttribDirty(HnRenderParam::GlobalAttrib::Material) + TexStorageVersion; + // Notice that the material resource cache version may have been updated since the time we checked it. + m_MaterialResourcesVersion = m_RenderParam->MakeAttribDirty(HnRenderParam::GlobalAttrib::Material) + HnMaterial::GetResourceCacheVersion(*this); } } } diff --git a/appveyor.yml b/appveyor.yml index 5d55b4d7..2b6d498b 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -36,7 +36,7 @@ before_build: - echo add_subdirectory(DiligentTools) >> CMakeLists.txt - echo add_subdirectory(DiligentFX) >> CMakeLists.txt - echo %PLATFORM% - - cmake -S . -B ./build -D DILIGENT_MSVC_RELEASE_COMPILE_OPTIONS="/arch:AVX2" -G "Visual Studio 16 2019" -A %PLATFORM% + - cmake -S . -B ./build -D DILIGENT_MSVC_COMPILE_OPTIONS="/WX" -D DILIGENT_MSVC_RELEASE_COMPILE_OPTIONS="/arch:AVX2" -G "Visual Studio 16 2019" -A %PLATFORM% build: project: c:\projects\build\DiligentFX_Test.sln