Changed the Shader instanceId to the combined assetId and supervariant index

Signed-off-by: dmcdiarmid-ly <63674186+dmcdiarmid-ly@users.noreply.github.com>
This commit is contained in:
dmcdiarmid-ly
2022-01-13 19:57:22 -07:00
parent f026e543cc
commit 5c603882b3
2 changed files with 24 additions and 25 deletions
@@ -136,11 +136,6 @@ namespace AZ
//! This tag corresponds to the ShaderAsset object's DrawListName.
RHI::DrawListTag GetDrawListTag() const;
//! Changes the supervariant of the shader to the specified supervariantIndex.
//! [GFX TODO][ATOM-15813]: this can be removed when the shader InstanceDatabase can support multiple shader
//! instances with different supervariants.
void ChangeSupervariant(SupervariantIndex supervariantIndex);
private:
explicit Shader(const SupervariantIndex& supervariantIndex) : m_supervariantIndex(supervariantIndex){};
Shader() = delete;
@@ -25,21 +25,34 @@ namespace AZ
Data::Instance<Shader> Shader::FindOrCreate(const Data::Asset<ShaderAsset>& shaderAsset, const Name& supervariantName)
{
auto anySupervariantName = AZStd::any(supervariantName);
Data::Instance<Shader> shaderInstance = Data::InstanceDatabase<Shader>::Instance().FindOrCreate(
Data::InstanceId::CreateFromAssetId(shaderAsset.GetId()), shaderAsset, &anySupervariantName);
if (shaderInstance)
// retrieve the supervariant index from the shader asset
SupervariantIndex supervariantIndex = shaderAsset->GetSupervariantIndex(supervariantName);
if (!supervariantIndex.IsValid())
{
// [GFX TODO][ATOM-15813] Change InstanceDatabase<Shader> to support multiple instances with different supervariants.
// At this time we do not support multiple supervariants loaded for a shader asset simultaneously, so if this shader
// is referring to the wrong supervariant we need to change it to the correct one.
SupervariantIndex supervariantIndex = shaderAsset->GetSupervariantIndex(supervariantName);
if (supervariantIndex.IsValid() && shaderInstance->GetSupervariantIndex() != supervariantIndex)
{
shaderInstance->ChangeSupervariant(supervariantIndex);
}
AZ_Error("Shader", false, "Supervariant with name %s, was not found in shader %s", supervariantName.GetCStr(), shaderAsset->GetName().GetCStr());
return nullptr;
}
// create the InstanceId from the combined assetId and supervariantIndex
const Data::AssetId& assetId = shaderAsset.GetId();
uint32_t shaderSupervariantIndex = supervariantIndex.GetIndex();
const uint32_t instanceIdDataSize = sizeof(assetId.m_guid) + sizeof(assetId.m_subId) + sizeof(shaderSupervariantIndex);
uint8_t instanceIdData[instanceIdDataSize];
uint8_t* instanceIdDataPtr = instanceIdData;
memcpy(instanceIdDataPtr, &assetId.m_guid, sizeof(assetId.m_guid));
instanceIdDataPtr += sizeof(assetId.m_guid);
memcpy(instanceIdDataPtr, &assetId.m_subId, sizeof(assetId.m_subId));
instanceIdDataPtr += sizeof(assetId.m_subId);
memcpy(instanceIdDataPtr, &shaderSupervariantIndex, sizeof(shaderSupervariantIndex));
Data::InstanceId instanceId = Data::InstanceId::CreateData(instanceIdData, instanceIdDataSize);
// retrieve the shader instance from the Instance database
Data::Instance<Shader> shaderInstance = Data::InstanceDatabase<Shader>::Instance().FindOrCreate(instanceId, shaderAsset, &anySupervariantName);
return shaderInstance;
}
@@ -478,14 +491,5 @@ namespace AZ
return m_drawListTag;
}
void Shader::ChangeSupervariant(SupervariantIndex supervariantIndex)
{
if (supervariantIndex != m_supervariantIndex)
{
m_supervariantIndex = supervariantIndex;
Init(*m_asset);
}
}
} // namespace RPI
} // namespace AZ