From 8a2d483b402eaf1eab5c9cd1c1cc02532bccb7bf Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Mon, 17 Jun 2024 10:35:18 +0100 Subject: [PATCH] Update D3D12 ExecuteIndrect argOffset during replay This fixes D3D12_Execute_Indirect test failure Only add to m_Cmd->m_RayDispatches when ray tracing is active in the execute indirect --- renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 0df15d5ed..8cf349d33 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -4206,9 +4206,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( ID3D12Resource *argBuffer = Unwrap(patched.first); UINT64 argOffset = patched.second; - PatchedRayDispatch patchedDispatch = {}; if(comSig->sig.raytraced) { + PatchedRayDispatch patchedDispatch = {}; patchedDispatch = GetResourceManager()->GetRaytracingResourceAndUtilHandler()->PatchIndirectRayDispatch( Unwrap(pCommandList), state.heaps, comSig, MaxCommandCount, patched.first, @@ -4225,10 +4225,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( ->SetPipelineState1( Unwrap(GetResourceManager()->GetCurrentAs(state.stateobj))); state.ApplyComputeRootElementsUnwrapped(Unwrap(pCommandList)); + m_Cmd->m_RayDispatches.push_back(patchedDispatch.resources); } - m_Cmd->m_RayDispatches.push_back(patchedDispatch.resources); - if(m_Cmd->m_FirstEventID <= 1) { // if we're replaying part-way into a multidraw we just clamp the count @@ -4262,7 +4261,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( // fortunately ExecuteIndirect has no 'draw' builtin, so we can just offset the // argument buffer and set count to 1 count = 1; - patched.second += comSig->sig.ByteStride * execidx; + argOffset += comSig->sig.ByteStride * execidx; } } @@ -4308,9 +4307,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( ID3D12Resource *argBuffer = Unwrap(patched.first); UINT64 argOffset = patched.second; - PatchedRayDispatch patchedDispatch = {}; if(comSig->sig.raytraced) { + PatchedRayDispatch patchedDispatch = {}; patchedDispatch = GetResourceManager()->GetRaytracingResourceAndUtilHandler()->PatchIndirectRayDispatch( Unwrap(list), state.heaps, comSig, MaxCommandCount, patched.first, patched.second, @@ -4327,10 +4326,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( ->SetPipelineState1( Unwrap(GetResourceManager()->GetCurrentAs(state.stateobj))); state.ApplyComputeRootElementsUnwrapped(Unwrap(pCommandList)); + m_Cmd->m_RayDispatches.push_back(patchedDispatch.resources); } - m_Cmd->m_RayDispatches.push_back(patchedDispatch.resources); - Unwrap(list)->ExecuteIndirect(comSig->GetReal(), MaxCommandCount, argBuffer, argOffset, Unwrap(pCountBuffer), CountBufferOffset);