diff --git a/Gems/Atom/Feature/Common/Code/Source/Decals/AsyncLoadTracker.h b/Gems/Atom/Feature/Common/Code/Source/Decals/AsyncLoadTracker.h index ec35c4b51f..a3fff7b91e 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Decals/AsyncLoadTracker.h +++ b/Gems/Atom/Feature/Common/Code/Source/Decals/AsyncLoadTracker.h @@ -23,7 +23,9 @@ namespace AZ { public: - void TrackAssetLoad(const FeatureProcessorHandle handle, const AZ::Data::AssetId asset) + using MaterialAssetPtr = AZ::Data::Asset; + + void TrackAssetLoad(const FeatureProcessorHandle handle, const MaterialAssetPtr asset) { if (IsAssetLoading(handle)) { @@ -77,12 +79,12 @@ namespace AZ { const auto asset = EraseFromInFlightHandles(handle); - AZ_Assert(m_inFlightHandlesByAsset.count(asset) > 0, "AsyncLoadTracker in a bad state"); - auto& handleList = m_inFlightHandlesByAsset[asset]; + AZ_Assert(m_inFlightHandlesByAsset.count(asset.GetId()) > 0, "AsyncLoadTracker in a bad state"); + auto& handleList = m_inFlightHandlesByAsset[asset.GetId()]; EraseFromVector(handleList, handle); if (handleList.empty()) { - m_inFlightHandlesByAsset.erase(asset); + m_inFlightHandlesByAsset.erase(asset.GetId()); } } @@ -104,14 +106,14 @@ namespace AZ vec.pop_back(); } - void Add(const FeatureProcessorHandle handle, const AZ::Data::AssetId asset) + void Add(const FeatureProcessorHandle handle, const MaterialAssetPtr asset) { AZ_Assert(m_inFlightHandles.count(handle) == 0, "AsyncLoadTracker::Add() - told to add a handle that was already being tracked."); - m_inFlightHandlesByAsset[asset].push_back(handle); + m_inFlightHandlesByAsset[asset.GetId()].push_back(handle); m_inFlightHandles[handle] = asset; } - AZ::Data::AssetId EraseFromInFlightHandles(const FeatureProcessorHandle handle) + MaterialAssetPtr EraseFromInFlightHandles(const FeatureProcessorHandle handle) { const auto iter = m_inFlightHandles.find(handle); AZ_Assert(iter != m_inFlightHandles.end(), "Told to remove handle that was not present"); @@ -125,7 +127,7 @@ namespace AZ // Hash table that tracks the reverse of the m_inFlightHandlesByAsset hash table. // i.e. for each object, it stores what asset that it needs. - AZStd::unordered_map m_inFlightHandles; + AZStd::unordered_map m_inFlightHandles; }; } } diff --git a/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.cpp index 4000df646d..24857f8d65 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.cpp @@ -85,7 +85,6 @@ namespace AZ m_decalData.Clear(); m_decalBufferHandler.Release(); - m_materialAssets.clear(); } DecalTextureArrayFeatureProcessor::DecalHandle DecalTextureArrayFeatureProcessor::AcquireDecal() @@ -410,7 +409,7 @@ namespace AZ int iter = m_textureArrayList.begin(); while (iter != -1) { - const auto packedTexture = m_textureArrayList[iter].second.GetPackedTexture(); + const auto& packedTexture = m_textureArrayList[iter].second.GetPackedTexture(); view->GetShaderResourceGroup()->SetImage(m_decalTextureArrayIndices[iter], packedTexture); iter = m_textureArrayList.next(iter); } @@ -482,22 +481,15 @@ namespace AZ return material; } - void DecalTextureArrayFeatureProcessor::QueueMaterialLoadForDecal(const AZ::Data::AssetId material, const DecalHandle handle) + void DecalTextureArrayFeatureProcessor::QueueMaterialLoadForDecal(const AZ::Data::AssetId materialId, const DecalHandle handle) { - // Note that another decal might have already queued this material for loading - if (m_materialLoadTracker.IsAssetLoading(material)) - { - m_materialLoadTracker.TrackAssetLoad(handle, material); - return; - } + const auto materialAsset = QueueMaterialAssetLoad(materialId); - const auto materialAsset = QueueMaterialAssetLoad(material); - m_materialAssets.emplace(material, materialAsset); - m_materialLoadTracker.TrackAssetLoad(handle, material); + m_materialLoadTracker.TrackAssetLoad(handle, materialAsset); if (materialAsset.IsLoading()) { - AZ::Data::AssetBus::MultiHandler::BusConnect(material); + AZ::Data::AssetBus::MultiHandler::BusConnect(materialId); } else if (materialAsset.IsReady()) { diff --git a/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.h index 825e461fc2..5301fcc61b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Decals/DecalTextureArrayFeatureProcessor.h @@ -136,11 +136,8 @@ namespace AZ GpuBufferHandler m_decalBufferHandler; AsyncLoadTracker m_materialLoadTracker; - AZStd::unordered_map< AZ::Data::AssetId, DecalLocationAndUseCount> m_materialToTextureArrayLookupTable; - AZStd::unordered_map> m_materialAssets; - bool m_deviceBufferNeedsUpdate = false; }; } // namespace Render