emit_spirv.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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/frontend/ir/microinstruction.h"
  9. #include "shader_recompiler/frontend/ir/program.h"
  10. #include "shader_recompiler/profile.h"
  11. namespace Shader::Backend::SPIRV {
  12. [[nodiscard]] std::vector<u32> EmitSPIRV(const Profile& profile, IR::Program& program,
  13. u32& binding);
  14. // Microinstruction emitters
  15. Id EmitPhi(EmitContext& ctx, IR::Inst* inst);
  16. void EmitVoid(EmitContext& ctx);
  17. Id EmitIdentity(EmitContext& ctx, const IR::Value& value);
  18. void EmitBranch(EmitContext& ctx, Id label);
  19. void EmitBranchConditional(EmitContext& ctx, Id condition, Id true_label, Id false_label);
  20. void EmitLoopMerge(EmitContext& ctx, Id merge_label, Id continue_label);
  21. void EmitSelectionMerge(EmitContext& ctx, Id merge_label);
  22. void EmitReturn(EmitContext& ctx);
  23. void EmitUnreachable(EmitContext& ctx);
  24. void EmitDemoteToHelperInvocation(EmitContext& ctx, Id continue_label);
  25. void EmitMemoryBarrier(EmitContext& ctx, IR::Inst* inst);
  26. void EmitPrologue(EmitContext& ctx);
  27. void EmitEpilogue(EmitContext& ctx);
  28. void EmitGetRegister(EmitContext& ctx);
  29. void EmitSetRegister(EmitContext& ctx);
  30. void EmitGetPred(EmitContext& ctx);
  31. void EmitSetPred(EmitContext& ctx);
  32. void EmitSetGotoVariable(EmitContext& ctx);
  33. void EmitGetGotoVariable(EmitContext& ctx);
  34. void EmitSetIndirectBranchVariable(EmitContext& ctx);
  35. void EmitGetIndirectBranchVariable(EmitContext& ctx);
  36. Id EmitGetCbufU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  37. Id EmitGetCbufS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  38. Id EmitGetCbufU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  39. Id EmitGetCbufS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  40. Id EmitGetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  41. Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  42. Id EmitGetCbufU64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  43. Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr);
  44. void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value);
  45. void EmitGetAttributeIndexed(EmitContext& ctx);
  46. void EmitSetAttributeIndexed(EmitContext& ctx);
  47. void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value);
  48. void EmitSetFragDepth(EmitContext& ctx, Id value);
  49. void EmitGetZFlag(EmitContext& ctx);
  50. void EmitGetSFlag(EmitContext& ctx);
  51. void EmitGetCFlag(EmitContext& ctx);
  52. void EmitGetOFlag(EmitContext& ctx);
  53. void EmitSetZFlag(EmitContext& ctx);
  54. void EmitSetSFlag(EmitContext& ctx);
  55. void EmitSetCFlag(EmitContext& ctx);
  56. void EmitSetOFlag(EmitContext& ctx);
  57. void EmitGetFCSMFlag(EmitContext& ctx);
  58. void EmitGetTAFlag(EmitContext& ctx);
  59. void EmitGetTRFlag(EmitContext& ctx);
  60. void EmitGetMXFlag(EmitContext& ctx);
  61. void EmitSetFCSMFlag(EmitContext& ctx);
  62. void EmitSetTAFlag(EmitContext& ctx);
  63. void EmitSetTRFlag(EmitContext& ctx);
  64. void EmitSetMXFlag(EmitContext& ctx);
  65. Id EmitWorkgroupId(EmitContext& ctx);
  66. Id EmitLocalInvocationId(EmitContext& ctx);
  67. Id EmitLoadLocal(EmitContext& ctx, Id word_offset);
  68. void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value);
  69. Id EmitUndefU1(EmitContext& ctx);
  70. Id EmitUndefU8(EmitContext& ctx);
  71. Id EmitUndefU16(EmitContext& ctx);
  72. Id EmitUndefU32(EmitContext& ctx);
  73. Id EmitUndefU64(EmitContext& ctx);
  74. void EmitLoadGlobalU8(EmitContext& ctx);
  75. void EmitLoadGlobalS8(EmitContext& ctx);
  76. void EmitLoadGlobalU16(EmitContext& ctx);
  77. void EmitLoadGlobalS16(EmitContext& ctx);
  78. void EmitLoadGlobal32(EmitContext& ctx);
  79. void EmitLoadGlobal64(EmitContext& ctx);
  80. void EmitLoadGlobal128(EmitContext& ctx);
  81. void EmitWriteGlobalU8(EmitContext& ctx);
  82. void EmitWriteGlobalS8(EmitContext& ctx);
  83. void EmitWriteGlobalU16(EmitContext& ctx);
  84. void EmitWriteGlobalS16(EmitContext& ctx);
  85. void EmitWriteGlobal32(EmitContext& ctx);
  86. void EmitWriteGlobal64(EmitContext& ctx);
  87. void EmitWriteGlobal128(EmitContext& ctx);
  88. void EmitLoadStorageU8(EmitContext& ctx);
  89. void EmitLoadStorageS8(EmitContext& ctx);
  90. void EmitLoadStorageU16(EmitContext& ctx);
  91. void EmitLoadStorageS16(EmitContext& ctx);
  92. Id EmitLoadStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  93. Id EmitLoadStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  94. Id EmitLoadStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  95. void EmitWriteStorageU8(EmitContext& ctx);
  96. void EmitWriteStorageS8(EmitContext& ctx);
  97. void EmitWriteStorageU16(EmitContext& ctx);
  98. void EmitWriteStorageS16(EmitContext& ctx);
  99. void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  100. Id value);
  101. void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  102. Id value);
  103. void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  104. Id value);
  105. Id EmitLoadSharedU8(EmitContext& ctx, Id offset);
  106. Id EmitLoadSharedS8(EmitContext& ctx, Id offset);
  107. Id EmitLoadSharedU16(EmitContext& ctx, Id offset);
  108. Id EmitLoadSharedS16(EmitContext& ctx, Id offset);
  109. Id EmitLoadSharedU32(EmitContext& ctx, Id offset);
  110. Id EmitLoadSharedU64(EmitContext& ctx, Id offset);
  111. Id EmitLoadSharedU128(EmitContext& ctx, Id offset);
  112. void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value);
  113. void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value);
  114. void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value);
  115. void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value);
  116. void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value);
  117. Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
  118. Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  119. Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  120. Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
  121. Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
  122. Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
  123. Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index);
  124. Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index);
  125. Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index);
  126. Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2);
  127. Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  128. Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  129. Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
  130. Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
  131. Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
  132. Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index);
  133. Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index);
  134. Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index);
  135. Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2);
  136. Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  137. Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  138. Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
  139. Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
  140. Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);
  141. Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index);
  142. Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index);
  143. Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index);
  144. void EmitCompositeConstructF64x2(EmitContext& ctx);
  145. void EmitCompositeConstructF64x3(EmitContext& ctx);
  146. void EmitCompositeConstructF64x4(EmitContext& ctx);
  147. void EmitCompositeExtractF64x2(EmitContext& ctx);
  148. void EmitCompositeExtractF64x3(EmitContext& ctx);
  149. void EmitCompositeExtractF64x4(EmitContext& ctx);
  150. Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index);
  151. Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index);
  152. Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index);
  153. Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  154. Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  155. Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  156. Id EmitSelectU32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  157. Id EmitSelectU64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  158. Id EmitSelectF16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  159. Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  160. Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  161. void EmitBitCastU16F16(EmitContext& ctx);
  162. Id EmitBitCastU32F32(EmitContext& ctx, Id value);
  163. void EmitBitCastU64F64(EmitContext& ctx);
  164. void EmitBitCastF16U16(EmitContext& ctx);
  165. Id EmitBitCastF32U32(EmitContext& ctx, Id value);
  166. void EmitBitCastF64U64(EmitContext& ctx);
  167. Id EmitPackUint2x32(EmitContext& ctx, Id value);
  168. Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
  169. Id EmitPackFloat2x16(EmitContext& ctx, Id value);
  170. Id EmitUnpackFloat2x16(EmitContext& ctx, Id value);
  171. Id EmitPackHalf2x16(EmitContext& ctx, Id value);
  172. Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
  173. Id EmitPackDouble2x32(EmitContext& ctx, Id value);
  174. Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
  175. void EmitGetZeroFromOp(EmitContext& ctx);
  176. void EmitGetSignFromOp(EmitContext& ctx);
  177. void EmitGetCarryFromOp(EmitContext& ctx);
  178. void EmitGetOverflowFromOp(EmitContext& ctx);
  179. void EmitGetSparseFromOp(EmitContext& ctx);
  180. void EmitGetInBoundsFromOp(EmitContext& ctx);
  181. Id EmitFPAbs16(EmitContext& ctx, Id value);
  182. Id EmitFPAbs32(EmitContext& ctx, Id value);
  183. Id EmitFPAbs64(EmitContext& ctx, Id value);
  184. Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  185. Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  186. Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  187. Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  188. Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  189. Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  190. Id EmitFPMax32(EmitContext& ctx, Id a, Id b);
  191. Id EmitFPMax64(EmitContext& ctx, Id a, Id b);
  192. Id EmitFPMin32(EmitContext& ctx, Id a, Id b);
  193. Id EmitFPMin64(EmitContext& ctx, Id a, Id b);
  194. Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  195. Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  196. Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  197. Id EmitFPNeg16(EmitContext& ctx, Id value);
  198. Id EmitFPNeg32(EmitContext& ctx, Id value);
  199. Id EmitFPNeg64(EmitContext& ctx, Id value);
  200. Id EmitFPSin(EmitContext& ctx, Id value);
  201. Id EmitFPCos(EmitContext& ctx, Id value);
  202. Id EmitFPExp2(EmitContext& ctx, Id value);
  203. Id EmitFPLog2(EmitContext& ctx, Id value);
  204. Id EmitFPRecip32(EmitContext& ctx, Id value);
  205. Id EmitFPRecip64(EmitContext& ctx, Id value);
  206. Id EmitFPRecipSqrt32(EmitContext& ctx, Id value);
  207. Id EmitFPRecipSqrt64(EmitContext& ctx, Id value);
  208. Id EmitFPSqrt(EmitContext& ctx, Id value);
  209. Id EmitFPSaturate16(EmitContext& ctx, Id value);
  210. Id EmitFPSaturate32(EmitContext& ctx, Id value);
  211. Id EmitFPSaturate64(EmitContext& ctx, Id value);
  212. Id EmitFPClamp16(EmitContext& ctx, Id value, Id min_value, Id max_value);
  213. Id EmitFPClamp32(EmitContext& ctx, Id value, Id min_value, Id max_value);
  214. Id EmitFPClamp64(EmitContext& ctx, Id value, Id min_value, Id max_value);
  215. Id EmitFPRoundEven16(EmitContext& ctx, Id value);
  216. Id EmitFPRoundEven32(EmitContext& ctx, Id value);
  217. Id EmitFPRoundEven64(EmitContext& ctx, Id value);
  218. Id EmitFPFloor16(EmitContext& ctx, Id value);
  219. Id EmitFPFloor32(EmitContext& ctx, Id value);
  220. Id EmitFPFloor64(EmitContext& ctx, Id value);
  221. Id EmitFPCeil16(EmitContext& ctx, Id value);
  222. Id EmitFPCeil32(EmitContext& ctx, Id value);
  223. Id EmitFPCeil64(EmitContext& ctx, Id value);
  224. Id EmitFPTrunc16(EmitContext& ctx, Id value);
  225. Id EmitFPTrunc32(EmitContext& ctx, Id value);
  226. Id EmitFPTrunc64(EmitContext& ctx, Id value);
  227. Id EmitFPOrdEqual16(EmitContext& ctx, Id lhs, Id rhs);
  228. Id EmitFPOrdEqual32(EmitContext& ctx, Id lhs, Id rhs);
  229. Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs);
  230. Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs);
  231. Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs);
  232. Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs);
  233. Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
  234. Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
  235. Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
  236. Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
  237. Id EmitFPUnordNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
  238. Id EmitFPUnordNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
  239. Id EmitFPOrdLessThan16(EmitContext& ctx, Id lhs, Id rhs);
  240. Id EmitFPOrdLessThan32(EmitContext& ctx, Id lhs, Id rhs);
  241. Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs);
  242. Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs);
  243. Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs);
  244. Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs);
  245. Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
  246. Id EmitFPOrdGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
  247. Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
  248. Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
  249. Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
  250. Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
  251. Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  252. Id EmitFPOrdLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  253. Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  254. Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  255. Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  256. Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  257. Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  258. Id EmitFPOrdGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  259. Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  260. Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  261. Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  262. Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  263. Id EmitFPIsNan16(EmitContext& ctx, Id value);
  264. Id EmitFPIsNan32(EmitContext& ctx, Id value);
  265. Id EmitFPIsNan64(EmitContext& ctx, Id value);
  266. Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  267. void EmitIAdd64(EmitContext& ctx);
  268. Id EmitISub32(EmitContext& ctx, Id a, Id b);
  269. void EmitISub64(EmitContext& ctx);
  270. Id EmitIMul32(EmitContext& ctx, Id a, Id b);
  271. Id EmitINeg32(EmitContext& ctx, Id value);
  272. Id EmitINeg64(EmitContext& ctx, Id value);
  273. Id EmitIAbs32(EmitContext& ctx, Id value);
  274. Id EmitIAbs64(EmitContext& ctx, Id value);
  275. Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
  276. Id EmitShiftLeftLogical64(EmitContext& ctx, Id base, Id shift);
  277. Id EmitShiftRightLogical32(EmitContext& ctx, Id base, Id shift);
  278. Id EmitShiftRightLogical64(EmitContext& ctx, Id base, Id shift);
  279. Id EmitShiftRightArithmetic32(EmitContext& ctx, Id base, Id shift);
  280. Id EmitShiftRightArithmetic64(EmitContext& ctx, Id base, Id shift);
  281. Id EmitBitwiseAnd32(EmitContext& ctx, Id a, Id b);
  282. Id EmitBitwiseOr32(EmitContext& ctx, Id a, Id b);
  283. Id EmitBitwiseXor32(EmitContext& ctx, Id a, Id b);
  284. Id EmitBitFieldInsert(EmitContext& ctx, Id base, Id insert, Id offset, Id count);
  285. Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
  286. Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
  287. Id EmitBitReverse32(EmitContext& ctx, Id value);
  288. Id EmitBitCount32(EmitContext& ctx, Id value);
  289. Id EmitBitwiseNot32(EmitContext& ctx, Id value);
  290. Id EmitFindSMsb32(EmitContext& ctx, Id value);
  291. Id EmitFindUMsb32(EmitContext& ctx, Id value);
  292. Id EmitSMin32(EmitContext& ctx, Id a, Id b);
  293. Id EmitUMin32(EmitContext& ctx, Id a, Id b);
  294. Id EmitSMax32(EmitContext& ctx, Id a, Id b);
  295. Id EmitUMax32(EmitContext& ctx, Id a, Id b);
  296. Id EmitSClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
  297. Id EmitUClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
  298. Id EmitSLessThan(EmitContext& ctx, Id lhs, Id rhs);
  299. Id EmitULessThan(EmitContext& ctx, Id lhs, Id rhs);
  300. Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
  301. Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  302. Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  303. Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  304. Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  305. Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs);
  306. Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  307. Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  308. Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
  309. Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
  310. Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
  311. Id EmitLogicalNot(EmitContext& ctx, Id value);
  312. Id EmitConvertS16F16(EmitContext& ctx, Id value);
  313. Id EmitConvertS16F32(EmitContext& ctx, Id value);
  314. Id EmitConvertS16F64(EmitContext& ctx, Id value);
  315. Id EmitConvertS32F16(EmitContext& ctx, Id value);
  316. Id EmitConvertS32F32(EmitContext& ctx, Id value);
  317. Id EmitConvertS32F64(EmitContext& ctx, Id value);
  318. Id EmitConvertS64F16(EmitContext& ctx, Id value);
  319. Id EmitConvertS64F32(EmitContext& ctx, Id value);
  320. Id EmitConvertS64F64(EmitContext& ctx, Id value);
  321. Id EmitConvertU16F16(EmitContext& ctx, Id value);
  322. Id EmitConvertU16F32(EmitContext& ctx, Id value);
  323. Id EmitConvertU16F64(EmitContext& ctx, Id value);
  324. Id EmitConvertU32F16(EmitContext& ctx, Id value);
  325. Id EmitConvertU32F32(EmitContext& ctx, Id value);
  326. Id EmitConvertU32F64(EmitContext& ctx, Id value);
  327. Id EmitConvertU64F16(EmitContext& ctx, Id value);
  328. Id EmitConvertU64F32(EmitContext& ctx, Id value);
  329. Id EmitConvertU64F64(EmitContext& ctx, Id value);
  330. Id EmitConvertU64U32(EmitContext& ctx, Id value);
  331. Id EmitConvertU32U64(EmitContext& ctx, Id value);
  332. Id EmitConvertF16F32(EmitContext& ctx, Id value);
  333. Id EmitConvertF32F16(EmitContext& ctx, Id value);
  334. Id EmitConvertF32F64(EmitContext& ctx, Id value);
  335. Id EmitConvertF64F32(EmitContext& ctx, Id value);
  336. Id EmitConvertF16S8(EmitContext& ctx, Id value);
  337. Id EmitConvertF16S16(EmitContext& ctx, Id value);
  338. Id EmitConvertF16S32(EmitContext& ctx, Id value);
  339. Id EmitConvertF16S64(EmitContext& ctx, Id value);
  340. Id EmitConvertF16U8(EmitContext& ctx, Id value);
  341. Id EmitConvertF16U16(EmitContext& ctx, Id value);
  342. Id EmitConvertF16U32(EmitContext& ctx, Id value);
  343. Id EmitConvertF16U64(EmitContext& ctx, Id value);
  344. Id EmitConvertF32S8(EmitContext& ctx, Id value);
  345. Id EmitConvertF32S16(EmitContext& ctx, Id value);
  346. Id EmitConvertF32S32(EmitContext& ctx, Id value);
  347. Id EmitConvertF32S64(EmitContext& ctx, Id value);
  348. Id EmitConvertF32U8(EmitContext& ctx, Id value);
  349. Id EmitConvertF32U16(EmitContext& ctx, Id value);
  350. Id EmitConvertF32U32(EmitContext& ctx, Id value);
  351. Id EmitConvertF32U64(EmitContext& ctx, Id value);
  352. Id EmitConvertF64S8(EmitContext& ctx, Id value);
  353. Id EmitConvertF64S16(EmitContext& ctx, Id value);
  354. Id EmitConvertF64S32(EmitContext& ctx, Id value);
  355. Id EmitConvertF64S64(EmitContext& ctx, Id value);
  356. Id EmitConvertF64U8(EmitContext& ctx, Id value);
  357. Id EmitConvertF64U16(EmitContext& ctx, Id value);
  358. Id EmitConvertF64U32(EmitContext& ctx, Id value);
  359. Id EmitConvertF64U64(EmitContext& ctx, Id value);
  360. Id EmitBindlessImageSampleImplicitLod(EmitContext&);
  361. Id EmitBindlessImageSampleExplicitLod(EmitContext&);
  362. Id EmitBindlessImageSampleDrefImplicitLod(EmitContext&);
  363. Id EmitBindlessImageSampleDrefExplicitLod(EmitContext&);
  364. Id EmitBindlessImageGather(EmitContext&);
  365. Id EmitBindlessImageGatherDref(EmitContext&);
  366. Id EmitBindlessImageFetch(EmitContext&);
  367. Id EmitBindlessImageQueryDimensions(EmitContext&);
  368. Id EmitBindlessImageQueryLod(EmitContext&);
  369. Id EmitBindlessImageGradient(EmitContext&);
  370. Id EmitBoundImageSampleImplicitLod(EmitContext&);
  371. Id EmitBoundImageSampleExplicitLod(EmitContext&);
  372. Id EmitBoundImageSampleDrefImplicitLod(EmitContext&);
  373. Id EmitBoundImageSampleDrefExplicitLod(EmitContext&);
  374. Id EmitBoundImageGather(EmitContext&);
  375. Id EmitBoundImageGatherDref(EmitContext&);
  376. Id EmitBoundImageFetch(EmitContext&);
  377. Id EmitBoundImageQueryDimensions(EmitContext&);
  378. Id EmitBoundImageQueryLod(EmitContext&);
  379. Id EmitBoundImageGradient(EmitContext&);
  380. Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  381. Id bias_lc, Id offset);
  382. Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  383. Id lod_lc, Id offset);
  384. Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
  385. Id coords, Id dref, Id bias_lc, Id offset);
  386. Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
  387. Id coords, Id dref, Id lod_lc, Id offset);
  388. Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  389. const IR::Value& offset, const IR::Value& offset2);
  390. Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  391. const IR::Value& offset, const IR::Value& offset2, Id dref);
  392. Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
  393. Id lod, Id ms);
  394. Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod);
  395. Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
  396. Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  397. Id derivates, Id offset, Id lod_clamp);
  398. Id EmitVoteAll(EmitContext& ctx, Id pred);
  399. Id EmitVoteAny(EmitContext& ctx, Id pred);
  400. Id EmitVoteEqual(EmitContext& ctx, Id pred);
  401. Id EmitSubgroupBallot(EmitContext& ctx, Id pred);
  402. Id EmitShuffleIndex(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  403. Id segmentation_mask);
  404. Id EmitShuffleUp(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  405. Id segmentation_mask);
  406. Id EmitShuffleDown(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  407. Id segmentation_mask);
  408. Id EmitShuffleButterfly(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  409. Id segmentation_mask);
  410. Id EmitFSwizzleAdd(EmitContext& ctx, Id op_a, Id op_b, Id swizzle);
  411. } // namespace Shader::Backend::SPIRV