From 753806d52624145d96aae8d41ff15dca3b2dce26 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 25 Aug 2020 17:24:23 +0100 Subject: [PATCH] Add a specialisation for buffer reference add/remove * This skips some potentially expensive (and redundant) checks if the buffer is a view. --- renderdoc/driver/d3d11/d3d11_renderstate.cpp | 32 ++++++++++++++++++++ renderdoc/driver/d3d11/d3d11_renderstate.h | 3 ++ 2 files changed, 35 insertions(+) diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.cpp b/renderdoc/driver/d3d11/d3d11_renderstate.cpp index 41c54a177..b6852049d 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.cpp +++ b/renderdoc/driver/d3d11/d3d11_renderstate.cpp @@ -601,6 +601,38 @@ void D3D11RenderState::ReleaseRef(ID3D11DeviceChild *p) } } +// these are overloads that take a buffer to skip the view IsAlloc checks + +void D3D11RenderState::TakeRef(ID3D11Buffer *p) +{ + if(p) + { + p->AddRef(); + if(m_ImmediatePipeline) + { + m_pDevice->InternalRef(); + + // see above + ((WrappedDeviceChild11 *)p)->PipelineAddRef(); + } + } +} + +void D3D11RenderState::ReleaseRef(ID3D11Buffer *p) +{ + if(p) + { + p->Release(); + if(m_ImmediatePipeline) + { + m_pDevice->InternalRelease(); + + // see above + ((WrappedDeviceChild11 *)p)->PipelineRelease(); + } + } +} + bool D3D11RenderState::IsRangeBoundForWrite(const ResourceRange &range) { for(UINT i = 0; i < D3D11_1_UAV_SLOT_COUNT; i++) diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.h b/renderdoc/driver/d3d11/d3d11_renderstate.h index b067f8721..31cbe1cec 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.h +++ b/renderdoc/driver/d3d11/d3d11_renderstate.h @@ -97,6 +97,9 @@ struct D3D11RenderState void TakeRef(ID3D11DeviceChild *p); void ReleaseRef(ID3D11DeviceChild *p); + void TakeRef(ID3D11Buffer *p); + void ReleaseRef(ID3D11Buffer *p); + template void ChangeRefRead(T *&stateItem, T *newItem) {