SpanRef.cs 951 B

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