1
0
mirror of https://github.com/dege-diosg/dgVoodoo2 synced 2024-07-08 20:51:02 +02:00
dgVoodoo2/dgVoodooAPI/Inc/Addon/ID3D12Root.hpp

289 lines
11 KiB
C++
Raw Permalink Normal View History

// *****************************************************************************
// File: ID3D12Root.hpp
//
// Description: Interface for D3D12 Root
//
// Contact person: DG
//
// *****************************************************************************
#ifndef ID3D12ROOT_HPP
#define ID3D12ROOT_HPP
// --- Includes ----------------------------------------------------------------
#include "..\APITypes.h"
#include "D3D12.h"
//namespace dgVoodoo {
// --- Predeclarations ---------------------------------------------------------
class ID3D12ResourceDescAllocator;
class ID3D12GraphicsCommandListAuto;
class ID3D12ResourceDescRingBuffer;
class ID3D12Buffer;
class ID3D12HeapPageAllocator;
class ID3D12Swapchain;
// --- ID3D12Root --------------------------------------------------------------
class ID3D12Root
{
public:
struct SwapchainData
{
SIZE imageSize;
SIZE imagePresentationSize;
DXGI_FORMAT format;
SIZE maxOverriddenInputTextureSize;
};
struct GraphicsPLDesc
{
ID3D12RootSignature* pRootSignature;
ID3DBlob* pVS;
ID3DBlob* pPS;
ID3DBlob* pDS;
ID3DBlob* pHS;
ID3DBlob* pGS;
D3D12_STREAM_OUTPUT_DESC* pStreamOutput;
D3D12_BLEND_DESC* pBlendState;
UINT SampleMask;
D3D12_RASTERIZER_DESC* pRasterizerState;
D3D12_DEPTH_STENCIL_DESC* pDepthStencilState;
D3D12_INPUT_LAYOUT_DESC* pInputLayout;
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE IBStripCutValue;
D3D12_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType;
UINT NumRenderTargets;
DXGI_FORMAT RTVFormats[8];
DXGI_FORMAT DSVFormat;
DXGI_SAMPLE_DESC SampleDesc;
UINT NodeMask;
D3D12_PIPELINE_STATE_FLAGS Flags;
};
struct ComputePLDesc
{
ID3D12RootSignature* pRootSignature;
ID3DBlob* pCS;
UINT NodeMask;
D3D12_PIPELINE_STATE_FLAGS Flags;
};
struct SwapchainProxyTextureData
{
ID3D12Resource* pTexture;
UINT texState;
D3D12_CPU_DESCRIPTOR_HANDLE srvHandle;
D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle;
DXGI_FORMAT rtvFormat;
};
enum DynamicAllocator
{
DA_RingAllocator = 0,
DA_ConstBufferPageHeapAllocator,
DA_VertexBufferPageHeapAllocator,
DA_IndexBufferPageHeapAllocator,
DA_UploadBufferPageHeapAllocator,
DA_ReadbackBufferPageHeapAllocator
};
public:
// Factoring related methods
virtual ID3D12Device* GetDevice (UInt32 adapterID) = 0;
virtual ID3D12RootSignature* SerializeAndCreateRootSignature (UInt32 adapterID, D3D_ROOT_SIGNATURE_VERSION Version,
const D3D12_ROOT_SIGNATURE_DESC* pRootSignatureDesc,
ID3DBlob** ppErrorBlob) = 0;
virtual ID3DBlob* CreateD3DBlob (UIntPtr dataSize, const void* pInitialData) = 0;
virtual ID3D12ResourceDescAllocator* GetCBV_SRV_UAV_DescAllocator (UInt32 adapterID) = 0;
virtual ID3D12ResourceDescAllocator* GetRTV_DescAllocator (UInt32 adapterID) = 0;
virtual ID3D12ResourceDescAllocator* GetDSV_DescAllocator (UInt32 adapterID) = 0;
virtual ID3D12ResourceDescAllocator* GetSampler_DescAllocator (UInt32 adapterID) = 0;
virtual ID3D12GraphicsCommandListAuto* GetGraphicsCommandListAuto (UInt32 adapterID) = 0;
virtual ID3D12GraphicsCommandListAuto* GetCopyCommandListAuto (UInt32 adapterID) = 0;
virtual ID3D12HeapPageAllocator* GetHeapPageAllocator (UInt32 adapterID, DynamicAllocator allocator) = 0;
virtual ID3D12ResourceDescRingBuffer* GetCBV_SRV_UAV_RingBuffer (UInt32 adapterID) = 0;
virtual ID3D12ResourceDescRingBuffer* CreateResourceDescRingBuffer (UInt32 adapterID, D3D12_DESCRIPTOR_HEAP_TYPE heapType,
UINT numDescriptors, D3D12_DESCRIPTOR_HEAP_FLAGS heapFlags) = 0;
virtual ID3D12Buffer* CreateStaticBuffer (UInt32 adapterID, UInt32 bufferSize, D3D12_HEAP_TYPE heapType, D3D12_HEAP_FLAGS heapFlags) = 0;
virtual ID3D12Buffer* CreateDynamicBuffer (UInt32 adapterID, UInt32 bufferSize, DynamicAllocator allocatorType) = 0;
// Swapchains
virtual SwapchainData GetSwapchainData (ID3D12Swapchain* pSwapchain) = 0;
virtual UInt32 GetMaxNumberOfProxyTextures (UInt32 adapterID) = 0;
virtual bool GetProxyTexture (ID3D12Swapchain* pSwapchain, UInt32 idx, SwapchainProxyTextureData* pOutData) = 0;
// Resource tracking
virtual bool RTEnableTrackingUnkownResources (bool enable) = 0;
virtual bool RTResourceDestroyed (ID3D12Resource* pResource, bool waitForCompletion = true) = 0;
virtual bool RTObjectDestroyed (void* pObject, bool waitForCompletion = true) = 0;
// Pipeline object caches
virtual D3D12_DEPTH_STENCIL_DESC* PLCacheGetDepthStencilDesc (UInt32 adapterID, const D3D12_DEPTH_STENCIL_DESC& desc) = 0;
virtual D3D12_BLEND_DESC* PLCacheGetBlend4Desc (UInt32 adapterID, const D3D12_BLEND_DESC& desc) = 0; // only the first 4 RT's are taken into account... sorry about that
virtual D3D12_RASTERIZER_DESC* PLCacheGetRasterizerDesc (UInt32 adapterID, const D3D12_RASTERIZER_DESC& desc) = 0;
virtual D3D12_INPUT_LAYOUT_DESC* PLCacheGetInputLayoutDesc (UInt32 adapterID, UInt32 numOfElements, const D3D12_INPUT_ELEMENT_DESC* pElements) = 0;
virtual ID3D12PipelineState* PLCacheGetGraphicsPipeline (UInt32 adapterID, const GraphicsPLDesc& desc) = 0;
virtual ID3D12PipelineState* PLCacheGetComputePipeline (UInt32 adapterID, const ComputePLDesc& desc) = 0;
// Graphics pipeline state notification methods
virtual void GPLRootSignatureReleased (UInt32 adapterID, ID3D12RootSignature* pRootSignature) = 0;
virtual void GPLShaderReleased (UInt32 adapterID, ID3DBlob* pShader) = 0;
virtual void GPLStreamOutputReleased (UInt32 adapterID, D3D12_STREAM_OUTPUT_DESC* pStreamOutput) = 0;
virtual void GPLBlendStateReleased (UInt32 adapterID, D3D12_BLEND_DESC* pBlendState) = 0;
virtual void GPLRasterizerStateReleased (UInt32 adapterID, D3D12_RASTERIZER_DESC* pRasterizerState) = 0;
virtual void GPLDepthStencilStateReleased (UInt32 adapterID, D3D12_DEPTH_STENCIL_DESC* pDepthStencilState) = 0;
virtual void GPLInputLayoutReleased (UInt32 adapterID, D3D12_INPUT_LAYOUT_DESC* pInputLayout) = 0;
// Compute pipeline state notification methods
virtual void CPLRootSignatureReleased (UInt32 adapterID, ID3D12RootSignature* pRootSignature) = 0;
virtual void CPLShaderReleased (UInt32 adapterID, ID3DBlob* pShader) = 0;
};
// --- ID3D12ResourceDescAllocator ---------------------------------------------
class ID3D12ResourceDescAllocator
{
public:
virtual UInt32 AllocDescriptorGroup (UInt32 numOfContinuousDescriptors) = 0;
virtual void DeallocDescriptorGroup (UInt32 handle, UInt32 numOfContinuousDescriptors,
ID3D12Fence* pFence = NULL, UINT64 fenceValue = 0) = 0;
virtual UInt32 GetSubGroupHandle (UInt32 handle, UInt32 descIndex) = 0;
virtual D3D12_GPU_DESCRIPTOR_HANDLE GetGPUDescHandle (UInt32 handle, UInt32 descIndex = 0) = 0;
virtual D3D12_CPU_DESCRIPTOR_HANDLE GetCPUDescHandle (UInt32 handle, UInt32 descIndex = 0) = 0;
virtual ID3D12DescriptorHeap* GetDescriptorHeap (UInt32 handle) = 0;
};
// --- ID3D12ResourceDescRingBuffer --------------------------------------------
class ID3D12ResourceDescRingBuffer
{
public:
struct AllocData
{
D3D12_GPU_DESCRIPTOR_HANDLE gpuDescHandle;
D3D12_CPU_DESCRIPTOR_HANDLE cpuDescHandle;
ID3D12DescriptorHeap* pHeap;
UInt32 incrementSize;
};
virtual bool Alloc (UInt32 numOfDescriptors, ID3D12Fence* pFence, UINT64 fenceValue, AllocData& allocData) = 0;
virtual void Release () = 0;
};
// --- ID3D12Buffer ------------------------------------------------------------
class ID3D12Buffer
{
public:
enum LockType
{
LT_Default = 0, // Wait for GPU (static buffer)
LT_NoOverwrite, // Nooverwrite - No wait for GPU (dynamic buffer)
LT_Discard // Discard - No wait for GPU (dynamic buffer)
};
struct LockData
{
UInt64 gpuAddress;
void* ptr;
ID3D12Resource* pBuffer;
};
virtual bool HasAddressChanged () const = 0;
virtual void ClearAddressChangedFlag () = 0;
virtual bool GetAndClearAddressChangedBit (UInt32 idx) = 0;
virtual LockData Lock (LockType lockType, ID3D12Fence* pFence = NULL, UInt64 fenceValue = 0) = 0;
virtual void Unlock () = 0;
virtual void Release () = 0;
};
// --- ID3D12GraphicsCommandListAuto -------------------------------------------
class ID3D12GraphicsCommandListAuto
{
public:
virtual ID3D12GraphicsCommandList* GetCommandListInterface () = 0;
virtual bool IsCurrentId (void* id) = 0;
virtual bool ChangeId (void* newId) = 0;
virtual UINT64 GetFenceValue () const = 0;
virtual bool AFlush (bool waitForCompletion = false) = 0;
virtual void AFlushLock () = 0;
virtual void AFlushUnlock (bool forceFlush = false) = 0;
virtual UINT64 AGetLastFlushFenceValue () const = 0;
virtual ID3D12Fence* AGetFence () const = 0;
virtual bool HIUpdateSubBuffer (ID3D12Resource* pMADBuffer, ID3D12HeapPageAllocator* pAllocator,
2023-07-21 21:30:21 +02:00
UInt32 begin, UInt32 end, const void* pSrcData,
bool setToUnmappedState = false, bool forceAsync = false) = 0;
virtual bool HIUpdateSubTexture (ID3D12Resource* pMADTexture, UInt32 dstSubResIdx,
ID3D12HeapPageAllocator* pAllocator, const D3D12_BOX& dstBox,
2023-07-21 21:30:21 +02:00
const void* pSrcData, UInt32 srcPitch, UInt32 srcDepth,
bool forceAsync = false) = 0;
};
// --- Helpers -----------------------------------------------------------------
struct D3D12RSPARAMETER: public D3D12_ROOT_PARAMETER
{
D3D12RSPARAMETER (D3D12_ROOT_PARAMETER_TYPE _ParameterType, UINT NumDescriptorRanges, const D3D12_DESCRIPTOR_RANGE* pDescriptorRanges,
D3D12_SHADER_VISIBILITY _ShaderVisibility)
{
ParameterType = _ParameterType;
DescriptorTable.NumDescriptorRanges = NumDescriptorRanges;
DescriptorTable.pDescriptorRanges = pDescriptorRanges;
ShaderVisibility = _ShaderVisibility;
}
D3D12RSPARAMETER (D3D12_ROOT_PARAMETER_TYPE _ParameterType, UINT ShaderRegister, UINT RegisterSpace, UINT Num32BitValues,
D3D12_SHADER_VISIBILITY _ShaderVisibility)
{
ParameterType = _ParameterType;
Constants.ShaderRegister = ShaderRegister;
Constants.RegisterSpace = RegisterSpace;
Constants.Num32BitValues = Num32BitValues;
ShaderVisibility = _ShaderVisibility;
}
D3D12RSPARAMETER (D3D12_ROOT_PARAMETER_TYPE _ParameterType, UINT ShaderRegister, UINT RegisterSpace,
D3D12_SHADER_VISIBILITY _ShaderVisibility)
{
ParameterType = _ParameterType;
Descriptor.ShaderRegister = ShaderRegister;
Descriptor.RegisterSpace = RegisterSpace;
ShaderVisibility = _ShaderVisibility;
}
};
//} // namespace dgVoodoo
#endif // !ID3D12ROOT_HPP