summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineD3D12
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2020-10-18 20:06:48 +0000
committerassiduous <assiduous@diligentgraphics.com>2020-10-18 20:06:48 +0000
commit645ef7e425d6ff4ee64b782d27767e0a5732be50 (patch)
tree8502aea9ba6100af3a0908c5975a75debc5fd7de /Graphics/GraphicsEngineD3D12
parentRefactored LinearAllocator (diff)
downloadDiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.tar.gz
DiligentCore-645ef7e425d6ff4ee64b782d27767e0a5732be50.zip
A number of fixes for PSO creation refactoring (API240075)
Diffstat (limited to 'Graphics/GraphicsEngineD3D12')
-rw-r--r--Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp7
-rw-r--r--Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp3
-rw-r--r--Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp2
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp70
-rw-r--r--Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp41
5 files changed, 61 insertions, 62 deletions
diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
index 821ff951..31d95179 100644
--- a/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/PipelineStateD3D12Impl.hpp
@@ -131,8 +131,11 @@ private:
pShader{_pShader}
{}
};
- void InitResourceLayouts(RenderDeviceD3D12Impl* pDeviceD3D12,
- const PipelineStateCreateInfo& CreateInfo,
+
+ template <typename PSOCreateInfoType>
+ LinearAllocator InitInternalObjects(const PSOCreateInfoType& CreateInfo, std::vector<D3D12PipelineShaderStageInfo>& ShaderStages);
+
+ void InitResourceLayouts(const PipelineStateCreateInfo& CreateInfo,
std::vector<D3D12PipelineShaderStageInfo>& ShaderStages);
CComPtr<ID3D12PipelineState> m_pd3d12PSO;
diff --git a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
index 7083e30d..34a77213 100644
--- a/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
+++ b/Graphics/GraphicsEngineD3D12/include/RenderDeviceD3D12Impl.hpp
@@ -165,6 +165,9 @@ public:
D3D_FEATURE_LEVEL GetD3DFeatureLevel() const;
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/DeviceContextD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
index f1bc35eb..938c9468 100644
--- a/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/DeviceContextD3D12Impl.cpp
@@ -254,11 +254,13 @@ void DeviceContextD3D12Impl::SetPipelineState(IPipelineState* pPipelineState)
}
break;
}
+
case PIPELINE_TYPE_COMPUTE:
{
CmdCtx.AsComputeContext().SetPipelineState(pd3d12PSO);
break;
}
+
default:
UNEXPECTED("unknown pipeline type");
}
diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
index 0d26db2a..f04a309e 100644
--- a/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/PipelineStateD3D12Impl.cpp
@@ -98,38 +98,49 @@ private:
std::array<D3D12_PRIMITIVE_TOPOLOGY_TYPE, PRIMITIVE_TOPOLOGY_NUM_TOPOLOGIES> m_Map;
};
-PipelineStateD3D12Impl::PipelineStateD3D12Impl(IReferenceCounters* pRefCounters,
- RenderDeviceD3D12Impl* pDeviceD3D12,
- const GraphicsPipelineStateCreateInfo& CreateInfo) :
- TPipelineStateBase{pRefCounters, pDeviceD3D12, CreateInfo.PSODesc},
- m_SRBMemAllocator{GetRawAllocator()}
+template <typename PSOCreateInfoType>
+LinearAllocator PipelineStateD3D12Impl::InitInternalObjects(const PSOCreateInfoType& CreateInfo,
+ std::vector<D3D12PipelineShaderStageInfo>& ShaderStages)
{
m_ResourceLayoutIndex.fill(-1);
- std::vector<D3D12PipelineShaderStageInfo> ShaderStages;
ExtractShaders<ShaderD3D12Impl>(CreateInfo, ShaderStages);
// Memory must be released if an exception is thrown.
LinearAllocator MemPool{GetRawAllocator()};
- MemPool.AddRequiredSize<ShaderResourceLayoutD3D12>(GetNumShaderStages() * 2);
- MemPool.AddRequiredSize<ShaderResourceCacheD3D12>(GetNumShaderStages());
- MemPool.AddRequiredSize<ShaderVariableManagerD3D12>(GetNumShaderStages());
+ MemPool.AddSpace<ShaderResourceLayoutD3D12>(GetNumShaderStages() * 2);
+ MemPool.AddSpace<ShaderResourceCacheD3D12>(GetNumShaderStages());
+ MemPool.AddSpace<ShaderVariableManagerD3D12>(GetNumShaderStages());
- ValidateAndReserveSpace(CreateInfo, MemPool);
+ ReserveSpaceForPipelineDesc(CreateInfo, MemPool);
MemPool.Reserve();
- auto pd3d12Device = pDeviceD3D12->GetD3D12Device();
- m_RootSig.AllocateStaticSamplers(m_Desc.ResourceLayout);
+ m_RootSig.AllocateStaticSamplers(CreateInfo.PSODesc.ResourceLayout);
m_pShaderResourceLayouts = MemPool.Allocate<ShaderResourceLayoutD3D12>(GetNumShaderStages() * 2);
m_pStaticResourceCaches = MemPool.Allocate<ShaderResourceCacheD3D12>(GetNumShaderStages());
m_pStaticVarManagers = MemPool.Allocate<ShaderVariableManagerD3D12>(GetNumShaderStages());
- InitGraphicsPipeline(CreateInfo, MemPool);
- InitResourceLayouts(pDeviceD3D12, CreateInfo, ShaderStages);
+ InitializePipelineDesc(CreateInfo, MemPool);
+ InitResourceLayouts(CreateInfo, ShaderStages);
+
+ return MemPool;
+}
+
+
+PipelineStateD3D12Impl::PipelineStateD3D12Impl(IReferenceCounters* pRefCounters,
+ RenderDeviceD3D12Impl* pDeviceD3D12,
+ const GraphicsPipelineStateCreateInfo& CreateInfo) :
+ TPipelineStateBase{pRefCounters, pDeviceD3D12, CreateInfo.PSODesc},
+ m_SRBMemAllocator{GetRawAllocator()}
+{
+ std::vector<D3D12PipelineShaderStageInfo> ShaderStages;
+
+ auto MemPool = InitInternalObjects(CreateInfo, ShaderStages);
+ auto pd3d12Device = pDeviceD3D12->GetD3D12Device();
if (m_Desc.PipelineType == PIPELINE_TYPE_GRAPHICS)
{
const auto& GraphicsPipeline = GetGraphicsPipelineDesc();
@@ -324,31 +335,11 @@ PipelineStateD3D12Impl::PipelineStateD3D12Impl(IReferenceCounters*
TPipelineStateBase{pRefCounters, pDeviceD3D12, CreateInfo.PSODesc},
m_SRBMemAllocator{GetRawAllocator()}
{
- m_ResourceLayoutIndex.fill(-1);
-
std::vector<D3D12PipelineShaderStageInfo> ShaderStages;
- ExtractShaders<ShaderD3D12Impl>(CreateInfo, ShaderStages);
-
- // Memory must be released if an exception is thrown.
- LinearAllocator MemPool{GetRawAllocator()};
- MemPool.AddRequiredSize<ShaderResourceLayoutD3D12>(GetNumShaderStages() * 2);
- MemPool.AddRequiredSize<ShaderResourceCacheD3D12>(GetNumShaderStages());
- MemPool.AddRequiredSize<ShaderVariableManagerD3D12>(GetNumShaderStages());
-
- ValidateAndReserveSpace(CreateInfo, MemPool);
-
- MemPool.Reserve();
+ auto MemPool = InitInternalObjects(CreateInfo, ShaderStages);
auto pd3d12Device = pDeviceD3D12->GetD3D12Device();
- m_RootSig.AllocateStaticSamplers(m_Desc.ResourceLayout);
-
- m_pShaderResourceLayouts = MemPool.Allocate<ShaderResourceLayoutD3D12>(GetNumShaderStages() * 2);
- m_pStaticResourceCaches = MemPool.Allocate<ShaderResourceCacheD3D12>(GetNumShaderStages());
- m_pStaticVarManagers = MemPool.Allocate<ShaderVariableManagerD3D12>(GetNumShaderStages());
-
- InitComputePipeline(CreateInfo, MemPool);
- InitResourceLayouts(pDeviceD3D12, CreateInfo, ShaderStages);
D3D12_COMPUTE_PIPELINE_STATE_DESC d3d12PSODesc = {};
@@ -410,11 +401,10 @@ PipelineStateD3D12Impl::~PipelineStateD3D12Impl()
IMPLEMENT_QUERY_INTERFACE(PipelineStateD3D12Impl, IID_PipelineStateD3D12, TPipelineStateBase)
-void PipelineStateD3D12Impl::InitResourceLayouts(RenderDeviceD3D12Impl* pDeviceD3D12,
- const PipelineStateCreateInfo& CreateInfo,
+void PipelineStateD3D12Impl::InitResourceLayouts(const PipelineStateCreateInfo& CreateInfo,
std::vector<D3D12PipelineShaderStageInfo>& ShaderStages)
{
- auto pd3d12Device = pDeviceD3D12->GetD3D12Device();
+ auto pd3d12Device = GetDevice()->GetD3D12Device();
const auto& ResourceLayout = m_Desc.ResourceLayout;
#ifdef DILIGENT_DEVELOPMENT
@@ -443,7 +433,7 @@ void PipelineStateD3D12Impl::InitResourceLayouts(RenderDeviceD3D12Impl*
ShaderResourceLayoutD3D12 //
{
*this,
- pDeviceD3D12->GetD3D12Device(),
+ pd3d12Device,
m_Desc.PipelineType,
ResourceLayout,
pShaderD3D12->GetShaderResources(),
@@ -461,7 +451,7 @@ void PipelineStateD3D12Impl::InitResourceLayouts(RenderDeviceD3D12Impl*
ShaderResourceLayoutD3D12 //
{
*this,
- pDeviceD3D12->GetD3D12Device(),
+ pd3d12Device,
m_Desc.PipelineType,
ResourceLayout,
pShaderD3D12->GetShaderResources(),
diff --git a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
index 97069bd2..ba91f7bc 100644
--- a/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
+++ b/Graphics/GraphicsEngineD3D12/src/RenderDeviceD3D12Impl.cpp
@@ -534,26 +534,27 @@ void RenderDeviceD3D12Impl::TestTextureFormat(TEXTURE_FORMAT TexFormat)
IMPLEMENT_QUERY_INTERFACE(RenderDeviceD3D12Impl, IID_RenderDeviceD3D12, TRenderDeviceBase)
-void RenderDeviceD3D12Impl::CreateGraphicsPipelineState(const GraphicsPipelineStateCreateInfo& PSOCreateInfo, IPipelineState** ppPipelineState)
+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));
+ 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);
+}
+
void RenderDeviceD3D12Impl::CreateComputePipelineState(const ComputePipelineStateCreateInfo& 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);
- });
+ CreatePipelineState(PSOCreateInfo, ppPipelineState);
}
void RenderDeviceD3D12Impl::CreateBufferFromD3DResource(ID3D12Resource* pd3d12Buffer, const BufferDesc& BuffDesc, RESOURCE_STATE InitialState, IBuffer** ppBuffer)
@@ -561,7 +562,7 @@ void RenderDeviceD3D12Impl::CreateBufferFromD3DResource(ID3D12Resource* pd3d12Bu
CreateDeviceObject("buffer", BuffDesc, ppBuffer,
[&]() //
{
- BufferD3D12Impl* pBufferD3D12(NEW_RC_OBJ(m_BufObjAllocator, "BufferD3D12Impl instance", BufferD3D12Impl)(m_BuffViewObjAllocator, this, BuffDesc, InitialState, pd3d12Buffer));
+ 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);
@@ -573,7 +574,7 @@ void RenderDeviceD3D12Impl::CreateBuffer(const BufferDesc& BuffDesc, const Buffe
CreateDeviceObject("buffer", BuffDesc, ppBuffer,
[&]() //
{
- BufferD3D12Impl* pBufferD3D12(NEW_RC_OBJ(m_BufObjAllocator, "BufferD3D12Impl instance", BufferD3D12Impl)(m_BuffViewObjAllocator, this, BuffDesc, pBuffData));
+ 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);
@@ -586,7 +587,7 @@ void RenderDeviceD3D12Impl::CreateShader(const ShaderCreateInfo& ShaderCI, IShad
CreateDeviceObject("shader", ShaderCI.Desc, ppShader,
[&]() //
{
- ShaderD3D12Impl* pShaderD3D12(NEW_RC_OBJ(m_ShaderObjAllocator, "ShaderD3D12Impl instance", ShaderD3D12Impl)(this, ShaderCI));
+ ShaderD3D12Impl* pShaderD3D12{NEW_RC_OBJ(m_ShaderObjAllocator, "ShaderD3D12Impl instance", ShaderD3D12Impl)(this, ShaderCI)};
pShaderD3D12->QueryInterface(IID_Shader, reinterpret_cast<IObject**>(ppShader));
OnCreateDeviceObject(pShaderD3D12);
@@ -600,7 +601,7 @@ void RenderDeviceD3D12Impl::CreateTextureFromD3DResource(ID3D12Resource* pd3d12T
CreateDeviceObject("texture", TexDesc, ppTexture,
[&]() //
{
- TextureD3D12Impl* pTextureD3D12 = NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, InitialState, pd3d12Texture);
+ 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();
@@ -613,7 +614,7 @@ void RenderDeviceD3D12Impl::CreateTexture(const TextureDesc& TexDesc, ID3D12Reso
CreateDeviceObject("texture", TexDesc, ppTexture,
[&]() //
{
- TextureD3D12Impl* pTextureD3D12 = NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, InitialState, pd3d12Texture);
+ TextureD3D12Impl* pTextureD3D12{NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, InitialState, pd3d12Texture)};
pTextureD3D12->QueryInterface(IID_TextureD3D12, reinterpret_cast<IObject**>(ppTexture));
});
}
@@ -623,7 +624,7 @@ void RenderDeviceD3D12Impl::CreateTexture(const TextureDesc& TexDesc, const Text
CreateDeviceObject("texture", TexDesc, ppTexture,
[&]() //
{
- TextureD3D12Impl* pTextureD3D12 = NEW_RC_OBJ(m_TexObjAllocator, "TextureD3D12Impl instance", TextureD3D12Impl)(m_TexViewObjAllocator, this, TexDesc, pData);
+ 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();
@@ -639,7 +640,7 @@ void RenderDeviceD3D12Impl::CreateSampler(const SamplerDesc& SamplerDesc, ISampl
m_SamplersRegistry.Find(SamplerDesc, reinterpret_cast<IDeviceObject**>(ppSampler));
if (*ppSampler == nullptr)
{
- SamplerD3D12Impl* pSamplerD3D12(NEW_RC_OBJ(m_SamplerObjAllocator, "SamplerD3D12Impl instance", SamplerD3D12Impl)(this, SamplerDesc));
+ 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);
@@ -652,7 +653,7 @@ void RenderDeviceD3D12Impl::CreateFence(const FenceDesc& Desc, IFence** ppFence)
CreateDeviceObject("Fence", Desc, ppFence,
[&]() //
{
- FenceD3D12Impl* pFenceD3D12(NEW_RC_OBJ(m_FenceAllocator, "FenceD3D12Impl instance", FenceD3D12Impl)(this, Desc));
+ FenceD3D12Impl* pFenceD3D12{NEW_RC_OBJ(m_FenceAllocator, "FenceD3D12Impl instance", FenceD3D12Impl)(this, Desc)};
pFenceD3D12->QueryInterface(IID_Fence, reinterpret_cast<IObject**>(ppFence));
OnCreateDeviceObject(pFenceD3D12);
});
@@ -663,7 +664,7 @@ void RenderDeviceD3D12Impl::CreateQuery(const QueryDesc& Desc, IQuery** ppQuery)
CreateDeviceObject("Query", Desc, ppQuery,
[&]() //
{
- QueryD3D12Impl* pQueryD3D12(NEW_RC_OBJ(m_QueryAllocator, "QueryD3D12Impl instance", QueryD3D12Impl)(this, Desc));
+ QueryD3D12Impl* pQueryD3D12{NEW_RC_OBJ(m_QueryAllocator, "QueryD3D12Impl instance", QueryD3D12Impl)(this, Desc)};
pQueryD3D12->QueryInterface(IID_Query, reinterpret_cast<IObject**>(ppQuery));
OnCreateDeviceObject(pQueryD3D12);
});
@@ -674,7 +675,7 @@ void RenderDeviceD3D12Impl::CreateRenderPass(const RenderPassDesc& Desc, IRender
CreateDeviceObject("RenderPass", Desc, ppRenderPass,
[&]() //
{
- RenderPassD3D12Impl* pRenderPassD3D12(NEW_RC_OBJ(m_RenderPassAllocator, "RenderPassD3D12Impl instance", RenderPassD3D12Impl)(this, Desc));
+ RenderPassD3D12Impl* pRenderPassD3D12{NEW_RC_OBJ(m_RenderPassAllocator, "RenderPassD3D12Impl instance", RenderPassD3D12Impl)(this, Desc)};
pRenderPassD3D12->QueryInterface(IID_RenderPass, reinterpret_cast<IObject**>(ppRenderPass));
OnCreateDeviceObject(pRenderPassD3D12);
});
@@ -685,7 +686,7 @@ void RenderDeviceD3D12Impl::CreateFramebuffer(const FramebufferDesc& Desc, IFram
CreateDeviceObject("Framebuffer", Desc, ppFramebuffer,
[&]() //
{
- FramebufferD3D12Impl* pFramebufferD3D12(NEW_RC_OBJ(m_FramebufferAllocator, "FramebufferD3D12Impl instance", FramebufferD3D12Impl)(this, Desc));
+ FramebufferD3D12Impl* pFramebufferD3D12{NEW_RC_OBJ(m_FramebufferAllocator, "FramebufferD3D12Impl instance", FramebufferD3D12Impl)(this, Desc)};
pFramebufferD3D12->QueryInterface(IID_Framebuffer, reinterpret_cast<IObject**>(ppFramebuffer));
OnCreateDeviceObject(pFramebufferD3D12);
});