SpirvDelegates.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. using FuncUnaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction>;
  2. using FuncBinaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction>;
  3. using FuncTernaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction>;
  4. using FuncQuaternaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction>;
  5. namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
  6. {
  7. /// <summary>
  8. /// Delegate cache for SPIR-V instruction generators. Avoids delegate allocation when passing generators as arguments.
  9. /// </summary>
  10. internal struct SpirvDelegates
  11. {
  12. // Unary
  13. public readonly FuncUnaryInstruction GlslFAbs;
  14. public readonly FuncUnaryInstruction GlslSAbs;
  15. public readonly FuncUnaryInstruction GlslCeil;
  16. public readonly FuncUnaryInstruction GlslCos;
  17. public readonly FuncUnaryInstruction GlslExp2;
  18. public readonly FuncUnaryInstruction GlslFloor;
  19. public readonly FuncUnaryInstruction GlslLog2;
  20. public readonly FuncUnaryInstruction FNegate;
  21. public readonly FuncUnaryInstruction SNegate;
  22. public readonly FuncUnaryInstruction GlslInverseSqrt;
  23. public readonly FuncUnaryInstruction GlslRoundEven;
  24. public readonly FuncUnaryInstruction GlslSin;
  25. public readonly FuncUnaryInstruction GlslSqrt;
  26. public readonly FuncUnaryInstruction GlslTrunc;
  27. // UnaryBool
  28. public readonly FuncUnaryInstruction LogicalNot;
  29. // UnaryFP32
  30. public readonly FuncUnaryInstruction DPdx;
  31. public readonly FuncUnaryInstruction DPdy;
  32. // UnaryS32
  33. public readonly FuncUnaryInstruction BitCount;
  34. public readonly FuncUnaryInstruction BitReverse;
  35. public readonly FuncUnaryInstruction Not;
  36. // Compare
  37. public readonly FuncBinaryInstruction FOrdEqual;
  38. public readonly FuncBinaryInstruction IEqual;
  39. public readonly FuncBinaryInstruction FOrdGreaterThan;
  40. public readonly FuncBinaryInstruction SGreaterThan;
  41. public readonly FuncBinaryInstruction FOrdGreaterThanEqual;
  42. public readonly FuncBinaryInstruction SGreaterThanEqual;
  43. public readonly FuncBinaryInstruction FOrdLessThan;
  44. public readonly FuncBinaryInstruction SLessThan;
  45. public readonly FuncBinaryInstruction FOrdLessThanEqual;
  46. public readonly FuncBinaryInstruction SLessThanEqual;
  47. public readonly FuncBinaryInstruction FOrdNotEqual;
  48. public readonly FuncBinaryInstruction INotEqual;
  49. // CompareU32
  50. public readonly FuncBinaryInstruction UGreaterThanEqual;
  51. public readonly FuncBinaryInstruction UGreaterThan;
  52. public readonly FuncBinaryInstruction ULessThanEqual;
  53. public readonly FuncBinaryInstruction ULessThan;
  54. // Binary
  55. public readonly FuncBinaryInstruction FAdd;
  56. public readonly FuncBinaryInstruction IAdd;
  57. public readonly FuncBinaryInstruction FDiv;
  58. public readonly FuncBinaryInstruction SDiv;
  59. public readonly FuncBinaryInstruction GlslFMax;
  60. public readonly FuncBinaryInstruction GlslSMax;
  61. public readonly FuncBinaryInstruction GlslFMin;
  62. public readonly FuncBinaryInstruction GlslSMin;
  63. public readonly FuncBinaryInstruction FMul;
  64. public readonly FuncBinaryInstruction IMul;
  65. public readonly FuncBinaryInstruction FSub;
  66. public readonly FuncBinaryInstruction ISub;
  67. // BinaryBool
  68. public readonly FuncBinaryInstruction LogicalAnd;
  69. public readonly FuncBinaryInstruction LogicalNotEqual;
  70. public readonly FuncBinaryInstruction LogicalOr;
  71. // BinaryS32
  72. public readonly FuncBinaryInstruction BitwiseAnd;
  73. public readonly FuncBinaryInstruction BitwiseXor;
  74. public readonly FuncBinaryInstruction BitwiseOr;
  75. public readonly FuncBinaryInstruction ShiftLeftLogical;
  76. public readonly FuncBinaryInstruction ShiftRightArithmetic;
  77. public readonly FuncBinaryInstruction ShiftRightLogical;
  78. // BinaryU32
  79. public readonly FuncBinaryInstruction GlslUMax;
  80. public readonly FuncBinaryInstruction GlslUMin;
  81. // AtomicMemoryBinary
  82. public readonly FuncQuaternaryInstruction AtomicIAdd;
  83. public readonly FuncQuaternaryInstruction AtomicAnd;
  84. public readonly FuncQuaternaryInstruction AtomicSMin;
  85. public readonly FuncQuaternaryInstruction AtomicUMin;
  86. public readonly FuncQuaternaryInstruction AtomicSMax;
  87. public readonly FuncQuaternaryInstruction AtomicUMax;
  88. public readonly FuncQuaternaryInstruction AtomicOr;
  89. public readonly FuncQuaternaryInstruction AtomicExchange;
  90. public readonly FuncQuaternaryInstruction AtomicXor;
  91. // Ternary
  92. public readonly FuncTernaryInstruction GlslFClamp;
  93. public readonly FuncTernaryInstruction GlslSClamp;
  94. public readonly FuncTernaryInstruction GlslFma;
  95. // TernaryS32
  96. public readonly FuncTernaryInstruction BitFieldSExtract;
  97. public readonly FuncTernaryInstruction BitFieldUExtract;
  98. // TernaryU32
  99. public readonly FuncTernaryInstruction GlslUClamp;
  100. // QuaternaryS32
  101. public readonly FuncQuaternaryInstruction BitFieldInsert;
  102. public SpirvDelegates(CodeGenContext context)
  103. {
  104. // Unary
  105. GlslFAbs = context.GlslFAbs;
  106. GlslSAbs = context.GlslSAbs;
  107. GlslCeil = context.GlslCeil;
  108. GlslCos = context.GlslCos;
  109. GlslExp2 = context.GlslExp2;
  110. GlslFloor = context.GlslFloor;
  111. GlslLog2 = context.GlslLog2;
  112. FNegate = context.FNegate;
  113. SNegate = context.SNegate;
  114. GlslInverseSqrt = context.GlslInverseSqrt;
  115. GlslRoundEven = context.GlslRoundEven;
  116. GlslSin = context.GlslSin;
  117. GlslSqrt = context.GlslSqrt;
  118. GlslTrunc = context.GlslTrunc;
  119. // UnaryBool
  120. LogicalNot = context.LogicalNot;
  121. // UnaryFP32
  122. DPdx = context.DPdx;
  123. DPdy = context.DPdy;
  124. // UnaryS32
  125. BitCount = context.BitCount;
  126. BitReverse = context.BitReverse;
  127. Not = context.Not;
  128. // Compare
  129. FOrdEqual = context.FOrdEqual;
  130. IEqual = context.IEqual;
  131. FOrdGreaterThan = context.FOrdGreaterThan;
  132. SGreaterThan = context.SGreaterThan;
  133. FOrdGreaterThanEqual = context.FOrdGreaterThanEqual;
  134. SGreaterThanEqual = context.SGreaterThanEqual;
  135. FOrdLessThan = context.FOrdLessThan;
  136. SLessThan = context.SLessThan;
  137. FOrdLessThanEqual = context.FOrdLessThanEqual;
  138. SLessThanEqual = context.SLessThanEqual;
  139. FOrdNotEqual = context.FOrdNotEqual;
  140. INotEqual = context.INotEqual;
  141. // CompareU32
  142. UGreaterThanEqual = context.UGreaterThanEqual;
  143. UGreaterThan = context.UGreaterThan;
  144. ULessThanEqual = context.ULessThanEqual;
  145. ULessThan = context.ULessThan;
  146. // Binary
  147. FAdd = context.FAdd;
  148. IAdd = context.IAdd;
  149. FDiv = context.FDiv;
  150. SDiv = context.SDiv;
  151. GlslFMax = context.GlslFMax;
  152. GlslSMax = context.GlslSMax;
  153. GlslFMin = context.GlslFMin;
  154. GlslSMin = context.GlslSMin;
  155. FMul = context.FMul;
  156. IMul = context.IMul;
  157. FSub = context.FSub;
  158. ISub = context.ISub;
  159. // BinaryBool
  160. LogicalAnd = context.LogicalAnd;
  161. LogicalNotEqual = context.LogicalNotEqual;
  162. LogicalOr = context.LogicalOr;
  163. // BinaryS32
  164. BitwiseAnd = context.BitwiseAnd;
  165. BitwiseXor = context.BitwiseXor;
  166. BitwiseOr = context.BitwiseOr;
  167. ShiftLeftLogical = context.ShiftLeftLogical;
  168. ShiftRightArithmetic = context.ShiftRightArithmetic;
  169. ShiftRightLogical = context.ShiftRightLogical;
  170. // BinaryU32
  171. GlslUMax = context.GlslUMax;
  172. GlslUMin = context.GlslUMin;
  173. // AtomicMemoryBinary
  174. AtomicIAdd = context.AtomicIAdd;
  175. AtomicAnd = context.AtomicAnd;
  176. AtomicSMin = context.AtomicSMin;
  177. AtomicUMin = context.AtomicUMin;
  178. AtomicSMax = context.AtomicSMax;
  179. AtomicUMax = context.AtomicUMax;
  180. AtomicOr = context.AtomicOr;
  181. AtomicExchange = context.AtomicExchange;
  182. AtomicXor = context.AtomicXor;
  183. // Ternary
  184. GlslFClamp = context.GlslFClamp;
  185. GlslSClamp = context.GlslSClamp;
  186. GlslFma = context.GlslFma;
  187. // TernaryS32
  188. BitFieldSExtract = context.BitFieldSExtract;
  189. BitFieldUExtract = context.BitFieldUExtract;
  190. // TernaryU32
  191. GlslUClamp = context.GlslUClamp;
  192. // QuaternaryS32
  193. BitFieldInsert = context.BitFieldInsert;
  194. }
  195. }
  196. }