From 04f349cbe85d038efb0a6b8aa57573ef12ee07fe Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 26 Nov 2019 13:12:21 +0000 Subject: [PATCH] Don't transition pArgumentBuffer unless we need to * The buffer may be in an upload heap and be invalid to transition. --- .../driver/d3d12/d3d12_command_list_wrap.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 766a445dc..569f977e7 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -4214,20 +4214,27 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( // transition buffer to COPY_SOURCE/COPY_DEST, copy, and back to INDIRECT_ARG D3D12_RESOURCE_BARRIER barriers[2] = {}; - barriers[0].Transition.pResource = Unwrap(pArgumentBuffer); + barriers[0].Transition.pResource = Unwrap(exec.argBuf); barriers[0].Transition.StateBefore = D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT; - barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; - barriers[1].Transition.pResource = Unwrap(exec.argBuf); + barriers[0].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; + barriers[1].Transition.pResource = Unwrap(pArgumentBuffer); barriers[1].Transition.StateBefore = D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT; - barriers[1].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_DEST; - cracked->ResourceBarrier(2, barriers); + barriers[1].Transition.StateAfter = D3D12_RESOURCE_STATE_COPY_SOURCE; + + UINT barrierCount = 2; + + if(m_pDevice->GetSubresourceStates(GetResID(pArgumentBuffer))[0] & + D3D12_RESOURCE_STATE_COPY_SOURCE) + barrierCount = 1; + + cracked->ResourceBarrier(barrierCount, barriers); cracked->CopyBufferRegion(Unwrap(exec.argBuf), exec.argOffs, Unwrap(pArgumentBuffer), ArgumentBufferOffset, comSig->sig.ByteStride * MaxCommandCount); std::swap(barriers[0].Transition.StateBefore, barriers[0].Transition.StateAfter); std::swap(barriers[1].Transition.StateBefore, barriers[1].Transition.StateAfter); - cracked->ResourceBarrier(2, barriers); + cracked->ResourceBarrier(barrierCount, barriers); cracked->Close();