emit_spirv.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <sirit/sirit.h>
  6. #include "common/common_types.h"
  7. #include "shader_recompiler/backend/spirv/emit_context.h"
  8. #include "shader_recompiler/environment.h"
  9. #include "shader_recompiler/frontend/ir/microinstruction.h"
  10. #include "shader_recompiler/frontend/ir/program.h"
  11. #include "shader_recompiler/profile.h"
  12. namespace Shader::Backend::SPIRV {
  13. [[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, Environment& env,
  14. IR::Program& program);
  15. // Microinstruction emitters
  16. Id EmitPhi(EmitContext& ctx, IR::Inst* inst);
  17. void EmitVoid(EmitContext& ctx);
  18. Id EmitIdentity(EmitContext& ctx, const IR::Value& value);
  19. void EmitBranch(EmitContext& ctx, IR::Block* label);
  20. void EmitBranchConditional(EmitContext& ctx, Id condition, IR::Block* true_label,
  21. IR::Block* false_label);
  22. void EmitLoopMerge(EmitContext& ctx, IR::Block* merge_label, IR::Block* continue_label);
  23. void EmitSelectionMerge(EmitContext& ctx, IR::Block* merge_label);
  24. void EmitReturn(EmitContext& ctx);
  25. void EmitGetRegister(EmitContext& ctx);
  26. void EmitSetRegister(EmitContext& ctx);
  27. void EmitGetPred(EmitContext& ctx);
  28. void EmitSetPred(EmitContext& ctx);
  29. void EmitSetGotoVariable(EmitContext& ctx);
  30. void EmitGetGotoVariable(EmitContext& ctx);
  31. Id EmitGetCbuf(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  32. void EmitGetAttribute(EmitContext& ctx);
  33. void EmitSetAttribute(EmitContext& ctx);
  34. void EmitGetAttributeIndexed(EmitContext& ctx);
  35. void EmitSetAttributeIndexed(EmitContext& ctx);
  36. void EmitGetZFlag(EmitContext& ctx);
  37. void EmitGetSFlag(EmitContext& ctx);
  38. void EmitGetCFlag(EmitContext& ctx);
  39. void EmitGetOFlag(EmitContext& ctx);
  40. void EmitSetZFlag(EmitContext& ctx);
  41. void EmitSetSFlag(EmitContext& ctx);
  42. void EmitSetCFlag(EmitContext& ctx);
  43. void EmitSetOFlag(EmitContext& ctx);
  44. Id EmitWorkgroupId(EmitContext& ctx);
  45. Id EmitLocalInvocationId(EmitContext& ctx);
  46. Id EmitUndefU1(EmitContext& ctx);
  47. Id EmitUndefU8(EmitContext& ctx);
  48. Id EmitUndefU16(EmitContext& ctx);
  49. Id EmitUndefU32(EmitContext& ctx);
  50. Id EmitUndefU64(EmitContext& ctx);
  51. void EmitLoadGlobalU8(EmitContext& ctx);
  52. void EmitLoadGlobalS8(EmitContext& ctx);
  53. void EmitLoadGlobalU16(EmitContext& ctx);
  54. void EmitLoadGlobalS16(EmitContext& ctx);
  55. void EmitLoadGlobal32(EmitContext& ctx);
  56. void EmitLoadGlobal64(EmitContext& ctx);
  57. void EmitLoadGlobal128(EmitContext& ctx);
  58. void EmitWriteGlobalU8(EmitContext& ctx);
  59. void EmitWriteGlobalS8(EmitContext& ctx);
  60. void EmitWriteGlobalU16(EmitContext& ctx);
  61. void EmitWriteGlobalS16(EmitContext& ctx);
  62. void EmitWriteGlobal32(EmitContext& ctx);
  63. void EmitWriteGlobal64(EmitContext& ctx);
  64. void EmitWriteGlobal128(EmitContext& ctx);
  65. void EmitLoadStorageU8(EmitContext& ctx);
  66. void EmitLoadStorageS8(EmitContext& ctx);
  67. void EmitLoadStorageU16(EmitContext& ctx);
  68. void EmitLoadStorageS16(EmitContext& ctx);
  69. Id EmitLoadStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  70. void EmitLoadStorage64(EmitContext& ctx);
  71. void EmitLoadStorage128(EmitContext& ctx);
  72. void EmitWriteStorageU8(EmitContext& ctx);
  73. void EmitWriteStorageS8(EmitContext& ctx);
  74. void EmitWriteStorageU16(EmitContext& ctx);
  75. void EmitWriteStorageS16(EmitContext& ctx);
  76. void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  77. Id value);
  78. void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  79. Id value);
  80. void EmitWriteStorage128(EmitContext& ctx);
  81. Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
  82. Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  83. Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  84. Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
  85. Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
  86. Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
  87. void EmitCompositeConstructF16x2(EmitContext& ctx);
  88. void EmitCompositeConstructF16x3(EmitContext& ctx);
  89. void EmitCompositeConstructF16x4(EmitContext& ctx);
  90. Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
  91. Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
  92. Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
  93. void EmitCompositeConstructF32x2(EmitContext& ctx);
  94. void EmitCompositeConstructF32x3(EmitContext& ctx);
  95. void EmitCompositeConstructF32x4(EmitContext& ctx);
  96. Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
  97. Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
  98. Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);
  99. void EmitCompositeConstructF64x2(EmitContext& ctx);
  100. void EmitCompositeConstructF64x3(EmitContext& ctx);
  101. void EmitCompositeConstructF64x4(EmitContext& ctx);
  102. void EmitCompositeExtractF64x2(EmitContext& ctx);
  103. void EmitCompositeExtractF64x3(EmitContext& ctx);
  104. void EmitCompositeExtractF64x4(EmitContext& ctx);
  105. void EmitSelect8(EmitContext& ctx);
  106. void EmitSelect16(EmitContext& ctx);
  107. Id EmitSelect32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  108. void EmitSelect64(EmitContext& ctx);
  109. void EmitBitCastU16F16(EmitContext& ctx);
  110. Id EmitBitCastU32F32(EmitContext& ctx, Id value);
  111. void EmitBitCastU64F64(EmitContext& ctx);
  112. void EmitBitCastF16U16(EmitContext& ctx);
  113. Id EmitBitCastF32U32(EmitContext& ctx, Id value);
  114. void EmitBitCastF64U64(EmitContext& ctx);
  115. void EmitPackUint2x32(EmitContext& ctx);
  116. Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
  117. Id EmitPackFloat2x16(EmitContext& ctx, Id value);
  118. Id EmitUnpackFloat2x16(EmitContext& ctx, Id value);
  119. Id EmitPackHalf2x16(EmitContext& ctx, Id value);
  120. Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
  121. Id EmitPackDouble2x32(EmitContext& ctx, Id value);
  122. Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
  123. void EmitGetZeroFromOp(EmitContext& ctx);
  124. void EmitGetSignFromOp(EmitContext& ctx);
  125. void EmitGetCarryFromOp(EmitContext& ctx);
  126. void EmitGetOverflowFromOp(EmitContext& ctx);
  127. Id EmitFPAbs16(EmitContext& ctx, Id value);
  128. Id EmitFPAbs32(EmitContext& ctx, Id value);
  129. Id EmitFPAbs64(EmitContext& ctx, Id value);
  130. Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  131. Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  132. Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  133. Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  134. Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  135. Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  136. void EmitFPMax32(EmitContext& ctx);
  137. void EmitFPMax64(EmitContext& ctx);
  138. void EmitFPMin32(EmitContext& ctx);
  139. void EmitFPMin64(EmitContext& ctx);
  140. Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  141. Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  142. Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  143. Id EmitFPNeg16(EmitContext& ctx, Id value);
  144. Id EmitFPNeg32(EmitContext& ctx, Id value);
  145. Id EmitFPNeg64(EmitContext& ctx, Id value);
  146. void EmitFPRecip32(EmitContext& ctx);
  147. void EmitFPRecip64(EmitContext& ctx);
  148. void EmitFPRecipSqrt32(EmitContext& ctx);
  149. void EmitFPRecipSqrt64(EmitContext& ctx);
  150. void EmitFPSqrt(EmitContext& ctx);
  151. void EmitFPSin(EmitContext& ctx);
  152. void EmitFPSinNotReduced(EmitContext& ctx);
  153. void EmitFPExp2(EmitContext& ctx);
  154. void EmitFPExp2NotReduced(EmitContext& ctx);
  155. void EmitFPCos(EmitContext& ctx);
  156. void EmitFPCosNotReduced(EmitContext& ctx);
  157. void EmitFPLog2(EmitContext& ctx);
  158. Id EmitFPSaturate16(EmitContext& ctx, Id value);
  159. Id EmitFPSaturate32(EmitContext& ctx, Id value);
  160. Id EmitFPSaturate64(EmitContext& ctx, Id value);
  161. Id EmitFPRoundEven16(EmitContext& ctx, Id value);
  162. Id EmitFPRoundEven32(EmitContext& ctx, Id value);
  163. Id EmitFPRoundEven64(EmitContext& ctx, Id value);
  164. Id EmitFPFloor16(EmitContext& ctx, Id value);
  165. Id EmitFPFloor32(EmitContext& ctx, Id value);
  166. Id EmitFPFloor64(EmitContext& ctx, Id value);
  167. Id EmitFPCeil16(EmitContext& ctx, Id value);
  168. Id EmitFPCeil32(EmitContext& ctx, Id value);
  169. Id EmitFPCeil64(EmitContext& ctx, Id value);
  170. Id EmitFPTrunc16(EmitContext& ctx, Id value);
  171. Id EmitFPTrunc32(EmitContext& ctx, Id value);
  172. Id EmitFPTrunc64(EmitContext& ctx, Id value);
  173. Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  174. void EmitIAdd64(EmitContext& ctx);
  175. Id EmitISub32(EmitContext& ctx, Id a, Id b);
  176. void EmitISub64(EmitContext& ctx);
  177. Id EmitIMul32(EmitContext& ctx, Id a, Id b);
  178. Id EmitINeg32(EmitContext& ctx, Id value);
  179. Id EmitIAbs32(EmitContext& ctx, Id value);
  180. Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
  181. void EmitShiftRightLogical32(EmitContext& ctx);
  182. void EmitShiftRightArithmetic32(EmitContext& ctx);
  183. Id EmitBitwiseAnd32(EmitContext& ctx, Id a, Id b);
  184. Id EmitBitwiseOr32(EmitContext& ctx, Id a, Id b);
  185. Id EmitBitwiseXor32(EmitContext& ctx, Id a, Id b);
  186. void EmitBitFieldInsert(EmitContext& ctx);
  187. void EmitBitFieldSExtract(EmitContext& ctx);
  188. Id EmitBitFieldUExtract(EmitContext& ctx, Id base, Id offset, Id count);
  189. Id EmitSLessThan(EmitContext& ctx, Id lhs, Id rhs);
  190. Id EmitULessThan(EmitContext& ctx, Id lhs, Id rhs);
  191. Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
  192. Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  193. Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  194. Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  195. Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  196. Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs);
  197. Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  198. Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  199. Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
  200. Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
  201. Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
  202. Id EmitLogicalNot(EmitContext& ctx, Id value);
  203. Id EmitConvertS16F16(EmitContext& ctx, Id value);
  204. Id EmitConvertS16F32(EmitContext& ctx, Id value);
  205. Id EmitConvertS16F64(EmitContext& ctx, Id value);
  206. Id EmitConvertS32F16(EmitContext& ctx, Id value);
  207. Id EmitConvertS32F32(EmitContext& ctx, Id value);
  208. Id EmitConvertS32F64(EmitContext& ctx, Id value);
  209. Id EmitConvertS64F16(EmitContext& ctx, Id value);
  210. Id EmitConvertS64F32(EmitContext& ctx, Id value);
  211. Id EmitConvertS64F64(EmitContext& ctx, Id value);
  212. Id EmitConvertU16F16(EmitContext& ctx, Id value);
  213. Id EmitConvertU16F32(EmitContext& ctx, Id value);
  214. Id EmitConvertU16F64(EmitContext& ctx, Id value);
  215. Id EmitConvertU32F16(EmitContext& ctx, Id value);
  216. Id EmitConvertU32F32(EmitContext& ctx, Id value);
  217. Id EmitConvertU32F64(EmitContext& ctx, Id value);
  218. Id EmitConvertU64F16(EmitContext& ctx, Id value);
  219. Id EmitConvertU64F32(EmitContext& ctx, Id value);
  220. Id EmitConvertU64F64(EmitContext& ctx, Id value);
  221. Id EmitConvertU64U32(EmitContext& ctx, Id value);
  222. Id EmitConvertU32U64(EmitContext& ctx, Id value);
  223. } // namespace Shader::Backend::SPIRV