SpanRef.cs
1 using System; 2 3 namespace Ryujinx.Graphics.GAL.Multithreading.Model 4 { 5 readonly struct SpanRef<T> where T : unmanaged 6 { 7 private readonly int _packedLengthId; 8 9 public SpanRef(ThreadedRenderer renderer, T[] data) 10 { 11 _packedLengthId = -(renderer.AddTableRef(data) + 1); 12 } 13 14 public SpanRef(int length) 15 { 16 _packedLengthId = length; 17 } 18 19 public Span<T> Get(ThreadedRenderer renderer) 20 { 21 if (_packedLengthId >= 0) 22 { 23 return renderer.SpanPool.Get<T>(_packedLengthId); 24 } 25 else 26 { 27 return new Span<T>((T[])renderer.RemoveTableRef(-(_packedLengthId + 1))); 28 } 29 } 30 31 public void Dispose(ThreadedRenderer renderer) 32 { 33 if (_packedLengthId > 0) 34 { 35 renderer.SpanPool.Dispose<T>(_packedLengthId); 36 } 37 } 38 } 39 }