SizeInfo.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Ryujinx.Common;
  2. using System;
  3. namespace Ryujinx.Graphics.Texture
  4. {
  5. public struct SizeInfo
  6. {
  7. private int[] _mipOffsets;
  8. private int[] _allOffsets;
  9. private int _levels;
  10. public int LayerSize { get; }
  11. public int TotalSize { get; }
  12. public SizeInfo(
  13. int[] mipOffsets,
  14. int[] allOffsets,
  15. int levels,
  16. int layerSize,
  17. int totalSize)
  18. {
  19. _mipOffsets = mipOffsets;
  20. _allOffsets = allOffsets;
  21. _levels = levels;
  22. LayerSize = layerSize;
  23. TotalSize = totalSize;
  24. }
  25. public int GetMipOffset(int level)
  26. {
  27. if ((uint)level > _mipOffsets.Length)
  28. {
  29. throw new ArgumentOutOfRangeException(nameof(level));
  30. }
  31. return _mipOffsets[level];
  32. }
  33. public bool FindView(int offset, int size, out int firstLayer, out int firstLevel)
  34. {
  35. int index = Array.BinarySearch(_allOffsets, offset);
  36. if (index < 0)
  37. {
  38. firstLayer = 0;
  39. firstLevel = 0;
  40. return false;
  41. }
  42. firstLayer = index / _levels;
  43. firstLevel = index - (firstLayer * _levels);
  44. return true;
  45. }
  46. }
  47. }