From 52d62bb7de64cf0aa07edbcc8e77007f52b11e88 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 13 Nov 2024 15:33:21 +0000 Subject: [PATCH] Try to minimise redundant barriers with resources with many subresources --- renderdoc/driver/d3d12/d3d12_common.cpp | 30 +++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_common.cpp b/renderdoc/driver/d3d12/d3d12_common.cpp index 87a287995..376e09c81 100644 --- a/renderdoc/driver/d3d12/d3d12_common.cpp +++ b/renderdoc/driver/d3d12/d3d12_common.cpp @@ -161,8 +161,22 @@ void BarrierSet::Configure(ID3D12Resource *res, const SubresourceStateVector &st break; } - barriers.reserve(states.size()); - newBarriers.reserve(states.size()); + bool different = false; + for(size_t i = 1; i < states.size(); i++) + { + if(states[i] != states[0]) + { + different = true; + break; + } + } + + if(different) + { + barriers.reserve(states.size()); + newBarriers.reserve(states.size()); + } + for(size_t i = 0; i < states.size(); i++) { if(states[i].IsStates()) @@ -183,7 +197,13 @@ void BarrierSet::Configure(ID3D12Resource *res, const SubresourceStateVector &st b.Transition.Subresource = (UINT)i; b.Transition.StateAfter = resourceState; + if(!different) + b.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barriers.push_back(b); + + if(!different) + break; } // buffers don't need any transitions with the new layouts else if(!isBuffer) @@ -213,7 +233,13 @@ void BarrierSet::Configure(ID3D12Resource *res, const SubresourceStateVector &st b.Subresources.IndexOrFirstMipLevel = (UINT)i; b.pResource = res; + if(!different) + b.Subresources.IndexOrFirstMipLevel = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + newBarriers.push_back(b); + + if(!different) + break; } } }