diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs | 64 |
1 files changed, 9 insertions, 55 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs b/Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs index 99c5a88b..0017f4cc 100644 --- a/Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs +++ b/Ryujinx.Graphics.Gpu/Image/TexturePoolCache.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - namespace Ryujinx.Graphics.Gpu.Image { /// <summary> @@ -8,69 +5,26 @@ namespace Ryujinx.Graphics.Gpu.Image /// This can keep multiple texture pools, and return the current one as needed. /// It is useful for applications that uses multiple texture pools. /// </summary> - class TexturePoolCache + class TexturePoolCache : PoolCache<TexturePool> { - private const int MaxCapacity = 4; - - private readonly GpuContext _context; - private readonly LinkedList<TexturePool> _pools; - /// <summary> /// Constructs a new instance of the texture pool. /// </summary> /// <param name="context">GPU context that the texture pool belongs to</param> - public TexturePoolCache(GpuContext context) + public TexturePoolCache(GpuContext context) : base(context) { - _context = context; - _pools = new LinkedList<TexturePool>(); } /// <summary> - /// Finds a cache texture pool, or creates a new one if not found. + /// Creates a new instance of the texture pool. /// </summary> - /// <param name="channel">GPU channel that the texture pool cache belongs to</param> - /// <param name="address">Start address of the texture pool</param> - /// <param name="maximumId">Maximum ID of the texture pool</param> - /// <returns>The found or newly created texture pool</returns> - public TexturePool FindOrCreate(GpuChannel channel, ulong address, int maximumId) + /// <param name="context">GPU context that the texture pool belongs to</param> + /// <param name="channel">GPU channel that the texture pool belongs to</param> + /// <param name="address">Address of the texture pool in guest memory</param> + /// <param name="maximumId">Maximum texture ID of the texture pool (equal to maximum textures minus one)</param> + protected override TexturePool CreatePool(GpuContext context, GpuChannel channel, ulong address, int maximumId) { - TexturePool pool; - - // First we try to find the pool. - for (LinkedListNode<TexturePool> node = _pools.First; node != null; node = node.Next) - { - pool = node.Value; - - if (pool.Address == address) - { - if (pool.CacheNode != _pools.Last) - { - _pools.Remove(pool.CacheNode); - - pool.CacheNode = _pools.AddLast(pool); - } - - return pool; - } - } - - // If not found, create a new one. - pool = new TexturePool(_context, channel, address, maximumId); - - pool.CacheNode = _pools.AddLast(pool); - - if (_pools.Count > MaxCapacity) - { - TexturePool oldestPool = _pools.First.Value; - - _pools.RemoveFirst(); - - oldestPool.Dispose(); - - oldestPool.CacheNode = null; - } - - return pool; + return new TexturePool(context, channel, address, maximumId); } } }
\ No newline at end of file |