From f013824f9749c7d44c316c37b548eadf0e55460c Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 25 Aug 2020 16:16:39 +0100 Subject: [PATCH] Cache D3D11 buffers being read-only to speed up bound-for-write checks --- renderdoc/driver/d3d11/d3d11_renderstate.cpp | 3 +++ renderdoc/driver/d3d11/d3d11_resources.h | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.cpp b/renderdoc/driver/d3d11/d3d11_renderstate.cpp index 0ffc59959..41c54a177 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.cpp +++ b/renderdoc/driver/d3d11/d3d11_renderstate.cpp @@ -1292,6 +1292,9 @@ bool D3D11RenderState::IsBoundForWrite(ID3D11Buffer *buffer) if(buffer == NULL) return false; + if(((WrappedID3D11Buffer *)buffer)->ReadOnly()) + return false; + return IsRangeBoundForWrite(ResourceRange(buffer)); } diff --git a/renderdoc/driver/d3d11/d3d11_resources.h b/renderdoc/driver/d3d11/d3d11_resources.h index 2f9641e67..8cabef50b 100644 --- a/renderdoc/driver/d3d11/d3d11_resources.h +++ b/renderdoc/driver/d3d11/d3d11_resources.h @@ -440,6 +440,8 @@ public: class WrappedID3D11Buffer : public WrappedResource11 { + bool m_ReadOnly = false; + public: struct BufferEntry { @@ -464,6 +466,15 @@ public: RDCASSERT(m_BufferList.find(GetResourceID()) == m_BufferList.end()); m_BufferList[GetResourceID()] = BufferEntry(this, byteLength); } + + if(real) + { + D3D11_BUFFER_DESC desc = {}; + real->GetDesc(&desc); + + m_ReadOnly = ((desc.BindFlags & (D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_STREAM_OUTPUT | + D3D11_BIND_RENDER_TARGET | D3D11_BIND_DEPTH_STENCIL)) == 0); + } } virtual ~WrappedID3D11Buffer() @@ -484,6 +495,8 @@ public: if(pResourceDimension) *pResourceDimension = D3D11_RESOURCE_DIMENSION_BUFFER; } + + bool ReadOnly() { return m_ReadOnly; } }; template