From 3d1e78ba172ccea84eddcf879f95a05d28297d0b Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 23 Sep 2025 10:16:03 +0100 Subject: [PATCH] Handle buffers created in new state with undefined layout * These can implicitly be transitioned to old states even though the spec says resources must go via COMMON - because there is no way to do that for new buffers. --- renderdoc/driver/d3d12/d3d12_manager.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_manager.cpp b/renderdoc/driver/d3d12/d3d12_manager.cpp index 38bf36a0c..b0068fb51 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.cpp +++ b/renderdoc/driver/d3d12/d3d12_manager.cpp @@ -3764,7 +3764,8 @@ void D3D12ResourceManager::ApplyBarriers(BarrierSet &barriers, void AddStateResetBarrier(D3D12ResourceLayout srcState, D3D12ResourceLayout dstState, ID3D12Resource *res, UINT subresource, BarrierSet &barriers) { - if(srcState.IsStates() && dstState.IsStates()) + if((srcState.IsStates() || srcState.ToLayout() == D3D12_BARRIER_LAYOUT_UNDEFINED) && + dstState.IsStates()) { D3D12_RESOURCE_BARRIER b; b.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; @@ -3774,7 +3775,12 @@ void AddStateResetBarrier(D3D12ResourceLayout srcState, D3D12ResourceLayout dstS b.Transition.StateBefore = srcState.ToStates(); b.Transition.StateAfter = dstState.ToStates(); - barriers.barriers.push_back(b); + if(srcState.ToLayout() == D3D12_BARRIER_LAYOUT_UNDEFINED) + b.Transition.StateBefore = D3D12_RESOURCE_STATE_COMMON; + + // could now be identical after silently promoting the before state. + if(b.Transition.StateBefore != b.Transition.StateAfter) + barriers.barriers.push_back(b); } else if(srcState.IsLayout() && dstState.IsLayout()) {