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  }