From 1df6c07f78c4c3b8c7fc679d7466f79a10c2d496 Mon Sep 17 00:00:00 2001 From: gdkchan <gab.dark.100@gmail.com> Date: Mon, 4 Dec 2023 16:30:19 -0300 Subject: Implement support for multi-range buffers using Vulkan sparse mappings (#5427) * Pass MultiRange to BufferManager * Implement support for multi-range buffers using Vulkan sparse mappings * Use multi-range for remaining buffers, delete old methods * Assume that more buffers are contiguous * Dispose multi-range buffers after they are removed from the list * Properly init BufferBounds for constant and storage buffers * Do not try reading zero bytes data from an unmapped address on the shader cache + PR feedback * Fix misaligned sparse buffer offsets * Null check can be simplified * PR feedback --- src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs') diff --git a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs index 6af12de1..5e19bddc 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs @@ -39,6 +39,11 @@ namespace Ryujinx.Graphics.Gpu.Memory /// </summary> internal PhysicalMemory Physical { get; } + /// <summary> + /// Virtual buffer cache. + /// </summary> + internal VirtualBufferCache VirtualBufferCache { get; } + /// <summary> /// Cache of GPU counters. /// </summary> @@ -51,10 +56,12 @@ namespace Ryujinx.Graphics.Gpu.Memory internal MemoryManager(PhysicalMemory physicalMemory) { Physical = physicalMemory; + VirtualBufferCache = new VirtualBufferCache(this); CounterCache = new CounterCache(); _pageTable = new ulong[PtLvl0Size][]; MemoryUnmapped += Physical.TextureCache.MemoryUnmappedHandler; MemoryUnmapped += Physical.BufferCache.MemoryUnmappedHandler; + MemoryUnmapped += VirtualBufferCache.MemoryUnmappedHandler; MemoryUnmapped += CounterCache.MemoryUnmappedHandler; } @@ -508,6 +515,11 @@ namespace Ryujinx.Graphics.Gpu.Memory regionSize += Math.Min(endVa - va, PageSize); } + if (regions.Count == 0) + { + return new MultiRange(regionStart, regionSize); + } + regions.Add(new MemoryRange(regionStart, regionSize)); return new MultiRange(regions.ToArray()); -- cgit v1.2.3-70-g09d2