From 97b32f52cc123544a1352527c2509c804fd3d190 Mon Sep 17 00:00:00 2001 From: Egor Yusov Date: Mon, 12 Aug 2019 22:00:42 -0700 Subject: D3D12 backend: enabled multiple swap chain support --- .../GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp | 2 +- .../GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp | 52 +++------------------- 2 files changed, 8 insertions(+), 46 deletions(-) (limited to 'Graphics/GraphicsEngineD3D11') diff --git a/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp b/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp index 40a3eb16..87ffbdc5 100644 --- a/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp +++ b/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp @@ -315,7 +315,7 @@ void EngineFactoryD3D11Impl::CreateSwapChainD3D11(IRenderDevice* pDev if (pDeviceContextD3D11->GetSwapChain() != nullptr && SCDesc.IsPrimary) { LOG_ERROR_AND_THROW("Another swap chain labeled as primary has already been created. " - "There must be only one primary swap chain."); + "There must only be one primary swap chain."); } auto* pSwapChainD3D11 = NEW_RC_OBJ(RawMemAllocator, "SwapChainD3D11Impl instance", SwapChainD3D11Impl) diff --git a/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp index 225e3a98..0ffc8070 100644 --- a/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp @@ -21,7 +21,6 @@ * of the possibility of such damages. */ -#include #include "pch.h" #include "SwapChainD3D11Impl.h" #include "RenderDeviceD3D11Impl.h" @@ -144,38 +143,9 @@ void SwapChainD3D11Impl::UpdateSwapChain(bool CreateNew) VERIFY(pDeviceContext, "Immediate context has been released"); if (pDeviceContext) { - auto *pImmediateCtxD3D11 = pDeviceContext.RawPtr(); - bool RebindRenderTargets = false; - bool UnbindRenderTargets = false; - if (m_SwapChainDesc.IsPrimary) - { - RebindRenderTargets = UnbindRenderTargets = pImmediateCtxD3D11->IsDefaultFBBound(); - } - else - { - std::array pOrigRTVs = {}; - RefCntAutoPtr pOrigDSV; - Uint32 NumRenderTargets = 0; - pImmediateCtxD3D11->GetRenderTargets(NumRenderTargets, pOrigRTVs.data(), &pOrigDSV); - for (Uint32 i=0; i < NumRenderTargets; ++i) - { - if (pOrigRTVs[i] == m_pRenderTargetView) - UnbindRenderTargets = true; - } - if (pOrigDSV == m_pDepthStencilView) - UnbindRenderTargets = true; - - RebindRenderTargets = NumRenderTargets == 1 && pOrigRTVs[0] == m_pRenderTargetView && pOrigDSV == m_pDepthStencilView; - - for(auto pRTV : pOrigRTVs) - { - if (pRTV != nullptr) - pRTV->Release(); - } - } - - if (UnbindRenderTargets) - pImmediateCtxD3D11->ResetRenderTargets(); + auto* pImmediateCtxD3D11 = pDeviceContext.RawPtr(); + ITextureView* pBackBufferRTVs[] = {m_pRenderTargetView}; + bool RebindRenderTargets = UnbindRenderTargets(pImmediateCtxD3D11, pBackBufferRTVs, 1, m_pDepthStencilView); // Swap chain cannot be resized until all references are released m_pRenderTargetView.Release(); @@ -214,19 +184,11 @@ void SwapChainD3D11Impl::UpdateSwapChain(bool CreateNew) CreateRTVandDSV(); - if (RebindRenderTargets) + if (m_SwapChainDesc.IsPrimary && RebindRenderTargets) { - if (m_SwapChainDesc.IsPrimary) - { - // Set default render target and viewport - pImmediateCtxD3D11->SetRenderTargets(0, nullptr, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); - pImmediateCtxD3D11->SetViewports(1, nullptr, 0, 0); - } - else - { - ITextureView* pRTVs[] = {GetCurrentBackBufferRTV()}; - pImmediateCtxD3D11->SetRenderTargets(1, pRTVs, GetDepthBufferDSV(), RESOURCE_STATE_TRANSITION_MODE_TRANSITION); - } + // Set default render target and viewport + pImmediateCtxD3D11->SetRenderTargets(0, nullptr, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); + pImmediateCtxD3D11->SetViewports(1, nullptr, 0, 0); } } catch (const std::runtime_error &) -- cgit v1.2.3