From 45a6d5fb5bffd8726f8c79fae785410fb82a4f13 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 29 Jun 2021 13:31:53 +0200 Subject: [PATCH] [dxvk] Fix potential undesired host-visible buffer invalidation We cannot invalidate mapped buffers in the backend because the frontend may cache the mapped slice from its own invalidations, which would then become invalid. Very unlikely to be an issue in practice. --- src/dxvk/dxvk_context.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 54cbace54..53b19e08c 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1417,6 +1417,9 @@ namespace dxvk { void DxvkContext::discardBuffer( const Rc& buffer) { + if (buffer->memFlags() & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) + return; + if (m_execBarriers.isBufferDirty(buffer->getSliceHandle(), DxvkAccess::Write)) this->invalidateBuffer(buffer, buffer->allocSlice()); } @@ -2133,8 +2136,11 @@ namespace dxvk { VkDeviceSize offset, VkDeviceSize size, const void* data) { + bool isHostVisible = buffer->memFlags() & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; + bool replaceBuffer = (size == buffer->info().size) - && (size <= (1 << 20)); /* 1 MB */ + && (size <= (1 << 20)) + && !isHostVisible; DxvkBufferSliceHandle bufferSlice; DxvkCmdBuffer cmdBuffer;