ComputeParams.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. using Ryujinx.Graphics.Gpu.State;
  2. using System;
  3. using System.Runtime.InteropServices;
  4. namespace Ryujinx.Graphics.Gpu.Engine
  5. {
  6. /// <summary>
  7. /// Compute uniform buffer parameters.
  8. /// </summary>
  9. struct UniformBufferParams
  10. {
  11. public int AddressLow;
  12. public int AddressHighAndSize;
  13. /// <summary>
  14. /// Packs the split address to a 64-bits integer.
  15. /// </summary>
  16. /// <returns>Uniform buffer GPU virtual address</returns>
  17. public ulong PackAddress()
  18. {
  19. return (uint)AddressLow | ((ulong)(AddressHighAndSize & 0xff) << 32);
  20. }
  21. /// <summary>
  22. /// Unpacks the uniform buffer size in bytes.
  23. /// </summary>
  24. /// <returns>Uniform buffer size in bytes</returns>
  25. public ulong UnpackSize()
  26. {
  27. return (ulong)((AddressHighAndSize >> 15) & 0x1ffff);
  28. }
  29. }
  30. /// <summary>
  31. /// Compute dispatch parameters.
  32. /// </summary>
  33. struct ComputeParams
  34. {
  35. public int Unknown0;
  36. public int Unknown1;
  37. public int Unknown2;
  38. public int Unknown3;
  39. public int Unknown4;
  40. public int Unknown5;
  41. public int Unknown6;
  42. public int Unknown7;
  43. public int ShaderOffset;
  44. public int Unknown9;
  45. public int Unknown10;
  46. public SamplerIndex SamplerIndex;
  47. public int GridSizeX;
  48. public int GridSizeYZ;
  49. public int Unknown14;
  50. public int Unknown15;
  51. public int Unknown16;
  52. public int SharedMemorySize;
  53. public int BlockSizeX;
  54. public int BlockSizeYZ;
  55. public int UniformBuffersConfig;
  56. public int Unknown21;
  57. public int Unknown22;
  58. public int Unknown23;
  59. public int Unknown24;
  60. public int Unknown25;
  61. public int Unknown26;
  62. public int Unknown27;
  63. public int Unknown28;
  64. private UniformBufferParams _uniformBuffer0;
  65. private UniformBufferParams _uniformBuffer1;
  66. private UniformBufferParams _uniformBuffer2;
  67. private UniformBufferParams _uniformBuffer3;
  68. private UniformBufferParams _uniformBuffer4;
  69. private UniformBufferParams _uniformBuffer5;
  70. private UniformBufferParams _uniformBuffer6;
  71. private UniformBufferParams _uniformBuffer7;
  72. /// <summary>
  73. /// Uniform buffer parameters.
  74. /// </summary>
  75. public Span<UniformBufferParams> UniformBuffers
  76. {
  77. get
  78. {
  79. return MemoryMarshal.CreateSpan(ref _uniformBuffer0, 8);
  80. }
  81. }
  82. public int Unknown45;
  83. public int Unknown46;
  84. public int Unknown47;
  85. public int Unknown48;
  86. public int Unknown49;
  87. public int Unknown50;
  88. public int Unknown51;
  89. public int Unknown52;
  90. public int Unknown53;
  91. public int Unknown54;
  92. public int Unknown55;
  93. public int Unknown56;
  94. public int Unknown57;
  95. public int Unknown58;
  96. public int Unknown59;
  97. public int Unknown60;
  98. public int Unknown61;
  99. public int Unknown62;
  100. public int Unknown63;
  101. /// <summary>
  102. /// Unpacks the work group X size.
  103. /// </summary>
  104. /// <returns>Work group X size</returns>
  105. public int UnpackGridSizeX()
  106. {
  107. return GridSizeX & 0x7fffffff;
  108. }
  109. /// <summary>
  110. /// Unpacks the work group Y size.
  111. /// </summary>
  112. /// <returns>Work group Y size</returns>
  113. public int UnpackGridSizeY()
  114. {
  115. return GridSizeYZ & 0xffff;
  116. }
  117. /// <summary>
  118. /// Unpacks the work group Z size.
  119. /// </summary>
  120. /// <returns>Work group Z size</returns>
  121. public int UnpackGridSizeZ()
  122. {
  123. return (GridSizeYZ >> 16) & 0xffff;
  124. }
  125. /// <summary>
  126. /// Unpacks the local group X size.
  127. /// </summary>
  128. /// <returns>Local group X size</returns>
  129. public int UnpackBlockSizeX()
  130. {
  131. return (BlockSizeX >> 16) & 0xffff;
  132. }
  133. /// <summary>
  134. /// Unpacks the local group Y size.
  135. /// </summary>
  136. /// <returns>Local group Y size</returns>
  137. public int UnpackBlockSizeY()
  138. {
  139. return BlockSizeYZ & 0xffff;
  140. }
  141. /// <summary>
  142. /// Unpacks the local group Z size.
  143. /// </summary>
  144. /// <returns>Local group Z size</returns>
  145. public int UnpackBlockSizeZ()
  146. {
  147. return (BlockSizeYZ >> 16) & 0xffff;
  148. }
  149. /// <summary>
  150. /// Unpacks the uniform buffers enable mask.
  151. /// Each bit set on the mask indicates that the respective buffer index is enabled.
  152. /// </summary>
  153. /// <returns>Uniform buffers enable mask</returns>
  154. public uint UnpackUniformBuffersEnableMask()
  155. {
  156. return (uint)UniformBuffersConfig & 0xff;
  157. }
  158. }
  159. }