diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/BufferHolder.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/BufferHolder.cs | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Vulkan/BufferHolder.cs b/Ryujinx.Graphics.Vulkan/BufferHolder.cs index f449c102..20571253 100644 --- a/Ryujinx.Graphics.Vulkan/BufferHolder.cs +++ b/Ryujinx.Graphics.Vulkan/BufferHolder.cs @@ -109,12 +109,34 @@ namespace Ryujinx.Graphics.Vulkan { if (isWrite) { - _cachedConvertedBuffers.Clear(); + SignalWrite(0, Size); + } + + return _buffer; + } + + public Auto<DisposableBuffer> GetBuffer(CommandBuffer commandBuffer, int offset, int size, bool isWrite = false) + { + if (isWrite) + { + SignalWrite(offset, size); } return _buffer; } + public void SignalWrite(int offset, int size) + { + if (offset == 0 && size == Size) + { + _cachedConvertedBuffers.Clear(); + } + else + { + _cachedConvertedBuffers.ClearRange(offset, size); + } + } + public BufferHandle GetHandle() { var handle = _bufferHandle; @@ -183,6 +205,8 @@ namespace Ryujinx.Graphics.Vulkan data.Slice(0, dataSize).CopyTo(new Span<byte>((void*)(_map + offset), dataSize)); + SignalWrite(offset, dataSize); + return; } } @@ -240,7 +264,7 @@ namespace Ryujinx.Graphics.Vulkan endRenderPass?.Invoke(); - var dstBuffer = GetBuffer(cbs.CommandBuffer, true).Get(cbs, dstOffset, data.Length).Value; + var dstBuffer = GetBuffer(cbs.CommandBuffer, dstOffset, data.Length, true).Get(cbs, dstOffset, data.Length).Value; InsertBufferBarrier( _gd, @@ -364,7 +388,7 @@ namespace Ryujinx.Graphics.Vulkan public Auto<DisposableBuffer> GetBufferI8ToI16(CommandBufferScoped cbs, int offset, int size) { - var key = new I8ToI16CacheKey(); + var key = new I8ToI16CacheKey(_gd); if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder)) { @@ -373,6 +397,8 @@ namespace Ryujinx.Graphics.Vulkan _gd.PipelineInternal.EndRenderPass(); _gd.HelperShader.ConvertI8ToI16(_gd, cbs, this, holder, offset, size); + key.SetBuffer(holder.GetBuffer()); + _cachedConvertedBuffers.Add(offset, size, key, holder); } @@ -417,6 +443,8 @@ namespace Ryujinx.Graphics.Vulkan _gd.PipelineInternal.EndRenderPass(); _gd.HelperShader.ConvertIndexBuffer(_gd, cbs, this, holder, pattern, indexSize, offset, indexCount); + key.SetBuffer(holder.GetBuffer()); + _cachedConvertedBuffers.Add(offset, size, key, holder); } |