From 968805b39aabc8066959bea4a521c3b2bbd8d683 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 24 Nov 2016 19:45:45 +0100 Subject: [PATCH] Handle multiple swapchain buffers being present in a D3D12 capture --- renderdoc/driver/d3d12/d3d12_device.cpp | 2 +- renderdoc/driver/d3d12/d3d12_device.h | 4 ++-- renderdoc/driver/d3d12/d3d12_manager.cpp | 24 ++++++++++++++++++------ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 3c0fb4c92..f35ff4208 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -671,7 +671,7 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(Serialiser *localSeriali GetResourceManager()->AddLiveResource(TexID, fakeBB); - m_BackbufferFormat = std::make_pair(wrapped->GetResourceID(), swapFormat); + m_BackbufferFormat[wrapped->GetResourceID()] = swapFormat; SubresourceStateVector &states = m_ResourceStates[wrapped->GetResourceID()]; diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 5ad661654..81755b4c1 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -326,7 +326,7 @@ private: }; map m_SwapChains; - pair m_BackbufferFormat; + map m_BackbufferFormat; WrappedIDXGISwapChain4 *m_LastSwap; @@ -371,7 +371,7 @@ public: return m_ResourceStates[id]; } const map &GetSubresourceStates() { return m_ResourceStates; } - const pair GetBackbufferFormat() { return m_BackbufferFormat; } + const map &GetBackbufferFormats() { return m_BackbufferFormat; } void SetLogFile(const char *logfile); void SetLogVersion(uint32_t fileversion) { m_InitParams.SerialiseVersion = fileversion; } D3D12Replay *GetReplay() { return &m_Replay; } diff --git a/renderdoc/driver/d3d12/d3d12_manager.cpp b/renderdoc/driver/d3d12/d3d12_manager.cpp index a56fd44e8..5e27a8c65 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -148,11 +148,15 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D { desc = nonsamp.resource ? NULL : defaultSRV(); + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(nonsamp.resource)); + // fixup for backbuffers - if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + if(it != bbs.end()) { D3D12_SHADER_RESOURCE_VIEW_DESC bbDesc = {}; - bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.Format = it->second; bbDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; bbDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; bbDesc.Texture2D.MipLevels = 1; @@ -217,11 +221,15 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D { desc = nonsamp.resource ? NULL : defaultRTV(); + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(nonsamp.resource)); + // fixup for backbuffers - if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + if(it != bbs.end()) { D3D12_RENDER_TARGET_VIEW_DESC bbDesc = {}; - bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.Format = it->second; bbDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; dev->CreateRenderTargetView(nonsamp.resource, &bbDesc, handle); return; @@ -303,11 +311,15 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D { desc = nonsamp.resource ? NULL : defaultUAV(); + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(nonsamp.resource)); + // fixup for backbuffers - if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + if(it != bbs.end()) { D3D12_UNORDERED_ACCESS_VIEW_DESC bbDesc = {}; - bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.Format = it->second; bbDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; dev->CreateUnorderedAccessView(nonsamp.resource, NULL, &bbDesc, handle); return;