From 92040f4636c8a65c17cc8dbd8e664c9409ed3cb3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 20 Sep 2020 11:23:06 +0100 Subject: [PATCH] Fix a crash with D3D11 SWAP_EFFECT_FLIP_DISCARD swapchains. Closes #2055 * DXGI is entangled with the API unfortunately, such that for D3D11 DXGI_SWAP_EFFECT_FLIP_DISCARD can only access buffer 0 (like DXGI_SWAP_EFFECT_DISCARD) but for D3D12 it can access any buffer. This is naturally undocumented. --- renderdoc/driver/dxgi/dxgi_wrapped.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp index b81bc42cf..643379492 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp +++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp @@ -365,8 +365,13 @@ void WrappedIDXGISwapChain4::WrapBuffersAfterResize() int bufCount = desc.BufferCount; - if(desc.SwapEffect == DXGI_SWAP_EFFECT_DISCARD) + // discard swap effects only allow querying buffer 0, but only on D3D11 - on D3D12 they can (and + // must) still query the full set of buffers. + if(m_pDevice->GetFrameCapturer()->GetFrameCaptureDriver() == RDCDriver::D3D11 && + (desc.SwapEffect == DXGI_SWAP_EFFECT_DISCARD || desc.SwapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD)) + { bufCount = 1; + } RDCASSERT(bufCount < MAX_NUM_BACKBUFFERS);