Merge remote-tracking branch 'upstream/development' into Atom/santorac/MaterialAssetDeferredBaking3
This commit is contained in:
@@ -14,29 +14,43 @@ namespace AZ
|
||||
{
|
||||
namespace RPI
|
||||
{
|
||||
void RootShaderVariantAssetSourceData::Reflect(ReflectContext* context)
|
||||
void PrecompiledRootShaderVariantAssetSourceData::Reflect(ReflectContext* context)
|
||||
{
|
||||
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
|
||||
{
|
||||
serializeContext->Class<RootShaderVariantAssetSourceData>()
|
||||
serializeContext->Class<PrecompiledRootShaderVariantAssetSourceData>()
|
||||
->Version(0)
|
||||
->Field("APIName", &RootShaderVariantAssetSourceData::m_apiName)
|
||||
->Field("RootShaderVariantAssetFileName", &RootShaderVariantAssetSourceData::m_rootShaderVariantAssetFileName)
|
||||
->Field("APIName", &PrecompiledRootShaderVariantAssetSourceData::m_apiName)
|
||||
->Field("RootShaderVariantAssetFileName", &PrecompiledRootShaderVariantAssetSourceData::m_rootShaderVariantAssetFileName)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void PrecompiledSupervariantSourceData::Reflect(ReflectContext* context)
|
||||
{
|
||||
PrecompiledRootShaderVariantAssetSourceData::Reflect(context);
|
||||
|
||||
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
|
||||
{
|
||||
serializeContext->Class<PrecompiledSupervariantSourceData>()
|
||||
->Version(0)
|
||||
->Field("Name", &PrecompiledSupervariantSourceData::m_name)
|
||||
->Field("RootShaderVariantAssets", &PrecompiledSupervariantSourceData::m_rootShaderVariantAssets)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
void PrecompiledShaderAssetSourceData::Reflect(ReflectContext* context)
|
||||
{
|
||||
RootShaderVariantAssetSourceData::Reflect(context);
|
||||
PrecompiledSupervariantSourceData::Reflect(context);
|
||||
|
||||
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
|
||||
{
|
||||
serializeContext->Class<PrecompiledShaderAssetSourceData>()
|
||||
->Version(1) // ATOM-15472
|
||||
->Version(2) // ATOM-15740
|
||||
->Field("ShaderAssetFileName", &PrecompiledShaderAssetSourceData::m_shaderAssetFileName)
|
||||
->Field("PlatformIdentifiers", &PrecompiledShaderAssetSourceData::m_platformIdentifiers)
|
||||
->Field("RootShaderVariantAssets", &PrecompiledShaderAssetSourceData::m_rootShaderVariantAssets)
|
||||
->Field("Supervariants", &PrecompiledShaderAssetSourceData::m_supervariants)
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user