From 0c1b6439c4d96601580666c156bd26fd12959e86 Mon Sep 17 00:00:00 2001 From: dendron2000 Date: Tue, 26 Feb 2019 15:42:43 +0000 Subject: [PATCH] Fix reading back initial buffer/texture states in D3D12. --- renderdoc/driver/d3d12/d3d12_initstate.cpp | 37 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_initstate.cpp b/renderdoc/driver/d3d12/d3d12_initstate.cpp index 6c3e4dcd2..0b0197c58 100644 --- a/renderdoc/driver/d3d12/d3d12_initstate.cpp +++ b/renderdoc/driver/d3d12/d3d12_initstate.cpp @@ -79,6 +79,10 @@ bool D3D12ResourceManager::Prepare_InitialState(ID3D12DeviceChild *res) SetInitialContents(GetResID(r), D3D12InitialContents(D3D12InitialContents::MapDirect)); return true; } + else if(heapProps.Type == D3D12_HEAP_TYPE_UPLOAD) + { + return true; + } heapProps.Type = D3D12_HEAP_TYPE_READBACK; heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; @@ -96,10 +100,30 @@ bool D3D12ResourceManager::Prepare_InitialState(ID3D12DeviceChild *res) if(nonresident) m_Device->MakeResident(1, &pageable); + const vector &states = m_Device->GetSubresourceStates(GetResID(res)); + RDCASSERT(states.size() == 1); + + D3D12_RESOURCE_BARRIER barrier; + const bool needsTransition = (states[0] & D3D12_RESOURCE_STATE_COPY_SOURCE) == 0; + + if(needsTransition) + { + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = r->GetReal(); + barrier.Transition.Subresource = (UINT)0; + barrier.Transition.StateBefore = states[0]; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; + } + + ID3D12GraphicsCommandList *list = Unwrap(m_Device->GetInitialStateList()); + + // transition to copy source + if(needsTransition) + list->ResourceBarrier(1, &barrier); + if(SUCCEEDED(hr)) { - ID3D12GraphicsCommandList *list = Unwrap(m_Device->GetInitialStateList()); - list->CopyResource(copyDst, r->GetReal()); } else @@ -107,6 +131,13 @@ bool D3D12ResourceManager::Prepare_InitialState(ID3D12DeviceChild *res) RDCERR("Couldn't create readback buffer: HRESULT: %s", ToStr(hr).c_str()); } + // transition back to whatever it was before + if(needsTransition) + { + std::swap(barrier.Transition.StateBefore, barrier.Transition.StateAfter); + list->ResourceBarrier(1, &barrier); + } + if(nonresident) { m_Device->CloseInitialStateList(); @@ -172,7 +203,7 @@ bool D3D12ResourceManager::Prepare_InitialState(ID3D12DeviceChild *res) for(size_t i = 0; i < states.size(); i++) { - if(states[i] & D3D12_RESOURCE_STATE_COPY_SOURCE) + if(states[i] & destState) continue; D3D12_RESOURCE_BARRIER barrier;