Files
UnrealEngine/Engine/Source/Runtime/RHI/Public/RHIResourceReplace.h
2025-05-18 13:04:45 +08:00

77 lines
1.6 KiB
C++

// 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 <typename TType>
struct TPair
{
TType* Dst;
TType* Src;
TPair(TType* Dst, TType* Src)
: Dst(Dst)
, Src(Src)
{}
};
typedef TPair<FRHIBuffer > FBuffer;
typedef TPair<FRHIRayTracingGeometry> FRTGeometry;
typedef TVariant<FBuffer, FRTGeometry> TStorage;
enum class EType : uint8
{
Buffer = TStorage::IndexOfType<FBuffer >(),
RTGeometry = TStorage::IndexOfType<FRTGeometry>(),
};
EType GetType() const { return EType(Storage.GetIndex()); }
FBuffer const& GetBuffer () const { return Storage.Get<FBuffer >(); }
FRTGeometry const& GetRTGeometry() const { return Storage.Get<FRTGeometry>(); }
FRHIResourceReplaceInfo(FRHIBuffer* Dst, FRHIBuffer* Src)
: Storage(TInPlaceType<FBuffer>(), Dst, Src)
{}
FRHIResourceReplaceInfo(FRHIRayTracingGeometry* Dst, FRHIRayTracingGeometry* Src)
: Storage(TInPlaceType<FRTGeometry>(), Dst, Src)
{}
private:
TStorage Storage;
};
class FRHIResourceReplaceBatcher
{
FRHICommandListBase& RHICmdList;
TArray<FRHIResourceReplaceInfo> Infos;
public:
FRHIResourceReplaceBatcher(FRHICommandListBase& RHICmdList, uint32 InitialCapacity = 0)
: RHICmdList(RHICmdList)
{
if (InitialCapacity > 0)
{
Infos.Reserve(InitialCapacity);
}
}
inline ~FRHIResourceReplaceBatcher();
template <typename... TArgs>
void EnqueueReplace(TArgs&&... Args)
{
Infos.Emplace(Forward<TArgs>(Args)...);
}
};