diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index c45a897b1..66861df40 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -1092,7 +1092,8 @@ void WrappedID3D12CommandQueue::ExecuteCommandListsInternal(UINT NumCommandLists queueReadback.Resize(size); queueReadback.list->Reset(queueReadback.alloc, NULL); - queueReadback.list->CopyBufferRegion(queueReadback.readbackBuf, 0, res, 0, size); + Unwrap(queueReadback.list) + ->CopyBufferRegion(queueReadback.unwrappedReadbackBuf, 0, res->GetReal(), 0, size); queueReadback.list->Close(); ID3D12CommandList *listptr = Unwrap(queueReadback.list); queueReadback.unwrappedQueue->ExecuteCommandLists(1, &listptr); diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 99e0c4632..8c7e30d2b 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -4468,10 +4468,10 @@ void QueueReadbackData::Resize(uint64_t size) if(readbackSize >= size && size != 0) return; - if(readbackBuf) + if(unwrappedReadbackBuf) { - Unwrap(readbackBuf)->Unmap(0, NULL); - SAFE_RELEASE(readbackBuf); + unwrappedReadbackBuf->Unmap(0, NULL); + SAFE_RELEASE(unwrappedReadbackBuf); readbackMapped = NULL; } @@ -4502,11 +4502,12 @@ void QueueReadbackData::Resize(uint64_t size) heapProps.CreationNodeMask = 1; heapProps.VisibleNodeMask = 1; - device->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &readbackDesc, - D3D12_RESOURCE_STATE_COPY_DEST, NULL, __uuidof(ID3D12Resource), - (void **)&readbackBuf); - // don't intercept the map - Unwrap(readbackBuf)->Map(0, NULL, (void **)&readbackMapped); + // create this unwrapped to avoid intercepting the map during capture or having locking issues + // when creating this resource + device->GetReal()->CreateCommittedResource( + &heapProps, D3D12_HEAP_FLAG_NONE, &readbackDesc, D3D12_RESOURCE_STATE_COPY_DEST, NULL, + __uuidof(ID3D12Resource), (void **)&unwrappedReadbackBuf); + unwrappedReadbackBuf->Map(0, NULL, (void **)&readbackMapped); } void WrappedID3D12Device::CreateInternalResources() diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index ee63a89a6..e25a168aa 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -74,7 +74,7 @@ DECLARE_REFLECTION_STRUCT(D3D12InitParams); struct QueueReadbackData { Threading::CriticalSection lock; - ID3D12Resource *readbackBuf = NULL; + ID3D12Resource *unwrappedReadbackBuf = NULL; byte *readbackMapped = NULL; uint64_t readbackSize = 0;