From 85ffd760161c6995f0004e042178d2e9259b2af5 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Wed, 14 Nov 2018 20:22:02 -0200 Subject: Force cache to remove entries when memory usage exceeds a given threshold (#492) --- Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs') diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs index efacb4d4..6e17872b 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs @@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL { public delegate void DeleteValue(T Value); - private const int MaxTimeDelta = 5 * 60000; + private const int MinTimeDelta = 5 * 60000; private const int MaxRemovalsPerRun = 10; private struct CacheBucket @@ -41,8 +41,13 @@ namespace Ryujinx.Graphics.Gal.OpenGL private bool Locked; - public OGLCachedResource(DeleteValue DeleteValueCallback) + private long MaxSize; + private long TotalSize; + + public OGLCachedResource(DeleteValue DeleteValueCallback, long MaxSize) { + this.MaxSize = MaxSize; + if (DeleteValueCallback == null) { throw new ArgumentNullException(nameof(DeleteValueCallback)); @@ -98,12 +103,16 @@ namespace Ryujinx.Graphics.Gal.OpenGL SortedCache.Remove(Bucket.Node); + TotalSize -= Bucket.DataSize; + Cache[Key] = NewBucket; } else { Cache.Add(Key, NewBucket); } + + TotalSize += Size; } public bool TryGetValue(long Key, out T Value) @@ -159,7 +168,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL long TimeDelta = Timestamp - Bucket.Timestamp; - if ((uint)TimeDelta <= (uint)MaxTimeDelta) + if (TimeDelta <= MinTimeDelta && !UnderMemoryPressure()) { break; } @@ -169,7 +178,14 @@ namespace Ryujinx.Graphics.Gal.OpenGL Cache.Remove(Node.Value); DeleteValueCallback(Bucket.Value); + + TotalSize -= Bucket.DataSize; } } + + private bool UnderMemoryPressure() + { + return TotalSize >= MaxSize; + } } } \ No newline at end of file -- cgit v1.2.3