From 4fd74ca8444da6491d5ec5f5e2b569c09cba2b3a Mon Sep 17 00:00:00 2001 From: assiduous Date: Mon, 23 Dec 2019 21:24:13 -0800 Subject: Disabled SetRenderTarget(0, nullptr, nullptr) usage (fixed https://github.com/DiligentGraphics/DiligentCore/issues/81) --- .../src/DeviceContextD3D11Impl.cpp | 66 ++++++---------------- .../GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp | 31 ---------- .../GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp | 18 +++--- 3 files changed, 24 insertions(+), 91 deletions(-) (limited to 'Graphics/GraphicsEngineD3D11') diff --git a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp index c3962a0a..676c6d73 100755 --- a/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/DeviceContextD3D11Impl.cpp @@ -32,7 +32,6 @@ #include "D3D11TypeConversions.h" #include "TextureViewD3D11Impl.h" #include "PipelineStateD3D11Impl.h" -#include "SwapChainD3D11.h" #include "ShaderResourceBindingD3D11Impl.h" #include "EngineD3D11Defines.h" #include "CommandListD3D11Impl.h" @@ -914,20 +913,12 @@ void DeviceContextD3D11Impl::ClearDepthStencil(ITextureView* pV { if (pView == nullptr) { - if (m_pSwapChain) + if (m_pBoundDepthStencil == nullptr) { - pView = m_pSwapChain->GetDepthBufferDSV(); - if (pView == nullptr) - { - LOG_WARNING_MESSAGE("Depth buffer is not initialized in the swap chain. Clear operation will be ignored."); - return; - } - } - else - { - LOG_ERROR("Failed to clear default depth stencil buffer: swap chain is not initialized in the device context"); + LOG_ERROR_MESSAGE("ClearDepthStencil(nullptr, ...) is invalid because no depth-stencil buffer is currently bound."); return; } + pView = m_pBoundDepthStencil; } #ifdef DEVELOPMENT @@ -949,15 +940,14 @@ void DeviceContextD3D11Impl::ClearRenderTarget(ITextureView* pView, const float* { if (pView == nullptr) { - if (m_pSwapChain != nullptr) - { - pView = m_pSwapChain->GetCurrentBackBufferRTV(); - } - else + if (m_NumBoundRenderTargets != 1) { - LOG_ERROR("Failed to clear default render target: swap chain is not initialized in the device context"); + LOG_ERROR_MESSAGE("ClearRenderTarget(nullptr, ...) semantic is only allowed when single render target is bound to the context. ", + m_NumBoundRenderTargets, " render ", + (m_NumBoundRenderTargets != 1 ? "targets are" : "target is"), " currently bound"); return; } + pView = m_pBoundRenderTargets[0]; } #ifdef DEVELOPMENT @@ -1294,45 +1284,21 @@ void DeviceContextD3D11Impl::CommitRenderTargets() ID3D11RenderTargetView* pd3d11RTs[MaxD3D11RTs]; ID3D11DepthStencilView* pd3d11DSV = nullptr; - if (m_IsDefaultFramebufferBound) + for (Uint32 rt = 0; rt < NumRenderTargets; ++rt) { - if (m_pSwapChain) - { - NumRenderTargets = 1; - auto* pSwapChainD3D11 = m_pSwapChain.RawPtr(); - auto* pBackBufferViewD3D11 = pSwapChainD3D11->GetCurrentBackBufferRTV(); - pd3d11RTs[0] = static_cast(pBackBufferViewD3D11->GetD3D11View()); - VERIFY_EXPR(pd3d11RTs[0] != nullptr); - if (auto* pDepthBufferViewD3D11 = pSwapChainD3D11->GetDepthBufferDSV()) - { - pd3d11DSV = static_cast(pDepthBufferViewD3D11->GetD3D11View()); - VERIFY_EXPR(pd3d11DSV != nullptr); - } - } - else - { - LOG_ERROR("Failed to commit default render target and depth stencil: swap chain is not initialized in the device context"); - return; - } + auto* pViewD3D11 = m_pBoundRenderTargets[rt].RawPtr(); + pd3d11RTs[rt] = pViewD3D11 != nullptr ? static_cast(pViewD3D11->GetD3D11View()) : nullptr; } - else - { - for (Uint32 rt = 0; rt < NumRenderTargets; ++rt) - { - auto* pViewD3D11 = m_pBoundRenderTargets[rt].RawPtr(); - pd3d11RTs[rt] = pViewD3D11 != nullptr ? static_cast(pViewD3D11->GetD3D11View()) : nullptr; - } - if (m_pBoundDepthStencil != nullptr) - { - pd3d11DSV = static_cast(m_pBoundDepthStencil->GetD3D11View()); - } + if (m_pBoundDepthStencil != nullptr) + { + pd3d11DSV = static_cast(m_pBoundDepthStencil->GetD3D11View()); } auto& NumCommittedPixelShaderUAVs = m_NumCommittedUAVs[PSInd]; if (NumCommittedPixelShaderUAVs > 0) { - m_pd3d11DeviceContext->OMSetRenderTargetsAndUnorderedAccessViews(NumRenderTargets, pd3d11RTs, pd3d11DSV, + m_pd3d11DeviceContext->OMSetRenderTargetsAndUnorderedAccessViews(NumRenderTargets, NumRenderTargets > 0 ? pd3d11RTs : nullptr, pd3d11DSV, 0, D3D11_KEEP_UNORDERED_ACCESS_VIEWS, nullptr, nullptr); auto CommittedD3D11UAVs = m_CommittedD3D11UAVs[PSInd]; @@ -1347,7 +1313,7 @@ void DeviceContextD3D11Impl::CommitRenderTargets() } else { - m_pd3d11DeviceContext->OMSetRenderTargets(NumRenderTargets, pd3d11RTs, pd3d11DSV); + m_pd3d11DeviceContext->OMSetRenderTargets(NumRenderTargets, NumRenderTargets > 0 ? pd3d11RTs : nullptr, pd3d11DSV); } } diff --git a/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp b/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp index 161ab79c..bfc22eaa 100644 --- a/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp +++ b/Graphics/GraphicsEngineD3D11/src/EngineFactoryD3D11.cpp @@ -286,39 +286,8 @@ void EngineFactoryD3D11Impl::CreateSwapChainD3D11(IRenderDevice* pDev auto* pDeviceContextD3D11 = ValidatedCast(pImmediateContext); auto& RawMemAllocator = GetRawAllocator(); - if (pDeviceContextD3D11->GetSwapChain() != nullptr && SCDesc.IsPrimary) - { - LOG_ERROR_AND_THROW("Another swap chain labeled as primary has already been created. " - "There must only be one primary swap chain."); - } - auto* pSwapChainD3D11 = NEW_RC_OBJ(RawMemAllocator, "SwapChainD3D11Impl instance", SwapChainD3D11Impl)(SCDesc, FSDesc, pDeviceD3D11, pDeviceContextD3D11, pNativeWndHandle); pSwapChainD3D11->QueryInterface(IID_SwapChain, reinterpret_cast(ppSwapChain)); - - if (SCDesc.IsPrimary) - { - pDeviceContextD3D11->SetSwapChain(pSwapChainD3D11); - // Bind default render target - pDeviceContextD3D11->SetRenderTargets(0, nullptr, nullptr, RESOURCE_STATE_TRANSITION_MODE_TRANSITION); - // Set default viewport - pDeviceContextD3D11->SetViewports(1, nullptr, 0, 0); - - auto NumDeferredCtx = pDeviceD3D11->GetNumDeferredContexts(); - for (size_t ctx = 0; ctx < NumDeferredCtx; ++ctx) - { - if (auto pDeferredCtx = pDeviceD3D11->GetDeferredContext(ctx)) - { - auto* pDeferredCtxD3D11 = pDeferredCtx.RawPtr(); - pDeferredCtxD3D11->SetSwapChain(pSwapChainD3D11); - // Do not bind default render target and viewport to be - // consistent with D3D12 - //// Bind default render target - //pDeferredCtxD3D11->SetRenderTargets( 0, nullptr, nullptr ); - //// Set default viewport - //pDeferredCtxD3D11->SetViewports( 1, nullptr, 0, 0 ); - } - } - } } catch (const std::runtime_error&) { diff --git a/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp b/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp index 003c70c4..305a0b93 100644 --- a/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp +++ b/Graphics/GraphicsEngineD3D11/src/SwapChainD3D11Impl.cpp @@ -157,9 +157,14 @@ void SwapChainD3D11Impl::UpdateSwapChain(bool CreateNew) VERIFY(pDeviceContext, "Immediate context has been released"); if (pDeviceContext) { - auto* pImmediateCtxD3D11 = pDeviceContext.RawPtr(); - ITextureView* pBackBufferRTVs[] = {m_pRenderTargetView}; - bool RebindRenderTargets = UnbindRenderTargets(pImmediateCtxD3D11, pBackBufferRTVs, 1, m_pDepthStencilView); + auto* pImmediateCtxD3D11 = pDeviceContext.RawPtr(); + auto* pCurrentBackBuffer = ValidatedCast(m_pRenderTargetView->GetTexture()); + auto RenderTargetsReset = pImmediateCtxD3D11->UnbindTextureFromFramebuffer(pCurrentBackBuffer, false); + if (RenderTargetsReset) + { + LOG_INFO_MESSAGE_ONCE("Resizing the swap chain requires back and depth-stencil buffers to be unbound from the device context. " + "An application should use SetRenderTargets() to restore them."); + } // Swap chain cannot be resized until all references are released m_pRenderTargetView.Release(); @@ -197,13 +202,6 @@ void SwapChainD3D11Impl::UpdateSwapChain(bool CreateNew) } CreateRTVandDSV(); - - if (m_SwapChainDesc.IsPrimary && RebindRenderTargets) - { - // 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