SamplerType.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Ryujinx.Graphics.Shader.StructuredIr;
  2. using System;
  3. namespace Ryujinx.Graphics.Shader
  4. {
  5. [Flags]
  6. public enum SamplerType
  7. {
  8. None = 0,
  9. Texture1D,
  10. TextureBuffer,
  11. Texture2D,
  12. Texture3D,
  13. TextureCube,
  14. Mask = 0xff,
  15. Array = 1 << 8,
  16. Indexed = 1 << 9,
  17. Multisample = 1 << 10,
  18. Shadow = 1 << 11
  19. }
  20. static class SamplerTypeExtensions
  21. {
  22. public static int GetDimensions(this SamplerType type)
  23. {
  24. switch (type & SamplerType.Mask)
  25. {
  26. case SamplerType.Texture1D: return 1;
  27. case SamplerType.TextureBuffer: return 1;
  28. case SamplerType.Texture2D: return 2;
  29. case SamplerType.Texture3D: return 3;
  30. case SamplerType.TextureCube: return 3;
  31. }
  32. throw new ArgumentException($"Invalid sampler type \"{type}\".");
  33. }
  34. public static string ToGlslSamplerType(this SamplerType type)
  35. {
  36. string typeName;
  37. switch (type & SamplerType.Mask)
  38. {
  39. case SamplerType.Texture1D: typeName = "sampler1D"; break;
  40. case SamplerType.TextureBuffer: typeName = "samplerBuffer"; break;
  41. case SamplerType.Texture2D: typeName = "sampler2D"; break;
  42. case SamplerType.Texture3D: typeName = "sampler3D"; break;
  43. case SamplerType.TextureCube: typeName = "samplerCube"; break;
  44. default: throw new ArgumentException($"Invalid sampler type \"{type}\".");
  45. }
  46. if ((type & SamplerType.Multisample) != 0)
  47. {
  48. typeName += "MS";
  49. }
  50. if ((type & SamplerType.Array) != 0)
  51. {
  52. typeName += "Array";
  53. }
  54. if ((type & SamplerType.Shadow) != 0)
  55. {
  56. typeName += "Shadow";
  57. }
  58. return typeName;
  59. }
  60. public static string ToGlslImageType(this SamplerType type, VariableType componentType)
  61. {
  62. string typeName;
  63. switch (type & SamplerType.Mask)
  64. {
  65. case SamplerType.Texture1D: typeName = "image1D"; break;
  66. case SamplerType.TextureBuffer: typeName = "imageBuffer"; break;
  67. case SamplerType.Texture2D: typeName = "image2D"; break;
  68. case SamplerType.Texture3D: typeName = "image3D"; break;
  69. case SamplerType.TextureCube: typeName = "imageCube"; break;
  70. default: throw new ArgumentException($"Invalid sampler type \"{type}\".");
  71. }
  72. if ((type & SamplerType.Multisample) != 0)
  73. {
  74. typeName += "MS";
  75. }
  76. if ((type & SamplerType.Array) != 0)
  77. {
  78. typeName += "Array";
  79. }
  80. switch (componentType)
  81. {
  82. case VariableType.U32: typeName = 'u' + typeName; break;
  83. case VariableType.S32: typeName = 'i' + typeName; break;
  84. }
  85. return typeName;
  86. }
  87. }
  88. }