SamplerDescriptor.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using Ryujinx.Graphics.GAL;
  2. using Ryujinx.Graphics.GAL.Sampler;
  3. namespace Ryujinx.Graphics.Gpu.Image
  4. {
  5. struct SamplerDescriptor
  6. {
  7. private static readonly float[] _f5ToF32ConversionLut = new float[]
  8. {
  9. 0.0f,
  10. 0.055555556f,
  11. 0.1f,
  12. 0.13636364f,
  13. 0.16666667f,
  14. 0.1923077f,
  15. 0.21428572f,
  16. 0.23333333f,
  17. 0.25f,
  18. 0.2777778f,
  19. 0.3f,
  20. 0.3181818f,
  21. 0.33333334f,
  22. 0.34615386f,
  23. 0.35714287f,
  24. 0.36666667f,
  25. 0.375f,
  26. 0.3888889f,
  27. 0.4f,
  28. 0.4090909f,
  29. 0.41666666f,
  30. 0.42307693f,
  31. 0.42857143f,
  32. 0.43333334f,
  33. 0.4375f,
  34. 0.44444445f,
  35. 0.45f,
  36. 0.45454547f,
  37. 0.45833334f,
  38. 0.46153846f,
  39. 0.4642857f,
  40. 0.46666667f
  41. };
  42. private static readonly float[] _maxAnisotropyLut = new float[]
  43. {
  44. 1, 2, 4, 6, 8, 10, 12, 16
  45. };
  46. private const float Frac8ToF32 = 1.0f / 256.0f;
  47. public uint Word0;
  48. public uint Word1;
  49. public uint Word2;
  50. public uint Word3;
  51. public uint BorderColorR;
  52. public uint BorderColorG;
  53. public uint BorderColorB;
  54. public uint BorderColorA;
  55. public AddressMode UnpackAddressU()
  56. {
  57. return (AddressMode)(Word0 & 7);
  58. }
  59. public AddressMode UnpackAddressV()
  60. {
  61. return (AddressMode)((Word0 >> 3) & 7);
  62. }
  63. public AddressMode UnpackAddressP()
  64. {
  65. return (AddressMode)((Word0 >> 6) & 7);
  66. }
  67. public CompareMode UnpackCompareMode()
  68. {
  69. return (CompareMode)((Word0 >> 9) & 1);
  70. }
  71. public CompareOp UnpackCompareOp()
  72. {
  73. return (CompareOp)(((Word0 >> 10) & 7) + 1);
  74. }
  75. public float UnpackMaxAnisotropy()
  76. {
  77. return _maxAnisotropyLut[(Word0 >> 20) & 7];
  78. }
  79. public MagFilter UnpackMagFilter()
  80. {
  81. return (MagFilter)(Word1 & 3);
  82. }
  83. public MinFilter UnpackMinFilter()
  84. {
  85. SamplerMinFilter minFilter = (SamplerMinFilter)((Word1 >> 4) & 3);
  86. SamplerMipFilter mipFilter = (SamplerMipFilter)((Word1 >> 6) & 3);
  87. return ConvertFilter(minFilter, mipFilter);
  88. }
  89. private static MinFilter ConvertFilter(SamplerMinFilter minFilter, SamplerMipFilter mipFilter)
  90. {
  91. switch (mipFilter)
  92. {
  93. case SamplerMipFilter.None:
  94. switch (minFilter)
  95. {
  96. case SamplerMinFilter.Nearest: return MinFilter.Nearest;
  97. case SamplerMinFilter.Linear: return MinFilter.Linear;
  98. }
  99. break;
  100. case SamplerMipFilter.Nearest:
  101. switch (minFilter)
  102. {
  103. case SamplerMinFilter.Nearest: return MinFilter.NearestMipmapNearest;
  104. case SamplerMinFilter.Linear: return MinFilter.LinearMipmapNearest;
  105. }
  106. break;
  107. case SamplerMipFilter.Linear:
  108. switch (minFilter)
  109. {
  110. case SamplerMinFilter.Nearest: return MinFilter.NearestMipmapLinear;
  111. case SamplerMinFilter.Linear: return MinFilter.LinearMipmapLinear;
  112. }
  113. break;
  114. }
  115. return MinFilter.Nearest;
  116. }
  117. public ReductionFilter UnpackReductionFilter()
  118. {
  119. return (ReductionFilter)((Word1 >> 10) & 3);
  120. }
  121. public float UnpackMipLodBias()
  122. {
  123. int fixedValue = (int)(Word1 >> 12) & 0x1fff;
  124. fixedValue = (fixedValue << 19) >> 19;
  125. return fixedValue * Frac8ToF32;
  126. }
  127. public float UnpackLodSnap()
  128. {
  129. return _f5ToF32ConversionLut[(Word1 >> 26) & 0x1f];
  130. }
  131. public float UnpackMinLod()
  132. {
  133. return (Word2 & 0xfff) * Frac8ToF32;
  134. }
  135. public float UnpackMaxLod()
  136. {
  137. return ((Word2 >> 12) & 0xfff) * Frac8ToF32;
  138. }
  139. }
  140. }