// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "RHIFwd.h" #include "RHIResources.h" #include "Containers/Array.h" #include "Misc/TVariant.h" class FRHIResourceReplaceInfo { public: template struct TPair { TType* Dst; TType* Src; TPair(TType* Dst, TType* Src) : Dst(Dst) , Src(Src) {} }; typedef TPair FBuffer; typedef TPair FRTGeometry; typedef TVariant TStorage; enum class EType : uint8 { Buffer = TStorage::IndexOfType(), RTGeometry = TStorage::IndexOfType(), }; EType GetType() const { return EType(Storage.GetIndex()); } FBuffer const& GetBuffer () const { return Storage.Get(); } FRTGeometry const& GetRTGeometry() const { return Storage.Get(); } FRHIResourceReplaceInfo(FRHIBuffer* Dst, FRHIBuffer* Src) : Storage(TInPlaceType(), Dst, Src) {} FRHIResourceReplaceInfo(FRHIRayTracingGeometry* Dst, FRHIRayTracingGeometry* Src) : Storage(TInPlaceType(), Dst, Src) {} private: TStorage Storage; }; class FRHIResourceReplaceBatcher { FRHICommandListBase& RHICmdList; TArray Infos; public: FRHIResourceReplaceBatcher(FRHICommandListBase& RHICmdList, uint32 InitialCapacity = 0) : RHICmdList(RHICmdList) { if (InitialCapacity > 0) { Infos.Reserve(InitialCapacity); } } inline ~FRHIResourceReplaceBatcher(); template void EnqueueReplace(TArgs&&... Args) { Infos.Emplace(Forward(Args)...); } };