diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 151756c07..183a1a8a7 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 97617109e..a5e2ab98f 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 46860b1c2..35735957a 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 *