Added support for supervariants to the PrecompiledShaderBuilder

Signed-off-by: dmcdiarmid-ly <63674186+dmcdiarmid-ly@users.noreply.github.com>
This commit is contained in:
dmcdiarmid-ly
2022-01-17 16:52:30 -07:00
parent 4cd3568d7b
commit 2b103ce445
16 changed files with 341 additions and 207 deletions
@@ -382,7 +382,7 @@ namespace AZ
return EndCommon(shaderAsset);
}
void ShaderAssetCreator::Clone(const Data::AssetId& assetId, const ShaderAsset& sourceShaderAsset, [[maybe_unused]] const ShaderRootVariantAssets& rootVariantAssets)
void ShaderAssetCreator::Clone(const Data::AssetId& assetId, const ShaderAsset& sourceShaderAsset, [[maybe_unused]] const ShaderSupervariants& supervariants)
{
BeginCommon(assetId);
@@ -392,38 +392,60 @@ namespace AZ
m_asset->m_shaderOptionGroupLayout = sourceShaderAsset.m_shaderOptionGroupLayout;
m_asset->m_buildTimestamp = sourceShaderAsset.m_buildTimestamp;
// copy root variant assets
// copy the perAPIShaderData
for (auto& perAPIShaderData : sourceShaderAsset.m_perAPIShaderData)
{
// find the matching ShaderVariantAsset
AZ::Data::Asset<ShaderVariantAsset> foundVariantAsset;
for (const auto& variantAsset : rootVariantAssets)
{
if (variantAsset.first == perAPIShaderData.m_APIType)
{
foundVariantAsset = variantAsset.second;
break;
}
}
if (!foundVariantAsset)
{
ReportWarning("Failed to find variant asset for API [%d]", perAPIShaderData.m_APIType);
}
m_asset->m_perAPIShaderData.push_back(perAPIShaderData);
if (m_asset->m_perAPIShaderData.back().m_supervariants.empty())
if (perAPIShaderData.m_supervariants.empty())
{
ReportWarning("Attempting to clone a shader asset that has no supervariants for API [%d]", perAPIShaderData.m_APIType);
continue;
}
else
if (perAPIShaderData.m_supervariants.size() != supervariants.size())
{
// currently we only support one supervariant when cloning
// [GFX TODO][ATOM-15740] Support multiple supervariants in ShaderAssetCreator::Clone
m_asset->m_perAPIShaderData.back().m_supervariants[0].m_rootShaderVariantAsset = foundVariantAsset;
ReportError("Incorrect number of supervariants provided to ShaderAssetCreator::Clone");
return;
}
m_asset->m_perAPIShaderData.push_back(perAPIShaderData);
// set the supervariants for this API
for (auto& supervariant : m_asset->m_perAPIShaderData.back().m_supervariants)
{
// find the matching Supervariant by name from the incoming list
ShaderSupervariants::const_iterator itFoundSuperVariant = AZStd::find_if(
supervariants.begin(),
supervariants.end(),
[&supervariant](const ShaderSupervariant& shaderSupervariant)
{
return supervariant.m_name == shaderSupervariant.m_name;
});
if (itFoundSuperVariant == supervariants.end())
{
ReportError("Failed to find supervariant [%s]", supervariant.m_name.GetCStr());
return;
}
// find the matching ShaderVariantAsset for this API
ShaderRootVariantAssets::const_iterator itFoundRootShaderVariantAsset = AZStd::find_if(
itFoundSuperVariant->m_rootVariantAssets.begin(),
itFoundSuperVariant->m_rootVariantAssets.end(),
[&perAPIShaderData](const ShaderRootVariantAssetPair& rootShaderVariantAsset)
{
return perAPIShaderData.m_APIType == rootShaderVariantAsset.first;
});
if (itFoundRootShaderVariantAsset == itFoundSuperVariant->m_rootVariantAssets.end())
{
ReportWarning("Failed to find root shader variant asset for API [%d] Supervariant [%s]", perAPIShaderData.m_APIType, supervariant.m_name.GetCStr());
}
else
{
supervariant.m_rootShaderVariantAsset = itFoundRootShaderVariantAsset->second;
}
}
}
}
} // namespace RPI
} // namespace AZ