TextureCompatibility.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Ryujinx.Graphics.GAL;
  2. namespace Ryujinx.Graphics.Gpu.Image
  3. {
  4. static class TextureCompatibility
  5. {
  6. private enum FormatClass
  7. {
  8. Unclassified,
  9. BCn64,
  10. BCn128,
  11. Bc1Rgb,
  12. Bc1Rgba,
  13. Bc2,
  14. Bc3,
  15. Bc4,
  16. Bc5,
  17. Bc6,
  18. Bc7
  19. }
  20. public static bool FormatCompatible(FormatInfo lhs, FormatInfo rhs)
  21. {
  22. if (IsDsFormat(lhs.Format) || IsDsFormat(rhs.Format))
  23. {
  24. return lhs.Format == rhs.Format;
  25. }
  26. if (lhs.Format.IsAstc() || rhs.Format.IsAstc())
  27. {
  28. return lhs.Format == rhs.Format;
  29. }
  30. if (lhs.IsCompressed && rhs.IsCompressed)
  31. {
  32. FormatClass lhsClass = GetFormatClass(lhs.Format);
  33. FormatClass rhsClass = GetFormatClass(rhs.Format);
  34. return lhsClass == rhsClass;
  35. }
  36. else
  37. {
  38. return lhs.BytesPerPixel == rhs.BytesPerPixel;
  39. }
  40. }
  41. private static FormatClass GetFormatClass(Format format)
  42. {
  43. switch (format)
  44. {
  45. case Format.Bc1RgbSrgb:
  46. case Format.Bc1RgbUnorm:
  47. return FormatClass.Bc1Rgb;
  48. case Format.Bc1RgbaSrgb:
  49. case Format.Bc1RgbaUnorm:
  50. return FormatClass.Bc1Rgba;
  51. case Format.Bc2Srgb:
  52. case Format.Bc2Unorm:
  53. return FormatClass.Bc2;
  54. case Format.Bc3Srgb:
  55. case Format.Bc3Unorm:
  56. return FormatClass.Bc3;
  57. case Format.Bc4Snorm:
  58. case Format.Bc4Unorm:
  59. return FormatClass.Bc4;
  60. case Format.Bc5Snorm:
  61. case Format.Bc5Unorm:
  62. return FormatClass.Bc5;
  63. case Format.Bc6HSfloat:
  64. case Format.Bc6HUfloat:
  65. return FormatClass.Bc6;
  66. case Format.Bc7Srgb:
  67. case Format.Bc7Unorm:
  68. return FormatClass.Bc7;
  69. }
  70. return FormatClass.Unclassified;
  71. }
  72. private static bool IsDsFormat(Format format)
  73. {
  74. switch (format)
  75. {
  76. case Format.D16Unorm:
  77. case Format.D24X8Unorm:
  78. case Format.D24UnormS8Uint:
  79. case Format.D32Float:
  80. case Format.D32FloatS8Uint:
  81. return true;
  82. }
  83. return false;
  84. }
  85. }
  86. }