diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 602f94f3c..bfa944013 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -1687,11 +1687,8 @@ void WrappedID3D12GraphicsCommandList::SetComputeRootDescriptorTable( if(!RenderDoc::Inst().GetCaptureOptions().refAllResources) { - rdcarray &descs = m_ListRecord->cmdInfo->boundDescs; - - descs.reserve(descs.size() + num); - for(UINT d = 0; d < num; d++) - descs.push_back(rangeStart + d); + rdcarray> &descs = m_ListRecord->cmdInfo->boundDescs; + descs.push_back(make_rdcpair(rangeStart, num)); } prevTableOffset = offset + num; @@ -2251,11 +2248,8 @@ void WrappedID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable( if(!RenderDoc::Inst().GetCaptureOptions().refAllResources) { - rdcarray &descs = m_ListRecord->cmdInfo->boundDescs; - - descs.reserve(descs.size() + num); - for(UINT d = 0; d < num; d++) - descs.push_back(rangeStart + d); + rdcarray> &descs = m_ListRecord->cmdInfo->boundDescs; + descs.push_back(make_rdcpair(rangeStart, num)); } prevTableOffset = offset + num; diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index 2138a7a74..e90ad1948 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -421,23 +421,27 @@ void WrappedID3D12CommandQueue::ExecuteCommandListsInternal(UINT NumCommandLists for(auto it = record->bakedCommands->cmdInfo->boundDescs.begin(); it != record->bakedCommands->cmdInfo->boundDescs.end(); ++it) { - D3D12Descriptor *desc = *it; - - ResourceId id, id2; - FrameRefType ref = eFrameRef_Read; - - desc->GetRefIDs(id, id2, ref); - - if(id != ResourceId()) + rdcpair &descRange = *it; + for(UINT d = 0; d < descRange.second; ++d) { - refdIDs.insert(id); - GetResourceManager()->MarkResourceFrameReferenced(id, ref); - } + D3D12Descriptor *desc = descRange.first + d; - if(id2 != ResourceId()) - { - refdIDs.insert(id2); - GetResourceManager()->MarkResourceFrameReferenced(id2, ref); + ResourceId id, id2; + FrameRefType ref = eFrameRef_Read; + + desc->GetRefIDs(id, id2, ref); + + if(id != ResourceId()) + { + refdIDs.insert(id); + GetResourceManager()->MarkResourceFrameReferenced(id, ref); + } + + if(id2 != ResourceId()) + { + refdIDs.insert(id2); + GetResourceManager()->MarkResourceFrameReferenced(id2, ref); + } } } diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index a13d93485..6fb13e796 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -426,11 +426,14 @@ struct CmdListRecordingInfo // a list of descriptors that are bound at any point in this command list // used to look up all the frame refs per-descriptor and apply them on queue // submit with latest binding refs. + // This stores the start of the range and the number of descriptors, and full + // traversal occurs during queue submit, to avoid perf issues during regular + // application operation. // We allow duplicates in here since it's a better tradeoff to let the vector // expand a bit more to contain duplicates and then deal with it during frame // capture, than to constantly be deduplicating during record (e.g. with a // set or sorted vector). - rdcarray boundDescs; + rdcarray> boundDescs; // bundles executed rdcarray bundles;