Address feedback

This commit is contained in:
ReinUsesLisp 2018-09-23 18:21:06 -03:00
parent f88a7a8596
commit ca09e7f537
3 changed files with 25 additions and 43 deletions

View file

@ -30,19 +30,11 @@ namespace Ryujinx.Graphics.Gal.OpenGL
ResourcePool<TKey, TValue>.CreateValue CreateValueCallback,
ResourcePool<TKey, TValue>.DeleteValue DeleteValueCallback)
{
if (CreateValueCallback == null)
{
throw new ArgumentNullException(nameof(CreateValueCallback));
}
if (DeleteValueCallback == null)
{
throw new ArgumentNullException(nameof(DeleteValueCallback));
}
Cache = new Dictionary<long, CacheBucket>();
Pool = new ResourcePool<TKey, TValue>(CreateValueCallback, DeleteValueCallback);
Pool = new ResourcePool<TKey, TValue>(
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;
}

View file

@ -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)

View file

@ -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<TValue>)> Entries;
private LinkedList<(TKey, LinkedList<TValue>)> Entries;
private Queue<(TValue, List<TValue>)> SortedCache;
private Queue<(TValue, LinkedList<TValue>)> 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<TValue>)>();
Entries = new LinkedList<(TKey, LinkedList<TValue>)>();
SortedCache = new Queue<(TValue, List<TValue>)>();
SortedCache = new Queue<(TValue, LinkedList<TValue>)>();
}
public TValue CreateOrRecycle(TKey Params)
{
List<TValue> Family = GetOrAddEntry(Params);
LinkedList<TValue> 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<TValue> Family) Tuple))
if (!SortedCache.TryDequeue(out (TValue Resource, LinkedList<TValue> Siblings) Tuple))
{
break;
}
TValue Resource = Tuple.Resource;
List<TValue> Family = Tuple.Family;
(TValue Resource, LinkedList <TValue> 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<TValue> GetOrAddEntry(TKey Params)
private LinkedList<TValue> GetOrAddEntry(TKey Params)
{
foreach ((TKey MyParams, List<TValue> Resources) in Entries)
foreach ((TKey MyParams, LinkedList<TValue> Resources) in Entries)
{
if (MyParams.IsCompatible(Params))
{
@ -131,11 +129,11 @@ namespace Ryujinx.Graphics
}
}
List<TValue> Family = new List<TValue>();
LinkedList<TValue> Siblings = new LinkedList<TValue>();
Entries.Add((Params, Family));
Entries.AddFirst((Params, Siblings));
return Family;
return Siblings;
}
private static int RingDelta(int Old, int New)