diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs index 3c74909f28..1aa94f0d49 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLCachedResource.cs @@ -30,19 +30,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL ResourcePool.CreateValue CreateValueCallback, ResourcePool.DeleteValue DeleteValueCallback) { - if (CreateValueCallback == null) - { - throw new ArgumentNullException(nameof(CreateValueCallback)); - } - - if (DeleteValueCallback == null) - { - throw new ArgumentNullException(nameof(DeleteValueCallback)); - } - Cache = new Dictionary(); - Pool = new ResourcePool(CreateValueCallback, DeleteValueCallback); + Pool = new ResourcePool( + CreateValueCallback ?? throw new ArgumentNullException(nameof(CreateValueCallback)), + DeleteValueCallback ?? throw new ArgumentNullException(nameof(DeleteValueCallback))); } public void Lock() @@ -82,7 +74,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL { Value = Bucket.Value; - Value.UpdateStamp(); + Value.UpdateTimestamp(); return true; } diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs index 4bcf60b8e4..2b9bb720a7 100644 --- a/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs +++ b/Ryujinx.Graphics/Gal/OpenGL/OGLRasterizer.cs @@ -101,11 +101,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL OGLStreamBuffer CachedBuffer = VboCache.CreateOrRecycle(Key, Params, (uint)DataSize); - IntPtr Length = new IntPtr(DataSize); - - GL.BindBuffer(BufferTarget.ArrayBuffer, CachedBuffer.Handle); - - GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, Length, HostAddress); + CachedBuffer.SetData(DataSize, HostAddress); } public void CreateIbo(long Key, int DataSize, IntPtr HostAddress) @@ -114,11 +110,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL OGLStreamBuffer CachedBuffer = IboCache.CreateOrRecycle(Key, Params, (uint)DataSize); - IntPtr Length = new IntPtr(DataSize); - - GL.BindBuffer(BufferTarget.ElementArrayBuffer, CachedBuffer.Handle); - - GL.BufferSubData(BufferTarget.ElementArrayBuffer, IntPtr.Zero, Length, HostAddress); + CachedBuffer.SetData(DataSize, HostAddress); } public void SetIndexArray(int Size, GalIndexFormat Format) diff --git a/Ryujinx.Graphics/ResourcePool.cs b/Ryujinx.Graphics/ResourcePool.cs index 48a426cbd6..0eb306eaee 100644 --- a/Ryujinx.Graphics/ResourcePool.cs +++ b/Ryujinx.Graphics/ResourcePool.cs @@ -14,14 +14,14 @@ namespace Ryujinx.Graphics public bool IsUsed { get; private set; } - public void UpdateStamp() + public void UpdateTimestamp() { Timestamp = Environment.TickCount; } public void MarkAsUsed() { - UpdateStamp(); + UpdateTimestamp(); IsUsed = true; } @@ -43,9 +43,9 @@ namespace Ryujinx.Graphics public delegate void DeleteValue(TValue Resource); - private List<(TKey, List)> Entries; + private LinkedList<(TKey, LinkedList)> Entries; - private Queue<(TValue, List)> SortedCache; + private Queue<(TValue, LinkedList)> SortedCache; private CreateValue CreateValueCallback; private DeleteValue DeleteValueCallback; @@ -55,16 +55,16 @@ namespace Ryujinx.Graphics this.CreateValueCallback = CreateValueCallback; this.DeleteValueCallback = DeleteValueCallback; - Entries = new List<(TKey, List)>(); + Entries = new LinkedList<(TKey, LinkedList)>(); - SortedCache = new Queue<(TValue, List)>(); + SortedCache = new Queue<(TValue, LinkedList)>(); } public TValue CreateOrRecycle(TKey Params) { - List Family = GetOrAddEntry(Params); + LinkedList Siblings = GetOrAddEntry(Params); - foreach (TValue RecycledValue in Family) + foreach (TValue RecycledValue in Siblings) { if (!RecycledValue.IsUsed) { @@ -78,9 +78,9 @@ namespace Ryujinx.Graphics Resource.MarkAsUsed(); - Family.Add(Resource); + Siblings.AddLast(Resource); - SortedCache.Enqueue((Resource, Family)); + SortedCache.Enqueue((Resource, Siblings)); return Resource; } @@ -91,14 +91,12 @@ namespace Ryujinx.Graphics for (int Count = 0; Count < MaxRemovalsPerRun; Count++) { - if (!SortedCache.TryDequeue(out (TValue Resource, List Family) Tuple)) + if (!SortedCache.TryDequeue(out (TValue Resource, LinkedList Siblings) Tuple)) { break; } - TValue Resource = Tuple.Resource; - - List Family = Tuple.Family; + (TValue Resource, LinkedList Siblings) = Tuple; if (!Resource.IsUsed) { @@ -106,7 +104,7 @@ namespace Ryujinx.Graphics if ((uint)TimeDelta > MaxTimeDelta) { - if (!Family.Remove(Resource)) + if (!Siblings.Remove(Resource)) { throw new InvalidOperationException(); } @@ -117,13 +115,13 @@ namespace Ryujinx.Graphics } } - SortedCache.Enqueue((Resource, Family)); + SortedCache.Enqueue((Resource, Siblings)); } } - private List GetOrAddEntry(TKey Params) + private LinkedList GetOrAddEntry(TKey Params) { - foreach ((TKey MyParams, List Resources) in Entries) + foreach ((TKey MyParams, LinkedList Resources) in Entries) { if (MyParams.IsCompatible(Params)) { @@ -131,11 +129,11 @@ namespace Ryujinx.Graphics } } - List Family = new List(); + LinkedList Siblings = new LinkedList(); - Entries.Add((Params, Family)); + Entries.AddFirst((Params, Siblings)); - return Family; + return Siblings; } private static int RingDelta(int Old, int New)