Add a specialisation for buffer reference add/remove

* This skips some potentially expensive (and redundant) checks if the buffer is
  a view.
This commit is contained in:
baldurk
2020-08-25 17:24:23 +01:00
parent f013824f97
commit 753806d526
2 changed files with 35 additions and 0 deletions
@@ -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<ID3D11Buffer> *)p)->PipelineAddRef();
}
}
}
void D3D11RenderState::ReleaseRef(ID3D11Buffer *p)
{
if(p)
{
p->Release();
if(m_ImmediatePipeline)
{
m_pDevice->InternalRelease();
// see above
((WrappedDeviceChild11<ID3D11Buffer> *)p)->PipelineRelease();
}
}
}
bool D3D11RenderState::IsRangeBoundForWrite(const ResourceRange &range)
{
for(UINT i = 0; i < D3D11_1_UAV_SLOT_COUNT; i++)
@@ -97,6 +97,9 @@ struct D3D11RenderState
void TakeRef(ID3D11DeviceChild *p);
void ReleaseRef(ID3D11DeviceChild *p);
void TakeRef(ID3D11Buffer *p);
void ReleaseRef(ID3D11Buffer *p);
template <typename T>
void ChangeRefRead(T *&stateItem, T *newItem)
{