ATOM-16249 Adding draw srg caching to DynamicDrawContext since creating SRG can be expensive for some backend (#4491)
* ATOM-16249 Adding draw srg caching to DynamicDrawContext since creating SRG can be expensive for some backend Signed-off-by: Qing Tao <qingtao@amazon.com>
This commit is contained in:
@@ -518,7 +518,6 @@ namespace AZ
|
||||
if (drawSrg)
|
||||
{
|
||||
drawItem.m_uniqueShaderResourceGroup = drawSrg->GetRHIShaderResourceGroup();
|
||||
m_cachedDrawSrg.push_back(drawSrg);
|
||||
}
|
||||
|
||||
// Set scissor per draw if scissor is enabled.
|
||||
@@ -608,7 +607,6 @@ namespace AZ
|
||||
if (drawSrg)
|
||||
{
|
||||
drawItem.m_uniqueShaderResourceGroup = drawSrg->GetRHIShaderResourceGroup();
|
||||
m_cachedDrawSrg.push_back(drawSrg);
|
||||
}
|
||||
|
||||
// Set scissor per draw if scissor is enabled.
|
||||
@@ -635,7 +633,22 @@ namespace AZ
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
auto drawSrg = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), m_shader->GetSupervariantIndex(), m_drawSrgLayout->GetName());
|
||||
|
||||
Data::Instance<ShaderResourceGroup> drawSrg;
|
||||
if (m_nextDrawSrgIdx == m_cachedDrawSrg.size())
|
||||
{
|
||||
drawSrg = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), m_shader->GetSupervariantIndex(), m_drawSrgLayout->GetName());
|
||||
m_cachedDrawSrg.push_back(drawSrg);
|
||||
}
|
||||
else if (m_nextDrawSrgIdx < m_cachedDrawSrg.size())
|
||||
{
|
||||
drawSrg = m_cachedDrawSrg[m_nextDrawSrgIdx];
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_Assert(false, "Unexpected next draw srg index");
|
||||
}
|
||||
m_nextDrawSrgIdx++;
|
||||
|
||||
// Set fallback value for shader variant if draw srg contains constant for shader variant fallback
|
||||
if (m_hasShaderVariantKeyFallbackEntry)
|
||||
@@ -727,7 +740,7 @@ namespace AZ
|
||||
}
|
||||
|
||||
for (auto& drawItemProperties : m_cachedDrawList)
|
||||
{
|
||||
{
|
||||
view->AddDrawItem(m_drawListTag, drawItemProperties);
|
||||
}
|
||||
}
|
||||
@@ -743,9 +756,14 @@ namespace AZ
|
||||
m_cachedDrawItems.clear();
|
||||
m_cachedStreamBufferViews.clear();
|
||||
m_cachedIndexBufferViews.clear();
|
||||
m_cachedDrawSrg.clear();
|
||||
m_cachedDrawList.clear();
|
||||
m_nextDrawSrgIdx = 0;
|
||||
m_drawFinalized = false;
|
||||
|
||||
for (auto srg:m_cachedDrawSrg)
|
||||
{
|
||||
srg->ResetViews();
|
||||
}
|
||||
}
|
||||
|
||||
const RHI::PipelineState* DynamicDrawContext::GetCurrentPipelineState()
|
||||
|
||||
Reference in New Issue
Block a user