Files
UnrealEngine/Engine/Source/Runtime/D3D12RHI/Private/D3D12LegacyBarriers.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

186 lines
5.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "D3D12RHIDefinitions.h"
#if D3D12RHI_SUPPORTS_LEGACY_BARRIERS
#include "ID3D12Barriers.h"
struct FD3D12LegacyBarriersTransitionData;
class FD3D12LegacyBarriersBatcher;
//
// Separate the implementation details from the fulfillment of
// the ID3D12BarriersForAdapter interface so that other platforms
// which need to further specialize both the interface and the
// implementation don't run into the diamond inheritance problem
// with the interface or are forced to have multiple v-tables
//
namespace FD3D12LegacyBarriersForAdapterImpl
{
D3D12_RESOURCE_STATES GetInitialState(
ED3D12Access InD3D12Access,
const FD3D12ResourceDesc& InDesc);
void ConfigureDevice(
ID3D12Device* Device,
bool InWithD3DDebug);
uint64 GetTransitionDataSizeBytes();
uint64 GetTransitionDataAlignmentBytes();
void CreateTransition(
FRHITransition* Transition,
const FRHITransitionCreateInfo& CreateInfo);
void ReleaseTransition(
FRHITransition* Transition);
HRESULT CreateCommittedResource(
FD3D12Adapter& Adapter,
const D3D12_HEAP_PROPERTIES& InHeapProps,
D3D12_HEAP_FLAGS InHeapFlags,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource);
HRESULT CreateReservedResource(
FD3D12Adapter& Adapter,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource);
HRESULT CreatePlacedResource(
FD3D12Adapter& Adapter,
ID3D12Heap* Heap,
uint64 InHeapOffset,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource);
} // namespace FD3D12LegacyBarriersForAdapterImpl
class FD3D12LegacyBarriersForAdapter final
: public ID3D12BarriersForAdapter
{
public:
virtual ~FD3D12LegacyBarriersForAdapter();
virtual void ConfigureDevice(
ID3D12Device* Device,
bool InWithD3DDebug) const override final;
virtual uint64 GetTransitionDataSizeBytes() const override final;
virtual uint64 GetTransitionDataAlignmentBytes() const override final;
virtual void CreateTransition(
FRHITransition* Transition,
const FRHITransitionCreateInfo& CreateInfo) const override final;
virtual void ReleaseTransition(
FRHITransition* Transition) const override final;
virtual HRESULT CreateCommittedResource(
FD3D12Adapter& Adapter,
const D3D12_HEAP_PROPERTIES& InHeapProps,
D3D12_HEAP_FLAGS InHeapFlags,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource) const override final;
virtual HRESULT CreateReservedResource(
FD3D12Adapter& Adapter,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource) const override final;
virtual HRESULT CreatePlacedResource(
FD3D12Adapter& Adapter,
ID3D12Heap* Heap,
uint64 InHeapOffset,
const FD3D12ResourceDesc& InDesc,
ED3D12Access InInitialD3D12Access,
const D3D12_CLEAR_VALUE* InClearValue,
TRefCountPtr<ID3D12Resource>& OutResource) const override final;
virtual const TCHAR* GetImplementationName() const override final;
};
class FD3D12LegacyBarriersForContext final
: public ID3D12BarriersForContext
{
public:
FD3D12LegacyBarriersForContext();
virtual ~FD3D12LegacyBarriersForContext();
virtual void BeginTransitions(
FD3D12CommandContext& Context,
TArrayView<const FRHITransition*> Transitions) override final;
virtual void EndTransitions(
FD3D12CommandContext& Context,
TArrayView<const FRHITransition*> Transitions) override final;
virtual void AddGlobalBarrier(
FD3D12ContextCommon& Context,
ED3D12Access D3D12AccessBefore,
ED3D12Access D3D12AccessAfter) override final;
virtual void AddBarrier(
FD3D12ContextCommon& Context,
const FD3D12Resource* pResource,
ED3D12Access D3D12AccessBefore,
ED3D12Access D3D12AccessAfter,
uint32 Subresource) override final;
virtual void FlushIntoCommandList(
class FD3D12CommandList& CommandList,
class FD3D12QueryAllocator& TimestampAllocator) override final;
virtual int32 GetNumPendingBarriers() const override final;
private:
struct FD3D12DiscardResource;
static void HandleReservedResourceCommits(
FD3D12CommandContext& Context,
const FD3D12LegacyBarriersTransitionData* TransitionData);
void HandleResourceDiscardTransitions(
FD3D12CommandContext& Context,
const FD3D12LegacyBarriersTransitionData* TransitionData,
TArray<FD3D12DiscardResource>& ResourcesToDiscard);
void HandleDiscardResources(
FD3D12CommandContext& Context,
TArrayView<const FRHITransition*> Transitions,
bool bIsBeginTransition);
void HandleTransientAliasing(
FD3D12CommandContext& Context,
const FD3D12LegacyBarriersTransitionData* TransitionData);
void HandleResourceTransitions(
FD3D12CommandContext& Context,
const FD3D12LegacyBarriersTransitionData* TransitionData,
bool& bUAVBarrier);
void TransitionResource(
FD3D12ContextCommon& Context,
const FD3D12Resource* InResource,
D3D12_RESOURCE_STATES InBeforeState,
D3D12_RESOURCE_STATES InAfterState,
uint32 InSubresourceIndex);
const TUniquePtr<FD3D12LegacyBarriersBatcher> Batcher;
};
#endif // D3D12RHI_SUPPORTS_LEGACY_BARRIERS