From 1b28ecd63eb49917e3711eb7e06739ebe87e8f41 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Mon, 8 May 2023 11:45:12 +0100 Subject: Vulkan: Simplify MultiFenceHolder and managing them (#4845) * Vulkan: Simplify waitable add/remove Removal of unnecessary hashset and dictionary * Thread safety for GetBufferData in PersistentFlushBuffer * Fix WaitForFencesImpl thread safety * Proper methods for risky reference increments * Wrong type of CB. * Address feedback --- src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs') diff --git a/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs b/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs index fca13c31..fc98b68f 100644 --- a/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs +++ b/src/Ryujinx.Graphics.Vulkan/PersistentFlushBuffer.cs @@ -34,16 +34,26 @@ namespace Ryujinx.Graphics.Vulkan public Span GetBufferData(CommandBufferPool cbp, BufferHolder buffer, int offset, int size) { var flushStorage = ResizeIfNeeded(size); + Auto srcBuffer; using (var cbs = cbp.Rent()) { - var srcBuffer = buffer.GetBuffer(cbs.CommandBuffer); + srcBuffer = buffer.GetBuffer(cbs.CommandBuffer); var dstBuffer = flushStorage.GetBuffer(cbs.CommandBuffer); - BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, 0, size); + if (srcBuffer.TryIncrementReferenceCount()) + { + BufferHolder.Copy(_gd, cbs, srcBuffer, dstBuffer, offset, 0, size, registerSrcUsage: false); + } + else + { + // Source buffer is no longer alive, don't copy anything to flush storage. + srcBuffer = null; + } } flushStorage.WaitForFences(); + srcBuffer?.DecrementReferenceCount(); return flushStorage.GetDataStorage(0, size); } -- cgit v1.2.3