summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-03-04 08:16:25 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:14 +0000
commit5d11bc3700658755a37eb0add40deb4f167c2084 (patch)
tree07f506d19191f59f4b590f28f48814118f8dd531 /Graphics/GraphicsEngineD3D12
parentGL backend: some cosmetic code changes (diff)
downloadDiligentCore-5d11bc3700658755a37eb0add40deb4f167c2084.tar.gz
DiligentCore-5d11bc3700658755a37eb0add40deb4f167c2084.zip
Unified device object creation in D3D12, Vulkan and OpenGL
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp49
-rw-r--r--Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp182
2 files changed, 64 insertions, 167 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
index 37ce8965..5224d50c 100644
--- a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
@@ -66,11 +66,53 @@
namespace Diligent
{
+class RenderDeviceD3D12Impl;
+class PipelineStateD3D12Impl;
+class ShaderResourceBindingD3D12Impl;
+class BufferD3D12Impl;
+class BufferViewD3D12Impl;
+class TextureD3D12Impl;
+class TextureViewD3D12Impl;
+class ShaderD3D12Impl;
+class SamplerD3D12Impl;
+class FenceD3D12Impl;
+class QueryD3D12Impl;
+class RenderPassD3D12Impl;
+class FramebufferD3D12Impl;
+class BottomLevelASD3D12Impl;
+class TopLevelASD3D12Impl;
+class ShaderBindingTableD3D12Impl;
+class PipelineResourceSignatureD3D12Impl;
+
+struct RenderDeviceD3D12ImplTraits
+{
+ using BaseInterface = IRenderDeviceD3D12;
+
+ using RenderDeviceImplType = RenderDeviceD3D12Impl;
+ using PipelineStateImplType = PipelineStateD3D12Impl;
+ using ShaderResourceBindingImplType = ShaderResourceBindingD3D12Impl;
+ using BufferImplType = BufferD3D12Impl;
+ using BufferViewImplType = BufferViewD3D12Impl;
+ using TextureImplType = TextureD3D12Impl;
+ using TextureViewImplType = TextureViewD3D12Impl;
+ using ShaderImplType = ShaderD3D12Impl;
+ using SamplerImplType = SamplerD3D12Impl;
+ using FenceImplType = FenceD3D12Impl;
+ using QueryImplType = QueryD3D12Impl;
+ using RenderPassImplType = RenderPassD3D12Impl;
+ using FramebufferImplType = FramebufferD3D12Impl;
+ using BottomLevelASImplType = BottomLevelASD3D12Impl;
+ using TopLevelASImplType = TopLevelASD3D12Impl;
+ using ShaderBindingTableImplType = ShaderBindingTableD3D12Impl;
+ using PipelineResourceSignatureImplType = PipelineResourceSignatureD3D12Impl;
+};
+
/// Render device implementation in Direct3D12 backend.
-class RenderDeviceD3D12Impl final : public RenderDeviceNextGenBase<RenderDeviceD3DBase<IRenderDeviceD3D12>, ICommandQueueD3D12>
+class RenderDeviceD3D12Impl final : public RenderDeviceNextGenBase<RenderDeviceD3DBase<RenderDeviceD3D12ImplTraits>, ICommandQueueD3D12>
{
public:
- using TRenderDeviceBase = RenderDeviceNextGenBase<RenderDeviceD3DBase<IRenderDeviceD3D12>, ICommandQueueD3D12>;
+ using BaseInterface = IRenderDeviceD3D12;
+ using TRenderDeviceBase = RenderDeviceNextGenBase<RenderDeviceD3DBase<RenderDeviceD3D12ImplTraits>, ICommandQueueD3D12>;
RenderDeviceD3D12Impl(IReferenceCounters* pRefCounters,
IMemoryAllocator& RawMemAllocator,
@@ -254,9 +296,6 @@ public:
}
private:
- template <typename PSOCreateInfoType>
- void CreatePipelineState(const PSOCreateInfoType& PSOCreateInfo, IPipelineState** ppPipelineState);
-
virtual void TestTextureFormat(TEXTURE_FORMAT TexFormat) override final;
void FreeCommandContext(PooledCommandContext&& Ctx);
diff --git a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
index f90447f5..0de19a77 100644
--- a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
@@ -107,26 +107,7 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
pEngineFactory,
CommandQueueCount,
ppCmdQueues,
- EngineCI.NumDeferredContexts,
- DeviceObjectSizes
- {
- sizeof(TextureD3D12Impl),
- sizeof(TextureViewD3D12Impl),
- sizeof(BufferD3D12Impl),
- sizeof(BufferViewD3D12Impl),
- sizeof(ShaderD3D12Impl),
- sizeof(SamplerD3D12Impl),
- sizeof(PipelineStateD3D12Impl),
- sizeof(ShaderResourceBindingD3D12Impl),
- sizeof(FenceD3D12Impl),
- sizeof(QueryD3D12Impl),
- sizeof(RenderPassD3D12Impl),
- sizeof(FramebufferD3D12Impl),
- sizeof(BottomLevelASD3D12Impl),
- sizeof(TopLevelASD3D12Impl),
- sizeof(ShaderBindingTableD3D12Impl),
- sizeof(PipelineResourceSignatureD3D12Impl)
- }
+ EngineCI.NumDeferredContexts
},
m_pd3d12Device {pd3d12Device},
m_EngineAttribs {EngineCI },
@@ -152,8 +133,6 @@ RenderDeviceD3D12Impl::RenderDeviceD3D12Impl(IReferenceCounters* pRefCo
m_RootSignatureCache {*this}
// clang-format on
{
- static_assert(sizeof(DeviceObjectSizes) == sizeof(size_t) * 16, "Please add new objects to DeviceObjectSizes constructor");
-
// set device properties
{
static_assert(sizeof(DeviceProperties) == sizeof(Uint32) * 1, "Please set new properties below");
@@ -591,84 +570,42 @@ void RenderDeviceD3D12Impl::TestTextureFormat(TEXTURE_FORMAT TexFormat)
}
}
-template <typename PSOCreateInfoType>
-void RenderDeviceD3D12Impl::CreatePipelineState(const PSOCreateInfoType& PSOCreateInfo, IPipelineState** ppPipelineState)
-{
- CreateDeviceObject("Pipeline State", PSOCreateInfo.PSODesc, ppPipelineState,
- [&]() //
- {
- PipelineStateD3D12Impl* pPipelineStateD3D12{NEW_RC_OBJ(m_PSOAllocator, "PipelineStateD3D12Impl instance", PipelineStateD3D12Impl)(this, PSOCreateInfo)};
- pPipelineStateD3D12->QueryInterface(IID_PipelineState, reinterpret_cast<IObject**>(ppPipelineState));
- OnCreateDeviceObject(pPipelineStateD3D12);
- });
-}
-
-
void RenderDeviceD3D12Impl::CreateGraphicsPipelineState(const GraphicsPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState)
{
- CreatePipelineState(PSOCreateInfo, ppPipelineState);
+ CreatePipelineStateImpl(ppPipelineState, PSOCreateInfo);
}
void RenderDeviceD3D12Impl::CreateComputePipelineState(const ComputePipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState)
{
- CreatePipelineState(PSOCreateInfo, ppPipelineState);
+ CreatePipelineStateImpl(ppPipelineState, PSOCreateInfo);
}
void RenderDeviceD3D12Impl::CreateRayTracingPipelineState(const RayTracingPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState)
{
- CreatePipelineState(PSOCreateInfo, ppPipelineState);
+ CreatePipelineStateImpl(ppPipelineState, PSOCreateInfo);
}
void RenderDeviceD3D12Impl::CreateBufferFromD3DResource(ID3D12Resource* pd3d12Buffer, const BufferDesc& BuffDesc, RESOURCE_STATE InitialState, IBuffer** ppBuffer)
{
- CreateDeviceObject("buffer", BuffDesc, ppBuffer,
- [&]() //
- {
- BufferD3D12Impl* pBufferD3D12{NEW_RC_OBJ(m_BufObjAllocator, "BufferD3D12Impl instance", BufferD3D12Impl)(m_BuffViewObjAllocator, this, BuffDesc, InitialState, pd3d12Buffer)};
- pBufferD3D12->QueryInterface(IID_Buffer, reinterpret_cast<IObject**>(ppBuffer));
- pBufferD3D12->CreateDefaultViews();
- OnCreateDeviceObject(pBufferD3D12);
- });
+ CreateBufferImpl(ppBuffer, BuffDesc, InitialState, pd3d12Buffer);
}
void RenderDeviceD3D12Impl::CreateBuffer(const BufferDesc& BuffDesc, const BufferData* pBuffData, IBuffer** ppBuffer)
{
- CreateDeviceObject("buffer", BuffDesc, ppBuffer,
- [&]() //
- {
- BufferD3D12Impl* pBufferD3D12{NEW_RC_OBJ(m_BufObjAllocator, "BufferD3D12Impl instance", BufferD3D12Impl)(m_BuffViewObjAllocator, this, BuffDesc, pBuffData)};
- pBufferD3D12->QueryInterface(IID_Buffer, reinterpret_cast<IObject**>(ppBuffer));
- pBufferD3D12->CreateDefaultViews();
- OnCreateDeviceObject(pBufferD3D12);
- });
+ CreateBufferImpl(ppBuffer, BuffDesc, pBuffData);
}
void RenderDeviceD3D12Impl::CreateShader(const ShaderCreateInfo& ShaderCI, IShader** ppShader)
{
- CreateDeviceObject("shader", ShaderCI.Desc, ppShader,
- [&]() //
- {
- ShaderD3D12Impl* pShaderD3D12{NEW_RC_OBJ(m_ShaderObjAllocator, "ShaderD3D12Impl instance", ShaderD3D12Impl)(this, ShaderCI)};
- pShaderD3D12->QueryInterface(IID_Shader, reinterpret_cast<IObject**>(ppShader));
-
- OnCreateDeviceObject(pShaderD3D12);
- });
+ CreateShaderImpl(ppShader, ShaderCI);
}
void RenderDeviceD3D12Impl::CreateTextureFromD3DResource(ID3D12Resource* pd3d12Texture, RESOURCE_STATE InitialState, ITexture** ppTexture)
{
TextureDesc TexDesc;
TexDesc.Name = "Texture from d3d12 resource";
- CreateDeviceObject("texture", TexDesc, ppTexture,
- [&]() //
- {
- TextureD3D12Impl* pTextureD3D12{NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, InitialState, pd3d12Texture)};
-
- pTextureD3D12->QueryInterface(IID_Texture, reinterpret_cast<IObject**>(ppTexture));
- pTextureD3D12->CreateDefaultViews();
- OnCreateDeviceObject(pTextureD3D12);
- });
+ CreateTextureImpl(ppTexture, TexDesc, InitialState, pd3d12Texture);
}
void RenderDeviceD3D12Impl::CreateTexture(const TextureDesc& TexDesc, ID3D12Resource* pd3d12Texture, RESOURCE_STATE InitialState, TextureD3D12Impl** ppTexture)
@@ -683,75 +620,32 @@ void RenderDeviceD3D12Impl::CreateTexture(const TextureDesc& TexDesc, ID3D12Reso
void RenderDeviceD3D12Impl::CreateTexture(const TextureDesc& TexDesc, const TextureData* pData, ITexture** ppTexture)
{
- CreateDeviceObject("texture", TexDesc, ppTexture,
- [&]() //
- {
- TextureD3D12Impl* pTextureD3D12{NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, pData)};
-
- pTextureD3D12->QueryInterface(IID_Texture, reinterpret_cast<IObject**>(ppTexture));
- pTextureD3D12->CreateDefaultViews();
- OnCreateDeviceObject(pTextureD3D12);
- });
+ CreateTextureImpl(ppTexture, TexDesc, pData);
}
void RenderDeviceD3D12Impl::CreateSampler(const SamplerDesc& SamplerDesc, ISampler** ppSampler)
{
- CreateDeviceObject("sampler", SamplerDesc, ppSampler,
- [&]() //
- {
- m_SamplersRegistry.Find(SamplerDesc, reinterpret_cast<IDeviceObject**>(ppSampler));
- if (*ppSampler == nullptr)
- {
- SamplerD3D12Impl* pSamplerD3D12{NEW_RC_OBJ(m_SamplerObjAllocator, "SamplerD3D12Impl instance", SamplerD3D12Impl)(this, SamplerDesc)};
- pSamplerD3D12->QueryInterface(IID_Sampler, reinterpret_cast<IObject**>(ppSampler));
- OnCreateDeviceObject(pSamplerD3D12);
- m_SamplersRegistry.Add(SamplerDesc, *ppSampler);
- }
- });
+ CreateSamplerImpl(ppSampler, SamplerDesc);
}
void RenderDeviceD3D12Impl::CreateFence(const FenceDesc& Desc, IFence** ppFence)
{
- CreateDeviceObject("Fence", Desc, ppFence,
- [&]() //
- {
- FenceD3D12Impl* pFenceD3D12{NEW_RC_OBJ(m_FenceAllocator, "FenceD3D12Impl instance", FenceD3D12Impl)(this, Desc)};
- pFenceD3D12->QueryInterface(IID_Fence, reinterpret_cast<IObject**>(ppFence));
- OnCreateDeviceObject(pFenceD3D12);
- });
+ CreateFenceImpl(ppFence, Desc);
}
void RenderDeviceD3D12Impl::CreateQuery(const QueryDesc& Desc, IQuery** ppQuery)
{
- CreateDeviceObject("Query", Desc, ppQuery,
- [&]() //
- {
- QueryD3D12Impl* pQueryD3D12{NEW_RC_OBJ(m_QueryAllocator, "QueryD3D12Impl instance", QueryD3D12Impl)(this, Desc)};
- pQueryD3D12->QueryInterface(IID_Query, reinterpret_cast<IObject**>(ppQuery));
- OnCreateDeviceObject(pQueryD3D12);
- });
+ CreateQueryImpl(ppQuery, Desc);
}
void RenderDeviceD3D12Impl::CreateRenderPass(const RenderPassDesc& Desc, IRenderPass** ppRenderPass)
{
- CreateDeviceObject("RenderPass", Desc, ppRenderPass,
- [&]() //
- {
- RenderPassD3D12Impl* pRenderPassD3D12{NEW_RC_OBJ(m_RenderPassAllocator, "RenderPassD3D12Impl instance", RenderPassD3D12Impl)(this, Desc)};
- pRenderPassD3D12->QueryInterface(IID_RenderPass, reinterpret_cast<IObject**>(ppRenderPass));
- OnCreateDeviceObject(pRenderPassD3D12);
- });
+ CreateRenderPassImpl(ppRenderPass, Desc);
}
void RenderDeviceD3D12Impl::CreateFramebuffer(const FramebufferDesc& Desc, IFramebuffer** ppFramebuffer)
{
- CreateDeviceObject("Framebuffer", Desc, ppFramebuffer,
- [&]() //
- {
- FramebufferD3D12Impl* pFramebufferD3D12{NEW_RC_OBJ(m_FramebufferAllocator, "FramebufferD3D12Impl instance", FramebufferD3D12Impl)(this, Desc)};
- pFramebufferD3D12->QueryInterface(IID_Framebuffer, reinterpret_cast<IObject**>(ppFramebuffer));
- OnCreateDeviceObject(pFramebufferD3D12);
- });
+ CreateFramebufferImpl(ppFramebuffer, Desc);
}
void RenderDeviceD3D12Impl::CreateBLASFromD3DResource(ID3D12Resource* pd3d12BLAS,
@@ -759,25 +653,13 @@ void RenderDeviceD3D12Impl::CreateBLASFromD3DResource(ID3D12Resource* p
RESOURCE_STATE InitialState,
IBottomLevelAS** ppBLAS)
{
- CreateDeviceObject("buffer", Desc, ppBLAS,
- [&]() //
- {
- BottomLevelASD3D12Impl* pBottomLevelASD3D12{NEW_RC_OBJ(m_BLASAllocator, "BottomLevelASD3D12Impl instance", BottomLevelASD3D12Impl)(this, Desc, InitialState, pd3d12BLAS)};
- pBottomLevelASD3D12->QueryInterface(IID_BottomLevelAS, reinterpret_cast<IObject**>(ppBLAS));
- OnCreateDeviceObject(pBottomLevelASD3D12);
- });
+ CreateBLASImpl(ppBLAS, Desc, InitialState, pd3d12BLAS);
}
void RenderDeviceD3D12Impl::CreateBLAS(const BottomLevelASDesc& Desc,
IBottomLevelAS** ppBLAS)
{
- CreateDeviceObject("BottomLevelAS", Desc, ppBLAS,
- [&]() //
- {
- BottomLevelASD3D12Impl* pBottomLevelASD3D12(NEW_RC_OBJ(m_BLASAllocator, "BottomLevelASD3D12Impl instance", BottomLevelASD3D12Impl)(this, Desc));
- pBottomLevelASD3D12->QueryInterface(IID_BottomLevelAS, reinterpret_cast<IObject**>(ppBLAS));
- OnCreateDeviceObject(pBottomLevelASD3D12);
- });
+ CreateBLASImpl(ppBLAS, Desc);
}
void RenderDeviceD3D12Impl::CreateTLASFromD3DResource(ID3D12Resource* pd3d12TLAS,
@@ -785,37 +667,19 @@ void RenderDeviceD3D12Impl::CreateTLASFromD3DResource(ID3D12Resource* pd3d
RESOURCE_STATE InitialState,
ITopLevelAS** ppTLAS)
{
- CreateDeviceObject("TopLevelAS", Desc, ppTLAS,
- [&]() //
- {
- TopLevelASD3D12Impl* pTopLevelASD3D12{NEW_RC_OBJ(m_TLASAllocator, "TopLevelASD3D12Impl instance", TopLevelASD3D12Impl)(this, Desc, InitialState, pd3d12TLAS)};
- pTopLevelASD3D12->QueryInterface(IID_TopLevelAS, reinterpret_cast<IObject**>(ppTLAS));
- OnCreateDeviceObject(pTopLevelASD3D12);
- });
+ CreateTLASImpl(ppTLAS, Desc, InitialState, pd3d12TLAS);
}
void RenderDeviceD3D12Impl::CreateTLAS(const TopLevelASDesc& Desc,
ITopLevelAS** ppTLAS)
{
- CreateDeviceObject("TopLevelAS", Desc, ppTLAS,
- [&]() //
- {
- TopLevelASD3D12Impl* pTopLevelASD3D12(NEW_RC_OBJ(m_TLASAllocator, "TopLevelASD3D12Impl instance", TopLevelASD3D12Impl)(this, Desc));
- pTopLevelASD3D12->QueryInterface(IID_TopLevelAS, reinterpret_cast<IObject**>(ppTLAS));
- OnCreateDeviceObject(pTopLevelASD3D12);
- });
+ CreateTLASImpl(ppTLAS, Desc);
}
void RenderDeviceD3D12Impl::CreateSBT(const ShaderBindingTableDesc& Desc,
IShaderBindingTable** ppSBT)
{
- CreateDeviceObject("ShaderBindingTable", Desc, ppSBT,
- [&]() //
- {
- ShaderBindingTableD3D12Impl* pSBTD3D12(NEW_RC_OBJ(m_SBTAllocator, "ShaderBindingTableD3D12Impl instance", ShaderBindingTableD3D12Impl)(this, Desc));
- pSBTD3D12->QueryInterface(IID_ShaderBindingTable, reinterpret_cast<IObject**>(ppSBT));
- OnCreateDeviceObject(pSBTD3D12);
- });
+ CreateSBTImpl(ppSBT, Desc);
}
void RenderDeviceD3D12Impl::CreatePipelineResourceSignature(const PipelineResourceSignatureDesc& Desc,
@@ -828,13 +692,7 @@ void RenderDeviceD3D12Impl::CreatePipelineResourceSignature(const PipelineResour
IPipelineResourceSignature** ppSignature,
bool IsDeviceInternal)
{
- CreateDeviceObject("PipelineResourceSignature", Desc, ppSignature,
- [&]() //
- {
- PipelineResourceSignatureD3D12Impl* pPRSD3D12(NEW_RC_OBJ(m_PipeResSignAllocator, "PipelineResourceSignatureD3D12Impl instance", PipelineResourceSignatureD3D12Impl)(this, Desc, IsDeviceInternal));
- pPRSD3D12->QueryInterface(IID_PipelineResourceSignature, reinterpret_cast<IObject**>(ppSignature));
- OnCreateDeviceObject(pPRSD3D12);
- });
+ CreatePipelineResourceSignatureImpl(ppSignature, Desc, IsDeviceInternal);
}
DescriptorHeapAllocation RenderDeviceD3D12Impl::AllocateDescriptors(D3D12_DESCRIPTOR_HEAP_TYPE Type, UINT Count /*= 1*/)