diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 18bf2b01b..fb03929bc 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -547,9 +547,10 @@ D3D12_CPU_DESCRIPTOR_HANDLE D3D12DebugManager::GetTempDescriptor(const D3D12Desc const D3D12_RENDER_TARGET_VIEW_DESC *rtvdesc = &desc.GetRTV(); if(rtvdesc->ViewDimension == D3D12_RTV_DIMENSION_UNKNOWN) - { rtvdesc = NULL; + if(rtvdesc == NULL || rtvdesc->Format == DXGI_FORMAT_UNKNOWN) + { const std::map &bbs = m_pDevice->GetBackbufferFormats(); auto it = bbs.find(GetResID(res)); @@ -589,9 +590,10 @@ D3D12_CPU_DESCRIPTOR_HANDLE D3D12DebugManager::GetTempDescriptor(const D3D12Desc const D3D12_UNORDERED_ACCESS_VIEW_DESC *uavdesc = &unpacked; if(uavdesc->ViewDimension == D3D12_UAV_DIMENSION_UNKNOWN) - { uavdesc = NULL; + if(uavdesc == NULL || uavdesc->Format == DXGI_FORMAT_UNKNOWN) + { const std::map &bbs = m_pDevice->GetBackbufferFormats(); auto it = bbs.find(GetResID(res)); diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 62a67cad1..59b978f35 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -871,7 +871,7 @@ bool WrappedID3D12Device::Serialise_WrapSwapchainBuffer(SerialiserType &ser, WrappedID3D12Resource1 *pRes = (WrappedID3D12Resource1 *)realSurface; SERIALISE_ELEMENT(Buffer); - SERIALISE_ELEMENT_LOCAL(SwapbufferID, GetResID(pRes)).TypedAs("IDXGISwapChain *"); + SERIALISE_ELEMENT_LOCAL(SwapbufferID, GetResID(pRes)).TypedAs("ID3D12Resource *"); SERIALISE_ELEMENT_LOCAL(BackbufferDescriptor, pRes->GetDesc()); SERIALISE_CHECK_READ_ERRORS(); diff --git a/renderdoc/driver/d3d12/d3d12_manager.cpp b/renderdoc/driver/d3d12/d3d12_manager.cpp index 3487cc4af..61431c2fe 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -187,6 +187,21 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D // by referring to a resource that was deleted), use a default descriptor desc = defaultSRV(); } + else if(desc->Format == DXGI_FORMAT_UNKNOWN) + { + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(res)); + + // fixup for backbuffers + if(it != bbs.end()) + { + D3D12_SHADER_RESOURCE_VIEW_DESC bbDesc = *desc; + bbDesc.Format = it->second; + dev->CreateShaderResourceView(res, &bbDesc, handle); + return; + } + } D3D12_SHADER_RESOURCE_VIEW_DESC planeDesc; // ensure that multi-plane formats have a valid plane slice specified. This shouldn't be @@ -262,6 +277,21 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D // by referring to a resource that was deleted), use a default descriptor desc = defaultRTV(); } + else if(desc->Format == DXGI_FORMAT_UNKNOWN) + { + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(res)); + + // fixup for backbuffers + if(it != bbs.end()) + { + D3D12_RENDER_TARGET_VIEW_DESC bbDesc = *desc; + bbDesc.Format = it->second; + dev->CreateRenderTargetView(res, &bbDesc, handle); + return; + } + } D3D12_RENDER_TARGET_VIEW_DESC planeDesc; // ensure that multi-plane formats have a valid plane slice specified. This shouldn't be @@ -356,6 +386,21 @@ void D3D12Descriptor::Create(D3D12_DESCRIPTOR_HEAP_TYPE heapType, WrappedID3D12D // default descriptor desc = defaultUAV(); } + else if(desc->Format == DXGI_FORMAT_UNKNOWN) + { + const map &bbs = dev->GetBackbufferFormats(); + + auto it = bbs.find(GetResID(res)); + + // fixup for backbuffers + if(it != bbs.end()) + { + D3D12_UNORDERED_ACCESS_VIEW_DESC bbDesc = *desc; + bbDesc.Format = it->second; + dev->CreateUnorderedAccessView(res, NULL, &bbDesc, handle); + return; + } + } if(countRes == NULL && desc && desc->ViewDimension == D3D12_UAV_DIMENSION_BUFFER) desc->Buffer.CounterOffsetInBytes = 0;