Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 18 additions & 13 deletions Hydrogent/interface/HnMaterial.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,36 +79,37 @@ class HnMaterial final : public pxr::HdMaterial
/// Creates an SRB cache that should be passed to UpdateSRB().
static RefCntAutoPtr<IObject> 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; }
Expand Down Expand Up @@ -176,9 +177,13 @@ class HnMaterial final : public pxr::HdMaterial
std::unordered_map<pxr::TfToken, HnTextureRegistry::TextureHandleSharedPtr, pxr::TfToken::HashFunctor> m_Textures;

RefCntAutoPtr<IShaderResourceBinding> 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;

Expand Down
46 changes: 28 additions & 18 deletions Hydrogent/src/HnMaterial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,7 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
m_BufferRegionMgr{
VariableSizeAllocationsManager::CreateInfo{
DefaultRawMemoryAllocator::GetAllocator(),
2048,
64 << 10,
true, // DisableDebugValidation,
},
},
Expand All @@ -630,7 +630,7 @@ class HnMaterialSRBCache : public ObjectBase<IObject>
DynamicBufferCreateInfo{
BufferDesc{
"Material attribs buffer",
64 << 10, // 64 KB,
0,
BIND_UNIFORM_BUFFER,
USAGE_DEFAULT,
},
Expand Down Expand Up @@ -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<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache};
VERIFY_EXPR(SRBCache);
Expand All @@ -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;
}

Expand All @@ -1010,6 +1016,9 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)
}
}

RefCntAutoPtr<HnMaterialSRBCache> SRBCache{RenderDelegate.GetMaterialSRBCache(), IID_HnMaterialSRBCache};
VERIFY_EXPR(SRBCache);

if (m_GPUDataDirty.load())
{
VERIFY_EXPR(m_PSOFlags == HnRenderPass::GetMaterialPSOFlags(*this));
Expand Down Expand Up @@ -1038,6 +1047,7 @@ bool HnMaterial::UpdateSRB(HnRenderDelegate& RenderDelegate)

HnMaterialSRBCache::ResourceKey SRBKey{m_ResourceCacheVersion};

const HN_MATERIAL_TEXTURES_BINDING_MODE BindingMode = static_cast<const HnRenderParam*>(RenderDelegate.GetRenderParam())->GetTextureBindingMode();
if (BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_LEGACY ||
BindingMode == HN_MATERIAL_TEXTURES_BINDING_MODE_ATLAS)
{
Expand Down Expand Up @@ -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
Expand Down
7 changes: 3 additions & 4 deletions Hydrogent/src/HnRenderDelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::mutex> Guard{m_MaterialsMtx};

Expand All @@ -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);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading