Files
UnrealEngine/Engine/Source/Runtime/D3D12RHI/Private/D3D12TransientResourceAllocator.h
2025-05-18 13:04:45 +08:00

84 lines
2.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "D3D12Resources.h"
#include "RHICoreTransientResourceAllocator.h"
extern D3D12_RESOURCE_STATES GetInitialResourceState(const D3D12_RESOURCE_DESC& InDesc, ED3D12QueueType QueueType);
class FD3D12TransientHeap final
: public FRHITransientHeap
, public FRefCountBase
, public FD3D12LinkedAdapterObject<FD3D12TransientHeap>
{
public:
FD3D12TransientHeap(const FInitializer& Initializer, FD3D12Adapter* Adapter, FD3D12Device* Device, FRHIGPUMask VisibleNodeMask);
~FD3D12TransientHeap();
FD3D12Heap* Get() { return Heap; }
private:
TRefCountPtr<FD3D12Heap> Heap;
};
class FD3D12TransientHeapCache final
: public FRHITransientHeapCache
, public FD3D12AdapterChild
{
public:
static TUniquePtr<FD3D12TransientHeapCache> Create(FD3D12Adapter* ParentAdapter);
//! FRHITransientResourceSystem Overrides
FRHITransientHeap* CreateHeap(const FRHITransientHeap::FInitializer& Initializer) override;
private:
FD3D12TransientHeapCache(const FInitializer& Initializer, FD3D12Adapter* ParentAdapter);
};
class FD3D12TransientResourceHeapAllocator final
: public FRHITransientResourceHeapAllocator
, public FD3D12AdapterChild
{
public:
FD3D12TransientResourceHeapAllocator(FD3D12TransientHeapCache& InHeapCache);
//! IRHITransientResourceAllocator Overrides
bool SupportsResourceType(ERHITransientResourceType InType) const override
{
switch (InType)
{
case ERHITransientResourceType::Buffer: return true;
case ERHITransientResourceType::Texture: return true;
default: checkNoEntry(); return false;
}
}
FRHITransientTexture* CreateTexture(const FRHITextureCreateInfo& CreateInfo, const TCHAR* Name, const FRHITransientAllocationFences& Fences) override;
FRHITransientBuffer* CreateBuffer(const FRHIBufferCreateInfo& CreateInfo, const TCHAR* Name, const FRHITransientAllocationFences& Fences) override;
private:
// This adapter mocks the D3D12 resource allocator interface and performs placed resource creation.
class FResourceAllocatorAdapter final : public FD3D12AdapterChild, public ID3D12ResourceAllocator
{
public:
FResourceAllocatorAdapter(FD3D12Adapter* Adapter, FD3D12TransientHeap& InHeap, const FRHITransientHeapAllocation& InAllocation, const D3D12_RESOURCE_DESC& InDesc)
: FD3D12AdapterChild(Adapter)
, Heap(InHeap)
, Allocation(InAllocation)
, Desc(InDesc)
{}
void AllocateResource(
uint32 GPUIndex, D3D12_HEAP_TYPE InHeapType, const FD3D12ResourceDesc& InDesc, uint64 InSize, uint32 InAllocationAlignment, ED3D12ResourceStateMode InResourceStateMode,
D3D12_RESOURCE_STATES InCreateState, const D3D12_CLEAR_VALUE* InClearValue, const TCHAR* InName, FD3D12ResourceLocation& ResourceLocation) override;
FD3D12TransientHeap& Heap;
const FRHITransientHeapAllocation& Allocation;
const D3D12_RESOURCE_DESC Desc;
uint64 GpuVirtualAddress = 0;
};
FD3D12Device* AllocationInfoQueryDevice;
};