From b3324043659e95f7479c76891cfcade17fdf9487 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 16 Sep 2016 10:22:39 +0200 Subject: [PATCH] Handle the typeless/typed castability fudging for backbuffers --- renderdoc/driver/d3d12/d3d12_device.cpp | 8 +++++- renderdoc/driver/d3d12/d3d12_device.h | 2 ++ renderdoc/driver/d3d12/d3d12_manager.cpp | 32 ++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index d329a3237..3592532fe 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -540,7 +540,7 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 * // DXGI swap chain back buffers can be freely cast as a special-case. // translate the format to a typeless format to allow for this. - // the original type will be stored in the texture below + // the original type is stored separately below Descriptor.Format = GetTypelessFormat(Descriptor.Format); HRESULT hr = S_OK; @@ -571,6 +571,8 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(WrappedIDXGISwapChain3 * GetResourceManager()->AddLiveResource(TexID, fakeBB); + m_BackbufferFormat = std::make_pair(wrapped->GetResourceID(), swapFormat); + SubresourceStateVector &states = m_ResourceStates[wrapped->GetResourceID()]; states.resize(1, D3D12_RESOURCE_STATE_PRESENT); @@ -611,6 +613,10 @@ IUnknown *WrappedID3D12Device::WrapSwapchainBuffer(WrappedIDXGISwapChain3 *swap, record->SpecialResource = true; record->Length = 0; + WrappedID3D12Resource *wrapped = (WrappedID3D12Resource *)pRes; + + wrapped->SetResourceRecord(record); + SCOPED_LOCK(m_D3DLock); SCOPED_SERIALISE_CONTEXT(CREATE_SWAP_BUFFER); diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index ebbde2dcf..e204e4a6d 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -288,6 +288,7 @@ private: }; map m_SwapChains; + pair m_BackbufferFormat; WrappedIDXGISwapChain3 *m_LastSwap; @@ -329,6 +330,7 @@ public: return m_ResourceStates[id]; } + const pair GetBackbufferFormat() { 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 cc0feabe6..377831c4d 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -145,6 +145,18 @@ void D3D12Descriptor::Create(WrappedID3D12Device *dev, D3D12_CPU_DESCRIPTOR_HAND if(desc->ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN) { desc = nonsamp.resource ? NULL : defaultSRV(); + + // fixup for backbuffers + if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + { + D3D12_SHADER_RESOURCE_VIEW_DESC bbDesc = {}; + bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + bbDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + bbDesc.Texture2D.MipLevels = 1; + dev->CreateShaderResourceView(nonsamp.resource, &bbDesc, handle); + return; + } } dev->CreateShaderResourceView(nonsamp.resource, desc, handle); @@ -156,6 +168,16 @@ void D3D12Descriptor::Create(WrappedID3D12Device *dev, D3D12_CPU_DESCRIPTOR_HAND if(desc->ViewDimension == D3D12_RTV_DIMENSION_UNKNOWN) { desc = nonsamp.resource ? NULL : defaultRTV(); + + // fixup for backbuffers + if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + { + D3D12_RENDER_TARGET_VIEW_DESC bbDesc = {}; + bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + dev->CreateRenderTargetView(nonsamp.resource, &bbDesc, handle); + return; + } } dev->CreateRenderTargetView(nonsamp.resource, desc, handle); @@ -178,6 +200,16 @@ void D3D12Descriptor::Create(WrappedID3D12Device *dev, D3D12_CPU_DESCRIPTOR_HAND if(uavdesc.ViewDimension == D3D12_SRV_DIMENSION_UNKNOWN) { desc = nonsamp.resource ? NULL : defaultUAV(); + + // fixup for backbuffers + if(dev->GetBackbufferFormat().first == GetResID(nonsamp.resource)) + { + D3D12_UNORDERED_ACCESS_VIEW_DESC bbDesc = {}; + bbDesc.Format = dev->GetBackbufferFormat().second; + bbDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; + dev->CreateUnorderedAccessView(nonsamp.resource, NULL, &bbDesc, handle); + return; + } } dev->CreateUnorderedAccessView(nonsamp.resource, nonsamp.uav.counterResource, desc, handle);