From fe66e668e5fde4c61df18a2e4baea4790b717625 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Fri, 3 Aug 2018 11:28:00 +0200 Subject: [PATCH] [dxvk] Implement native discardBuffer function in the backend This may be more efficient because it avoids renaming the buffer in case it can be used without inserting additional barriers. --- src/d3d11/d3d11_context.cpp | 3 +-- src/dxvk/dxvk_context.cpp | 11 +++++++++++ src/dxvk/dxvk_context.h | 12 ++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 151756c0..183a1a8a 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -2728,8 +2728,7 @@ namespace dxvk { void D3D11DeviceContext::DiscardBuffer( D3D11Buffer* pBuffer) { EmitCs([cBuffer = pBuffer->GetBuffer()] (DxvkContext* ctx) { - ctx->invalidateBuffer(cBuffer, - cBuffer->allocPhysicalSlice()); + ctx->discardBuffer(cBuffer); }); } diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 97617109..a5e2ab98 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -941,6 +941,17 @@ namespace dxvk { } + void DxvkContext::discardBuffer( + const Rc& buffer) { + DxvkAccessFlags accessFlags( + DxvkAccess::Read, + DxvkAccess::Write); + + if (m_barriers.isBufferDirty(buffer->slice(), accessFlags)) + this->invalidateBuffer(buffer, buffer->allocPhysicalSlice()); + } + + void DxvkContext::dispatch( uint32_t x, uint32_t y, diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 46860b1c..35735957 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -322,6 +322,18 @@ namespace dxvk { VkOffset3D srcOffset, VkExtent3D srcExtent); + /** + * \brief Discards a buffer + * + * Renames the buffer in case it is currently + * used by the GPU in order to avoid having to + * insert barriers before future commands using + * the buffer. + * \param [in] buffer The buffer to discard + */ + void discardBuffer( + const Rc& buffer); + /** * \brief Starts compute jobs *