Integrating up through commit 90f050496

This commit is contained in:
alexpete
2021-04-07 14:03:29 -07:00
parent 8f2ed080a9
commit c2cbd430fe
2694 changed files with 285622 additions and 176874 deletions
@@ -95,13 +95,25 @@ namespace AZ
}
void DynamicDrawContext::InitShader(Data::Asset<ShaderAsset> shaderAsset, const ShaderOptionList* optionAndValues)
void DynamicDrawContext::InitShader(Data::Asset<ShaderAsset> shaderAsset)
{
Data::Instance<Shader> shader = Shader::FindOrCreate(shaderAsset);
InitShader(shader, optionAndValues);
InitShader(shader);
}
void DynamicDrawContext::InitShader(Data::Instance<Shader> shader, const ShaderOptionList* optionAndValues)
void DynamicDrawContext::InitShader(Data::Instance<Shader> shader)
{
InitShaderWithVariant(shader, nullptr);
m_supportShaderVariants = true;
}
void DynamicDrawContext::InitShaderWithVariant(Data::Asset<ShaderAsset> shaderAsset, const ShaderOptionList* optionAndValues)
{
Data::Instance<Shader> shader = Shader::FindOrCreate(shaderAsset);
InitShaderWithVariant(shader, optionAndValues);
}
void DynamicDrawContext::InitShaderWithVariant(Data::Instance<Shader> shader, const ShaderOptionList* optionAndValues)
{
AZ_Assert(!m_initialized, "Can't call InitShader after context was initialized (EndInit was called)");
@@ -111,6 +123,9 @@ namespace AZ
return;
}
m_supportShaderVariants = false;
m_shader = shader;
m_pipelineState = aznew RPI::PipelineStateForDraw;
m_pipelineState->Init(shader, optionAndValues);
@@ -200,6 +215,30 @@ namespace AZ
return m_initialized;
}
ShaderVariantId DynamicDrawContext::UseShaderVariant(const ShaderOptionList& optionAndValues)
{
AZ_Assert(m_initialized && m_supportShaderVariants, "DynamicDrawContext is not initialized or unable to support shader variants. "
"Check if it was initialized with InitShaderWithVariant");
ShaderVariantId variantId;
if (!m_supportShaderVariants)
{
return variantId;
}
RPI::ShaderOptionGroup shaderOptionGroup = m_shader->CreateShaderOptionGroup();
shaderOptionGroup.SetUnspecifiedToDefaultValues();
for (const auto& optionAndValue : optionAndValues)
{
shaderOptionGroup.SetValue(optionAndValue.first, optionAndValue.second);
}
variantId = shaderOptionGroup.GetShaderVariantId();
return variantId;
}
void DynamicDrawContext::AddDrawStateOptions(DrawStateOptions options)
{
AZ_Assert(!m_initialized, "Can't call AddDrawStateOptions after context was initialized (EndInit was called)");
@@ -314,6 +353,13 @@ namespace AZ
m_useViewport = false;
}
void DynamicDrawContext::SetShaderVariant(ShaderVariantId shaderVariantId)
{
AZ_Assert( m_initialized && m_supportShaderVariants, "DynamicDrawContext is not initialized or unable to support shader variants. "
"Check if it was initialized with InitShaderWithVariant");
m_currentShaderVariantId = shaderVariantId;
}
void DynamicDrawContext::DrawIndexed(void* vertexData, uint32_t vertexCount, void* indexData, uint32_t indexCount, RHI::IndexFormat indexFormat, Data::Instance < ShaderResourceGroup> drawSrg)
{
if (!m_initialized)
@@ -492,10 +538,19 @@ namespace AZ
}
auto drawSrg = AZ::RPI::ShaderResourceGroup::Create(m_drawSrgAsset);
// set fallback value for shader variant
// Set fallback value for shader variant if draw srg contains constant for shader variant fallback
if (m_hasShaderVariantKeyFallbackEntry)
{
m_pipelineState->UpdateSrgVariantFallback(drawSrg);
// If the dynamic draw context support multiple shader variants, it uses m_currentShaderVariantId to setup srg shader variant fallback key
if (m_supportShaderVariants)
{
drawSrg->SetShaderVariantKeyFallbackValue(m_currentShaderVariantId.m_key);
}
// otherwise use the m_pipelineState to config the fallback
else
{
m_pipelineState->UpdateSrgVariantFallback(drawSrg);
}
}
return drawSrg;
@@ -516,6 +571,11 @@ namespace AZ
return m_drawListTag;
}
const Data::Instance<Shader>& DynamicDrawContext::GetShader() const
{
return m_shader;
}
void DynamicDrawContext::SubmitDrawData(ViewPtr view)
{
if (!m_initialized)