SizeInfo.cs 1.6 KB

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