From f8b25203dc4cb95b9353db0dbbcb9322a2550e96 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Sun, 18 May 2025 11:04:33 +0100 Subject: [PATCH] Fix D3D12 Pixel History ExecuteIndirect with multiple draws Update m_IndirectData.argsOffset inside the loop Clear the m_IndirectData outside of the loop Add not NULL assert for argsBuffer in ReplayDraw() helper --- renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp | 10 +++++----- renderdoc/driver/d3d12/d3d12_device.cpp | 1 + 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index e197eba22..2deafb279 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -4192,6 +4192,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( (pCountBuffer ? pCountBuffer->GetGPUVirtualAddress() : 0) + CountBufferOffset, MaxCommandCount); + m_Cmd->m_IndirectData.commandSig = pCommandSignature; m_Cmd->m_IndirectData.argsBuffer = patched.first; m_Cmd->m_IndirectData.argsOffset = patched.second; @@ -4223,7 +4224,6 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( for(uint32_t i = 0; i < countToReplay; i++) { - m_Cmd->m_IndirectData.commandSig = pCommandSignature; ActionFlags drawType = comSig->sig.graphics ? ActionFlags::Drawcall : ActionFlags::Dispatch; @@ -4253,12 +4253,12 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( } } - m_Cmd->m_IndirectData.commandSig = NULL; - m_Cmd->m_IndirectData.argsBuffer = NULL; - m_Cmd->m_IndirectData.argsOffset = 0; - argOffset += comSig->sig.ByteStride; + m_Cmd->m_IndirectData.argsOffset += comSig->sig.ByteStride; } + m_Cmd->m_IndirectData.commandSig = NULL; + m_Cmd->m_IndirectData.argsBuffer = NULL; + m_Cmd->m_IndirectData.argsOffset = 0; D3D12MarkerRegion::End(list); } diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 87768eaa8..6c26b7c5b 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -5595,6 +5595,7 @@ void WrappedID3D12Device::ReplayDraw(ID3D12GraphicsCommandListX *cmd, const Acti // TODO: support replay of draws not in callback D3D12CommandData *cmdData = m_Queue->GetCommandData(); RDCASSERT(cmdData->m_IndirectData.commandSig != NULL); + RDCASSERT(cmdData->m_IndirectData.argsBuffer != NULL); cmd->ExecuteIndirect(cmdData->m_IndirectData.commandSig, 1, cmdData->m_IndirectData.argsBuffer, cmdData->m_IndirectData.argsOffset, NULL, 0); }