From aa7b5558af72c386ec38b68215ef548f5ac08513 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 23 Sep 2016 14:05:27 +0200 Subject: [PATCH] Allow GetBufferData from readback and upload heap buffers --- renderdoc/driver/d3d12/d3d12_debug.cpp | 27 +++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 268205018..0e7e0549d 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -1416,6 +1416,8 @@ void D3D12DebugManager::GetBufferData(ID3D12Resource *buffer, uint64_t offset, u return; D3D12_RESOURCE_DESC desc = buffer->GetDesc(); + D3D12_HEAP_PROPERTIES heapProps; + buffer->GetHeapProperties(&heapProps, NULL); if(offset >= desc.Width) { @@ -1439,6 +1441,29 @@ void D3D12DebugManager::GetBufferData(ID3D12Resource *buffer, uint64_t offset, u ret.resize(length); + // directly CPU mappable (and possibly invalid to transition and copy from), so just memcpy + if(heapProps.Type == D3D12_HEAP_TYPE_UPLOAD || heapProps.Type == D3D12_HEAP_TYPE_READBACK) + { + D3D12_RANGE range = {offset, offset + length}; + + byte *data = NULL; + HRESULT hr = buffer->Map(0, &range, (void **)&data); + + if(FAILED(hr)) + { + RDCERR("Failed to map buffer directly for readback %08x", hr); + return; + } + + memcpy(&ret[0], data + offset, length); + + range.Begin = range.End = 0; + + buffer->Unmap(0, &range); + + return; + } + ID3D12GraphicsCommandList *list = m_WrappedDevice->GetNewList(); D3D12_RESOURCE_BARRIER barrier = {}; @@ -1462,7 +1487,7 @@ void D3D12DebugManager::GetBufferData(ID3D12Resource *buffer, uint64_t offset, u D3D12_RANGE range = {0, chunkSize}; - void *data; + void *data = NULL; HRESULT hr = m_ReadbackBuffer->Map(0, &range, &data); if(FAILED(hr))