SizeInfo.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. namespace Ryujinx.Graphics.Texture
  3. {
  4. public struct SizeInfo
  5. {
  6. private readonly int[] _mipOffsets;
  7. private readonly int _levels;
  8. private readonly int _depth;
  9. private readonly bool _is3D;
  10. public readonly int[] AllOffsets;
  11. public readonly int[] SliceSizes;
  12. public int LayerSize { get; }
  13. public int TotalSize { get; }
  14. public SizeInfo(int size)
  15. {
  16. _mipOffsets = new int[] { 0 };
  17. AllOffsets = new int[] { 0 };
  18. SliceSizes = new int[] { size };
  19. _depth = 1;
  20. _levels = 1;
  21. LayerSize = size;
  22. TotalSize = size;
  23. _is3D = false;
  24. }
  25. internal SizeInfo(
  26. int[] mipOffsets,
  27. int[] allOffsets,
  28. int[] sliceSizes,
  29. int depth,
  30. int levels,
  31. int layerSize,
  32. int totalSize,
  33. bool is3D)
  34. {
  35. _mipOffsets = mipOffsets;
  36. AllOffsets = allOffsets;
  37. SliceSizes = sliceSizes;
  38. _depth = depth;
  39. _levels = levels;
  40. LayerSize = layerSize;
  41. TotalSize = totalSize;
  42. _is3D = is3D;
  43. }
  44. public int GetMipOffset(int level)
  45. {
  46. if ((uint)level >= _mipOffsets.Length)
  47. {
  48. throw new ArgumentOutOfRangeException(nameof(level));
  49. }
  50. return _mipOffsets[level];
  51. }
  52. public bool FindView(int offset, out int firstLayer, out int firstLevel)
  53. {
  54. int index = Array.BinarySearch(AllOffsets, offset);
  55. if (index < 0)
  56. {
  57. firstLayer = 0;
  58. firstLevel = 0;
  59. return false;
  60. }
  61. if (_is3D)
  62. {
  63. firstLayer = index;
  64. firstLevel = 0;
  65. int levelDepth = _depth;
  66. while (firstLayer >= levelDepth)
  67. {
  68. firstLayer -= levelDepth;
  69. firstLevel++;
  70. levelDepth = Math.Max(levelDepth >> 1, 1);
  71. }
  72. }
  73. else
  74. {
  75. firstLayer = index / _levels;
  76. firstLevel = index - (firstLayer * _levels);
  77. }
  78. return true;
  79. }
  80. }
  81. }