SpirvDelegates.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using FuncBinaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction, Spv.Generator.Instruction>;
  2. using FuncQuaternaryInstruction = System.Func<Spv.Generator.Instruction, Spv.Generator.Instruction, 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 FuncUnaryInstruction = System.Func<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 readonly 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 FMod;
  64. public readonly FuncBinaryInstruction FMul;
  65. public readonly FuncBinaryInstruction IMul;
  66. public readonly FuncBinaryInstruction FSub;
  67. public readonly FuncBinaryInstruction ISub;
  68. // BinaryBool
  69. public readonly FuncBinaryInstruction LogicalAnd;
  70. public readonly FuncBinaryInstruction LogicalNotEqual;
  71. public readonly FuncBinaryInstruction LogicalOr;
  72. // BinaryS32
  73. public readonly FuncBinaryInstruction BitwiseAnd;
  74. public readonly FuncBinaryInstruction BitwiseXor;
  75. public readonly FuncBinaryInstruction BitwiseOr;
  76. public readonly FuncBinaryInstruction ShiftLeftLogical;
  77. public readonly FuncBinaryInstruction ShiftRightArithmetic;
  78. public readonly FuncBinaryInstruction ShiftRightLogical;
  79. // BinaryU32
  80. public readonly FuncBinaryInstruction GlslUMax;
  81. public readonly FuncBinaryInstruction GlslUMin;
  82. // AtomicMemoryBinary
  83. public readonly FuncQuaternaryInstruction AtomicIAdd;
  84. public readonly FuncQuaternaryInstruction AtomicAnd;
  85. public readonly FuncQuaternaryInstruction AtomicSMin;
  86. public readonly FuncQuaternaryInstruction AtomicUMin;
  87. public readonly FuncQuaternaryInstruction AtomicSMax;
  88. public readonly FuncQuaternaryInstruction AtomicUMax;
  89. public readonly FuncQuaternaryInstruction AtomicOr;
  90. public readonly FuncQuaternaryInstruction AtomicExchange;
  91. public readonly FuncQuaternaryInstruction AtomicXor;
  92. // Ternary
  93. public readonly FuncTernaryInstruction GlslFClamp;
  94. public readonly FuncTernaryInstruction GlslSClamp;
  95. public readonly FuncTernaryInstruction GlslFma;
  96. // TernaryS32
  97. public readonly FuncTernaryInstruction BitFieldSExtract;
  98. public readonly FuncTernaryInstruction BitFieldUExtract;
  99. // TernaryU32
  100. public readonly FuncTernaryInstruction GlslUClamp;
  101. // QuaternaryS32
  102. public readonly FuncQuaternaryInstruction BitFieldInsert;
  103. public SpirvDelegates(CodeGenContext context)
  104. {
  105. // Unary
  106. GlslFAbs = context.GlslFAbs;
  107. GlslSAbs = context.GlslSAbs;
  108. GlslCeil = context.GlslCeil;
  109. GlslCos = context.GlslCos;
  110. GlslExp2 = context.GlslExp2;
  111. GlslFloor = context.GlslFloor;
  112. GlslLog2 = context.GlslLog2;
  113. FNegate = context.FNegate;
  114. SNegate = context.SNegate;
  115. GlslInverseSqrt = context.GlslInverseSqrt;
  116. GlslRoundEven = context.GlslRoundEven;
  117. GlslSin = context.GlslSin;
  118. GlslSqrt = context.GlslSqrt;
  119. GlslTrunc = context.GlslTrunc;
  120. // UnaryBool
  121. LogicalNot = context.LogicalNot;
  122. // UnaryFP32
  123. DPdx = context.DPdx;
  124. DPdy = context.DPdy;
  125. // UnaryS32
  126. BitCount = context.BitCount;
  127. BitReverse = context.BitReverse;
  128. Not = context.Not;
  129. // Compare
  130. FOrdEqual = context.FOrdEqual;
  131. IEqual = context.IEqual;
  132. FOrdGreaterThan = context.FOrdGreaterThan;
  133. SGreaterThan = context.SGreaterThan;
  134. FOrdGreaterThanEqual = context.FOrdGreaterThanEqual;
  135. SGreaterThanEqual = context.SGreaterThanEqual;
  136. FOrdLessThan = context.FOrdLessThan;
  137. SLessThan = context.SLessThan;
  138. FOrdLessThanEqual = context.FOrdLessThanEqual;
  139. SLessThanEqual = context.SLessThanEqual;
  140. FOrdNotEqual = context.FOrdNotEqual;
  141. INotEqual = context.INotEqual;
  142. // CompareU32
  143. UGreaterThanEqual = context.UGreaterThanEqual;
  144. UGreaterThan = context.UGreaterThan;
  145. ULessThanEqual = context.ULessThanEqual;
  146. ULessThan = context.ULessThan;
  147. // Binary
  148. FAdd = context.FAdd;
  149. IAdd = context.IAdd;
  150. FDiv = context.FDiv;
  151. SDiv = context.SDiv;
  152. GlslFMax = context.GlslFMax;
  153. GlslSMax = context.GlslSMax;
  154. GlslFMin = context.GlslFMin;
  155. GlslSMin = context.GlslSMin;
  156. FMod = context.FMod;
  157. FMul = context.FMul;
  158. IMul = context.IMul;
  159. FSub = context.FSub;
  160. ISub = context.ISub;
  161. // BinaryBool
  162. LogicalAnd = context.LogicalAnd;
  163. LogicalNotEqual = context.LogicalNotEqual;
  164. LogicalOr = context.LogicalOr;
  165. // BinaryS32
  166. BitwiseAnd = context.BitwiseAnd;
  167. BitwiseXor = context.BitwiseXor;
  168. BitwiseOr = context.BitwiseOr;
  169. ShiftLeftLogical = context.ShiftLeftLogical;
  170. ShiftRightArithmetic = context.ShiftRightArithmetic;
  171. ShiftRightLogical = context.ShiftRightLogical;
  172. // BinaryU32
  173. GlslUMax = context.GlslUMax;
  174. GlslUMin = context.GlslUMin;
  175. // AtomicMemoryBinary
  176. AtomicIAdd = context.AtomicIAdd;
  177. AtomicAnd = context.AtomicAnd;
  178. AtomicSMin = context.AtomicSMin;
  179. AtomicUMin = context.AtomicUMin;
  180. AtomicSMax = context.AtomicSMax;
  181. AtomicUMax = context.AtomicUMax;
  182. AtomicOr = context.AtomicOr;
  183. AtomicExchange = context.AtomicExchange;
  184. AtomicXor = context.AtomicXor;
  185. // Ternary
  186. GlslFClamp = context.GlslFClamp;
  187. GlslSClamp = context.GlslSClamp;
  188. GlslFma = context.GlslFma;
  189. // TernaryS32
  190. BitFieldSExtract = context.BitFieldSExtract;
  191. BitFieldUExtract = context.BitFieldUExtract;
  192. // TernaryU32
  193. GlslUClamp = context.GlslUClamp;
  194. // QuaternaryS32
  195. BitFieldInsert = context.BitFieldInsert;
  196. }
  197. }
  198. }