emit_spirv_instructions.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. // Copyright 2021 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <sirit/sirit.h>
  5. #include "common/common_types.h"
  6. namespace Shader::IR {
  7. enum class Attribute : u64;
  8. enum class Patch : u64;
  9. class Inst;
  10. class Value;
  11. } // namespace Shader::IR
  12. namespace Shader::Backend::SPIRV {
  13. using Sirit::Id;
  14. class EmitContext;
  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. Id EmitConditionRef(EmitContext& ctx, const IR::Value& value);
  20. void EmitReference(EmitContext&);
  21. void EmitPhiMove(EmitContext&);
  22. void EmitJoin(EmitContext& ctx);
  23. void EmitDemoteToHelperInvocation(EmitContext& ctx);
  24. void EmitBarrier(EmitContext& ctx);
  25. void EmitWorkgroupMemoryBarrier(EmitContext& ctx);
  26. void EmitDeviceMemoryBarrier(EmitContext& ctx);
  27. void EmitPrologue(EmitContext& ctx);
  28. void EmitEpilogue(EmitContext& ctx);
  29. void EmitEmitVertex(EmitContext& ctx, const IR::Value& stream);
  30. void EmitEndPrimitive(EmitContext& ctx, const IR::Value& stream);
  31. void EmitGetRegister(EmitContext& ctx);
  32. void EmitSetRegister(EmitContext& ctx);
  33. void EmitGetPred(EmitContext& ctx);
  34. void EmitSetPred(EmitContext& ctx);
  35. void EmitSetGotoVariable(EmitContext& ctx);
  36. void EmitGetGotoVariable(EmitContext& ctx);
  37. void EmitSetIndirectBranchVariable(EmitContext& ctx);
  38. void EmitGetIndirectBranchVariable(EmitContext& ctx);
  39. void EmitSetLoopSafetyVariable(EmitContext& ctx);
  40. void EmitGetLoopSafetyVariable(EmitContext& ctx);
  41. Id EmitGetCbufU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  42. Id EmitGetCbufS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  43. Id EmitGetCbufU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  44. Id EmitGetCbufS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  45. Id EmitGetCbufU32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  46. Id EmitGetCbufF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  47. Id EmitGetCbufU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  48. Id EmitGetAttribute(EmitContext& ctx, IR::Attribute attr, Id vertex);
  49. void EmitSetAttribute(EmitContext& ctx, IR::Attribute attr, Id value, Id vertex);
  50. Id EmitGetAttributeIndexed(EmitContext& ctx, Id offset, Id vertex);
  51. void EmitSetAttributeIndexed(EmitContext& ctx, Id offset, Id value, Id vertex);
  52. Id EmitGetPatch(EmitContext& ctx, IR::Patch patch);
  53. void EmitSetPatch(EmitContext& ctx, IR::Patch patch, Id value);
  54. void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value);
  55. void EmitSetSampleMask(EmitContext& ctx, Id value);
  56. void EmitSetFragDepth(EmitContext& ctx, Id value);
  57. void EmitGetZFlag(EmitContext& ctx);
  58. void EmitGetSFlag(EmitContext& ctx);
  59. void EmitGetCFlag(EmitContext& ctx);
  60. void EmitGetOFlag(EmitContext& ctx);
  61. void EmitSetZFlag(EmitContext& ctx);
  62. void EmitSetSFlag(EmitContext& ctx);
  63. void EmitSetCFlag(EmitContext& ctx);
  64. void EmitSetOFlag(EmitContext& ctx);
  65. Id EmitWorkgroupId(EmitContext& ctx);
  66. Id EmitLocalInvocationId(EmitContext& ctx);
  67. Id EmitInvocationId(EmitContext& ctx);
  68. Id EmitSampleId(EmitContext& ctx);
  69. Id EmitIsHelperInvocation(EmitContext& ctx);
  70. Id EmitYDirection(EmitContext& ctx);
  71. Id EmitLoadLocal(EmitContext& ctx, Id word_offset);
  72. void EmitWriteLocal(EmitContext& ctx, Id word_offset, Id value);
  73. Id EmitUndefU1(EmitContext& ctx);
  74. Id EmitUndefU8(EmitContext& ctx);
  75. Id EmitUndefU16(EmitContext& ctx);
  76. Id EmitUndefU32(EmitContext& ctx);
  77. Id EmitUndefU64(EmitContext& ctx);
  78. void EmitLoadGlobalU8(EmitContext& ctx);
  79. void EmitLoadGlobalS8(EmitContext& ctx);
  80. void EmitLoadGlobalU16(EmitContext& ctx);
  81. void EmitLoadGlobalS16(EmitContext& ctx);
  82. Id EmitLoadGlobal32(EmitContext& ctx, Id address);
  83. Id EmitLoadGlobal64(EmitContext& ctx, Id address);
  84. Id EmitLoadGlobal128(EmitContext& ctx, Id address);
  85. void EmitWriteGlobalU8(EmitContext& ctx);
  86. void EmitWriteGlobalS8(EmitContext& ctx);
  87. void EmitWriteGlobalU16(EmitContext& ctx);
  88. void EmitWriteGlobalS16(EmitContext& ctx);
  89. void EmitWriteGlobal32(EmitContext& ctx, Id address, Id value);
  90. void EmitWriteGlobal64(EmitContext& ctx, Id address, Id value);
  91. void EmitWriteGlobal128(EmitContext& ctx, Id address, Id value);
  92. Id EmitLoadStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  93. Id EmitLoadStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  94. Id EmitLoadStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  95. Id EmitLoadStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  96. Id EmitLoadStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  97. Id EmitLoadStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  98. Id EmitLoadStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset);
  99. void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  100. Id value);
  101. void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  102. Id value);
  103. void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  104. Id value);
  105. void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  106. Id value);
  107. void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  108. Id value);
  109. void EmitWriteStorage64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  110. Id value);
  111. void EmitWriteStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  112. Id value);
  113. Id EmitLoadSharedU8(EmitContext& ctx, Id offset);
  114. Id EmitLoadSharedS8(EmitContext& ctx, Id offset);
  115. Id EmitLoadSharedU16(EmitContext& ctx, Id offset);
  116. Id EmitLoadSharedS16(EmitContext& ctx, Id offset);
  117. Id EmitLoadSharedU32(EmitContext& ctx, Id offset);
  118. Id EmitLoadSharedU64(EmitContext& ctx, Id offset);
  119. Id EmitLoadSharedU128(EmitContext& ctx, Id offset);
  120. void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value);
  121. void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value);
  122. void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value);
  123. void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value);
  124. void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value);
  125. Id EmitCompositeConstructU32x2(EmitContext& ctx, Id e1, Id e2);
  126. Id EmitCompositeConstructU32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  127. Id EmitCompositeConstructU32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  128. Id EmitCompositeExtractU32x2(EmitContext& ctx, Id composite, u32 index);
  129. Id EmitCompositeExtractU32x3(EmitContext& ctx, Id composite, u32 index);
  130. Id EmitCompositeExtractU32x4(EmitContext& ctx, Id composite, u32 index);
  131. Id EmitCompositeInsertU32x2(EmitContext& ctx, Id composite, Id object, u32 index);
  132. Id EmitCompositeInsertU32x3(EmitContext& ctx, Id composite, Id object, u32 index);
  133. Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index);
  134. Id EmitCompositeConstructF16x2(EmitContext& ctx, Id e1, Id e2);
  135. Id EmitCompositeConstructF16x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  136. Id EmitCompositeConstructF16x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  137. Id EmitCompositeExtractF16x2(EmitContext& ctx, Id composite, u32 index);
  138. Id EmitCompositeExtractF16x3(EmitContext& ctx, Id composite, u32 index);
  139. Id EmitCompositeExtractF16x4(EmitContext& ctx, Id composite, u32 index);
  140. Id EmitCompositeInsertF16x2(EmitContext& ctx, Id composite, Id object, u32 index);
  141. Id EmitCompositeInsertF16x3(EmitContext& ctx, Id composite, Id object, u32 index);
  142. Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index);
  143. Id EmitCompositeConstructF32x2(EmitContext& ctx, Id e1, Id e2);
  144. Id EmitCompositeConstructF32x3(EmitContext& ctx, Id e1, Id e2, Id e3);
  145. Id EmitCompositeConstructF32x4(EmitContext& ctx, Id e1, Id e2, Id e3, Id e4);
  146. Id EmitCompositeExtractF32x2(EmitContext& ctx, Id composite, u32 index);
  147. Id EmitCompositeExtractF32x3(EmitContext& ctx, Id composite, u32 index);
  148. Id EmitCompositeExtractF32x4(EmitContext& ctx, Id composite, u32 index);
  149. Id EmitCompositeInsertF32x2(EmitContext& ctx, Id composite, Id object, u32 index);
  150. Id EmitCompositeInsertF32x3(EmitContext& ctx, Id composite, Id object, u32 index);
  151. Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index);
  152. void EmitCompositeConstructF64x2(EmitContext& ctx);
  153. void EmitCompositeConstructF64x3(EmitContext& ctx);
  154. void EmitCompositeConstructF64x4(EmitContext& ctx);
  155. void EmitCompositeExtractF64x2(EmitContext& ctx);
  156. void EmitCompositeExtractF64x3(EmitContext& ctx);
  157. void EmitCompositeExtractF64x4(EmitContext& ctx);
  158. Id EmitCompositeInsertF64x2(EmitContext& ctx, Id composite, Id object, u32 index);
  159. Id EmitCompositeInsertF64x3(EmitContext& ctx, Id composite, Id object, u32 index);
  160. Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index);
  161. Id EmitSelectU1(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  162. Id EmitSelectU8(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  163. Id EmitSelectU16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  164. Id EmitSelectU32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  165. Id EmitSelectU64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  166. Id EmitSelectF16(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  167. Id EmitSelectF32(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  168. Id EmitSelectF64(EmitContext& ctx, Id cond, Id true_value, Id false_value);
  169. void EmitBitCastU16F16(EmitContext& ctx);
  170. Id EmitBitCastU32F32(EmitContext& ctx, Id value);
  171. void EmitBitCastU64F64(EmitContext& ctx);
  172. void EmitBitCastF16U16(EmitContext& ctx);
  173. Id EmitBitCastF32U32(EmitContext& ctx, Id value);
  174. void EmitBitCastF64U64(EmitContext& ctx);
  175. Id EmitPackUint2x32(EmitContext& ctx, Id value);
  176. Id EmitUnpackUint2x32(EmitContext& ctx, Id value);
  177. Id EmitPackFloat2x16(EmitContext& ctx, Id value);
  178. Id EmitUnpackFloat2x16(EmitContext& ctx, Id value);
  179. Id EmitPackHalf2x16(EmitContext& ctx, Id value);
  180. Id EmitUnpackHalf2x16(EmitContext& ctx, Id value);
  181. Id EmitPackDouble2x32(EmitContext& ctx, Id value);
  182. Id EmitUnpackDouble2x32(EmitContext& ctx, Id value);
  183. void EmitGetZeroFromOp(EmitContext& ctx);
  184. void EmitGetSignFromOp(EmitContext& ctx);
  185. void EmitGetCarryFromOp(EmitContext& ctx);
  186. void EmitGetOverflowFromOp(EmitContext& ctx);
  187. void EmitGetSparseFromOp(EmitContext& ctx);
  188. void EmitGetInBoundsFromOp(EmitContext& ctx);
  189. Id EmitFPAbs16(EmitContext& ctx, Id value);
  190. Id EmitFPAbs32(EmitContext& ctx, Id value);
  191. Id EmitFPAbs64(EmitContext& ctx, Id value);
  192. Id EmitFPAdd16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  193. Id EmitFPAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  194. Id EmitFPAdd64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  195. Id EmitFPFma16(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  196. Id EmitFPFma32(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  197. Id EmitFPFma64(EmitContext& ctx, IR::Inst* inst, Id a, Id b, Id c);
  198. Id EmitFPMax32(EmitContext& ctx, Id a, Id b);
  199. Id EmitFPMax64(EmitContext& ctx, Id a, Id b);
  200. Id EmitFPMin32(EmitContext& ctx, Id a, Id b);
  201. Id EmitFPMin64(EmitContext& ctx, Id a, Id b);
  202. Id EmitFPMul16(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  203. Id EmitFPMul32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  204. Id EmitFPMul64(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  205. Id EmitFPNeg16(EmitContext& ctx, Id value);
  206. Id EmitFPNeg32(EmitContext& ctx, Id value);
  207. Id EmitFPNeg64(EmitContext& ctx, Id value);
  208. Id EmitFPSin(EmitContext& ctx, Id value);
  209. Id EmitFPCos(EmitContext& ctx, Id value);
  210. Id EmitFPExp2(EmitContext& ctx, Id value);
  211. Id EmitFPLog2(EmitContext& ctx, Id value);
  212. Id EmitFPRecip32(EmitContext& ctx, Id value);
  213. Id EmitFPRecip64(EmitContext& ctx, Id value);
  214. Id EmitFPRecipSqrt32(EmitContext& ctx, Id value);
  215. Id EmitFPRecipSqrt64(EmitContext& ctx, Id value);
  216. Id EmitFPSqrt(EmitContext& ctx, Id value);
  217. Id EmitFPSaturate16(EmitContext& ctx, Id value);
  218. Id EmitFPSaturate32(EmitContext& ctx, Id value);
  219. Id EmitFPSaturate64(EmitContext& ctx, Id value);
  220. Id EmitFPClamp16(EmitContext& ctx, Id value, Id min_value, Id max_value);
  221. Id EmitFPClamp32(EmitContext& ctx, Id value, Id min_value, Id max_value);
  222. Id EmitFPClamp64(EmitContext& ctx, Id value, Id min_value, Id max_value);
  223. Id EmitFPRoundEven16(EmitContext& ctx, Id value);
  224. Id EmitFPRoundEven32(EmitContext& ctx, Id value);
  225. Id EmitFPRoundEven64(EmitContext& ctx, Id value);
  226. Id EmitFPFloor16(EmitContext& ctx, Id value);
  227. Id EmitFPFloor32(EmitContext& ctx, Id value);
  228. Id EmitFPFloor64(EmitContext& ctx, Id value);
  229. Id EmitFPCeil16(EmitContext& ctx, Id value);
  230. Id EmitFPCeil32(EmitContext& ctx, Id value);
  231. Id EmitFPCeil64(EmitContext& ctx, Id value);
  232. Id EmitFPTrunc16(EmitContext& ctx, Id value);
  233. Id EmitFPTrunc32(EmitContext& ctx, Id value);
  234. Id EmitFPTrunc64(EmitContext& ctx, Id value);
  235. Id EmitFPOrdEqual16(EmitContext& ctx, Id lhs, Id rhs);
  236. Id EmitFPOrdEqual32(EmitContext& ctx, Id lhs, Id rhs);
  237. Id EmitFPOrdEqual64(EmitContext& ctx, Id lhs, Id rhs);
  238. Id EmitFPUnordEqual16(EmitContext& ctx, Id lhs, Id rhs);
  239. Id EmitFPUnordEqual32(EmitContext& ctx, Id lhs, Id rhs);
  240. Id EmitFPUnordEqual64(EmitContext& ctx, Id lhs, Id rhs);
  241. Id EmitFPOrdNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
  242. Id EmitFPOrdNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
  243. Id EmitFPOrdNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
  244. Id EmitFPUnordNotEqual16(EmitContext& ctx, Id lhs, Id rhs);
  245. Id EmitFPUnordNotEqual32(EmitContext& ctx, Id lhs, Id rhs);
  246. Id EmitFPUnordNotEqual64(EmitContext& ctx, Id lhs, Id rhs);
  247. Id EmitFPOrdLessThan16(EmitContext& ctx, Id lhs, Id rhs);
  248. Id EmitFPOrdLessThan32(EmitContext& ctx, Id lhs, Id rhs);
  249. Id EmitFPOrdLessThan64(EmitContext& ctx, Id lhs, Id rhs);
  250. Id EmitFPUnordLessThan16(EmitContext& ctx, Id lhs, Id rhs);
  251. Id EmitFPUnordLessThan32(EmitContext& ctx, Id lhs, Id rhs);
  252. Id EmitFPUnordLessThan64(EmitContext& ctx, Id lhs, Id rhs);
  253. Id EmitFPOrdGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
  254. Id EmitFPOrdGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
  255. Id EmitFPOrdGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
  256. Id EmitFPUnordGreaterThan16(EmitContext& ctx, Id lhs, Id rhs);
  257. Id EmitFPUnordGreaterThan32(EmitContext& ctx, Id lhs, Id rhs);
  258. Id EmitFPUnordGreaterThan64(EmitContext& ctx, Id lhs, Id rhs);
  259. Id EmitFPOrdLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  260. Id EmitFPOrdLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  261. Id EmitFPOrdLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  262. Id EmitFPUnordLessThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  263. Id EmitFPUnordLessThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  264. Id EmitFPUnordLessThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  265. Id EmitFPOrdGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  266. Id EmitFPOrdGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  267. Id EmitFPOrdGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  268. Id EmitFPUnordGreaterThanEqual16(EmitContext& ctx, Id lhs, Id rhs);
  269. Id EmitFPUnordGreaterThanEqual32(EmitContext& ctx, Id lhs, Id rhs);
  270. Id EmitFPUnordGreaterThanEqual64(EmitContext& ctx, Id lhs, Id rhs);
  271. Id EmitFPIsNan16(EmitContext& ctx, Id value);
  272. Id EmitFPIsNan32(EmitContext& ctx, Id value);
  273. Id EmitFPIsNan64(EmitContext& ctx, Id value);
  274. Id EmitIAdd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  275. Id EmitIAdd64(EmitContext& ctx, Id a, Id b);
  276. Id EmitISub32(EmitContext& ctx, Id a, Id b);
  277. Id EmitISub64(EmitContext& ctx, Id a, Id b);
  278. Id EmitIMul32(EmitContext& ctx, Id a, Id b);
  279. Id EmitINeg32(EmitContext& ctx, Id value);
  280. Id EmitINeg64(EmitContext& ctx, Id value);
  281. Id EmitIAbs32(EmitContext& ctx, Id value);
  282. Id EmitIAbs64(EmitContext& ctx, Id value);
  283. Id EmitShiftLeftLogical32(EmitContext& ctx, Id base, Id shift);
  284. Id EmitShiftLeftLogical64(EmitContext& ctx, Id base, Id shift);
  285. Id EmitShiftRightLogical32(EmitContext& ctx, Id base, Id shift);
  286. Id EmitShiftRightLogical64(EmitContext& ctx, Id base, Id shift);
  287. Id EmitShiftRightArithmetic32(EmitContext& ctx, Id base, Id shift);
  288. Id EmitShiftRightArithmetic64(EmitContext& ctx, Id base, Id shift);
  289. Id EmitBitwiseAnd32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  290. Id EmitBitwiseOr32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  291. Id EmitBitwiseXor32(EmitContext& ctx, IR::Inst* inst, Id a, Id b);
  292. Id EmitBitFieldInsert(EmitContext& ctx, Id base, Id insert, Id offset, Id count);
  293. Id EmitBitFieldSExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
  294. Id EmitBitFieldUExtract(EmitContext& ctx, IR::Inst* inst, Id base, Id offset, Id count);
  295. Id EmitBitReverse32(EmitContext& ctx, Id value);
  296. Id EmitBitCount32(EmitContext& ctx, Id value);
  297. Id EmitBitwiseNot32(EmitContext& ctx, Id value);
  298. Id EmitFindSMsb32(EmitContext& ctx, Id value);
  299. Id EmitFindUMsb32(EmitContext& ctx, Id value);
  300. Id EmitSMin32(EmitContext& ctx, Id a, Id b);
  301. Id EmitUMin32(EmitContext& ctx, Id a, Id b);
  302. Id EmitSMax32(EmitContext& ctx, Id a, Id b);
  303. Id EmitUMax32(EmitContext& ctx, Id a, Id b);
  304. Id EmitSClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
  305. Id EmitUClamp32(EmitContext& ctx, IR::Inst* inst, Id value, Id min, Id max);
  306. Id EmitSLessThan(EmitContext& ctx, Id lhs, Id rhs);
  307. Id EmitULessThan(EmitContext& ctx, Id lhs, Id rhs);
  308. Id EmitIEqual(EmitContext& ctx, Id lhs, Id rhs);
  309. Id EmitSLessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  310. Id EmitULessThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  311. Id EmitSGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  312. Id EmitUGreaterThan(EmitContext& ctx, Id lhs, Id rhs);
  313. Id EmitINotEqual(EmitContext& ctx, Id lhs, Id rhs);
  314. Id EmitSGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  315. Id EmitUGreaterThanEqual(EmitContext& ctx, Id lhs, Id rhs);
  316. Id EmitSharedAtomicIAdd32(EmitContext& ctx, Id pointer_offset, Id value);
  317. Id EmitSharedAtomicSMin32(EmitContext& ctx, Id pointer_offset, Id value);
  318. Id EmitSharedAtomicUMin32(EmitContext& ctx, Id pointer_offset, Id value);
  319. Id EmitSharedAtomicSMax32(EmitContext& ctx, Id pointer_offset, Id value);
  320. Id EmitSharedAtomicUMax32(EmitContext& ctx, Id pointer_offset, Id value);
  321. Id EmitSharedAtomicInc32(EmitContext& ctx, Id pointer_offset, Id value);
  322. Id EmitSharedAtomicDec32(EmitContext& ctx, Id pointer_offset, Id value);
  323. Id EmitSharedAtomicAnd32(EmitContext& ctx, Id pointer_offset, Id value);
  324. Id EmitSharedAtomicOr32(EmitContext& ctx, Id pointer_offset, Id value);
  325. Id EmitSharedAtomicXor32(EmitContext& ctx, Id pointer_offset, Id value);
  326. Id EmitSharedAtomicExchange32(EmitContext& ctx, Id pointer_offset, Id value);
  327. Id EmitSharedAtomicExchange64(EmitContext& ctx, Id pointer_offset, Id value);
  328. Id EmitStorageAtomicIAdd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  329. Id value);
  330. Id EmitStorageAtomicSMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  331. Id value);
  332. Id EmitStorageAtomicUMin32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  333. Id value);
  334. Id EmitStorageAtomicSMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  335. Id value);
  336. Id EmitStorageAtomicUMax32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  337. Id value);
  338. Id EmitStorageAtomicInc32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  339. Id value);
  340. Id EmitStorageAtomicDec32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  341. Id value);
  342. Id EmitStorageAtomicAnd32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  343. Id value);
  344. Id EmitStorageAtomicOr32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  345. Id value);
  346. Id EmitStorageAtomicXor32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  347. Id value);
  348. Id EmitStorageAtomicExchange32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  349. Id value);
  350. Id EmitStorageAtomicIAdd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  351. Id value);
  352. Id EmitStorageAtomicSMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  353. Id value);
  354. Id EmitStorageAtomicUMin64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  355. Id value);
  356. Id EmitStorageAtomicSMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  357. Id value);
  358. Id EmitStorageAtomicUMax64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  359. Id value);
  360. Id EmitStorageAtomicAnd64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  361. Id value);
  362. Id EmitStorageAtomicOr64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  363. Id value);
  364. Id EmitStorageAtomicXor64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  365. Id value);
  366. Id EmitStorageAtomicExchange64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  367. Id value);
  368. Id EmitStorageAtomicAddF32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  369. Id value);
  370. Id EmitStorageAtomicAddF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  371. Id value);
  372. Id EmitStorageAtomicAddF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  373. Id value);
  374. Id EmitStorageAtomicMinF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  375. Id value);
  376. Id EmitStorageAtomicMinF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  377. Id value);
  378. Id EmitStorageAtomicMaxF16x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  379. Id value);
  380. Id EmitStorageAtomicMaxF32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset,
  381. Id value);
  382. Id EmitGlobalAtomicIAdd32(EmitContext& ctx);
  383. Id EmitGlobalAtomicSMin32(EmitContext& ctx);
  384. Id EmitGlobalAtomicUMin32(EmitContext& ctx);
  385. Id EmitGlobalAtomicSMax32(EmitContext& ctx);
  386. Id EmitGlobalAtomicUMax32(EmitContext& ctx);
  387. Id EmitGlobalAtomicInc32(EmitContext& ctx);
  388. Id EmitGlobalAtomicDec32(EmitContext& ctx);
  389. Id EmitGlobalAtomicAnd32(EmitContext& ctx);
  390. Id EmitGlobalAtomicOr32(EmitContext& ctx);
  391. Id EmitGlobalAtomicXor32(EmitContext& ctx);
  392. Id EmitGlobalAtomicExchange32(EmitContext& ctx);
  393. Id EmitGlobalAtomicIAdd64(EmitContext& ctx);
  394. Id EmitGlobalAtomicSMin64(EmitContext& ctx);
  395. Id EmitGlobalAtomicUMin64(EmitContext& ctx);
  396. Id EmitGlobalAtomicSMax64(EmitContext& ctx);
  397. Id EmitGlobalAtomicUMax64(EmitContext& ctx);
  398. Id EmitGlobalAtomicInc64(EmitContext& ctx);
  399. Id EmitGlobalAtomicDec64(EmitContext& ctx);
  400. Id EmitGlobalAtomicAnd64(EmitContext& ctx);
  401. Id EmitGlobalAtomicOr64(EmitContext& ctx);
  402. Id EmitGlobalAtomicXor64(EmitContext& ctx);
  403. Id EmitGlobalAtomicExchange64(EmitContext& ctx);
  404. Id EmitGlobalAtomicAddF32(EmitContext& ctx);
  405. Id EmitGlobalAtomicAddF16x2(EmitContext& ctx);
  406. Id EmitGlobalAtomicAddF32x2(EmitContext& ctx);
  407. Id EmitGlobalAtomicMinF16x2(EmitContext& ctx);
  408. Id EmitGlobalAtomicMinF32x2(EmitContext& ctx);
  409. Id EmitGlobalAtomicMaxF16x2(EmitContext& ctx);
  410. Id EmitGlobalAtomicMaxF32x2(EmitContext& ctx);
  411. Id EmitLogicalOr(EmitContext& ctx, Id a, Id b);
  412. Id EmitLogicalAnd(EmitContext& ctx, Id a, Id b);
  413. Id EmitLogicalXor(EmitContext& ctx, Id a, Id b);
  414. Id EmitLogicalNot(EmitContext& ctx, Id value);
  415. Id EmitConvertS16F16(EmitContext& ctx, Id value);
  416. Id EmitConvertS16F32(EmitContext& ctx, Id value);
  417. Id EmitConvertS16F64(EmitContext& ctx, Id value);
  418. Id EmitConvertS32F16(EmitContext& ctx, Id value);
  419. Id EmitConvertS32F32(EmitContext& ctx, Id value);
  420. Id EmitConvertS32F64(EmitContext& ctx, Id value);
  421. Id EmitConvertS64F16(EmitContext& ctx, Id value);
  422. Id EmitConvertS64F32(EmitContext& ctx, Id value);
  423. Id EmitConvertS64F64(EmitContext& ctx, Id value);
  424. Id EmitConvertU16F16(EmitContext& ctx, Id value);
  425. Id EmitConvertU16F32(EmitContext& ctx, Id value);
  426. Id EmitConvertU16F64(EmitContext& ctx, Id value);
  427. Id EmitConvertU32F16(EmitContext& ctx, Id value);
  428. Id EmitConvertU32F32(EmitContext& ctx, Id value);
  429. Id EmitConvertU32F64(EmitContext& ctx, Id value);
  430. Id EmitConvertU64F16(EmitContext& ctx, Id value);
  431. Id EmitConvertU64F32(EmitContext& ctx, Id value);
  432. Id EmitConvertU64F64(EmitContext& ctx, Id value);
  433. Id EmitConvertU64U32(EmitContext& ctx, Id value);
  434. Id EmitConvertU32U64(EmitContext& ctx, Id value);
  435. Id EmitConvertF16F32(EmitContext& ctx, Id value);
  436. Id EmitConvertF32F16(EmitContext& ctx, Id value);
  437. Id EmitConvertF32F64(EmitContext& ctx, Id value);
  438. Id EmitConvertF64F32(EmitContext& ctx, Id value);
  439. Id EmitConvertF16S8(EmitContext& ctx, Id value);
  440. Id EmitConvertF16S16(EmitContext& ctx, Id value);
  441. Id EmitConvertF16S32(EmitContext& ctx, Id value);
  442. Id EmitConvertF16S64(EmitContext& ctx, Id value);
  443. Id EmitConvertF16U8(EmitContext& ctx, Id value);
  444. Id EmitConvertF16U16(EmitContext& ctx, Id value);
  445. Id EmitConvertF16U32(EmitContext& ctx, Id value);
  446. Id EmitConvertF16U64(EmitContext& ctx, Id value);
  447. Id EmitConvertF32S8(EmitContext& ctx, Id value);
  448. Id EmitConvertF32S16(EmitContext& ctx, Id value);
  449. Id EmitConvertF32S32(EmitContext& ctx, Id value);
  450. Id EmitConvertF32S64(EmitContext& ctx, Id value);
  451. Id EmitConvertF32U8(EmitContext& ctx, Id value);
  452. Id EmitConvertF32U16(EmitContext& ctx, Id value);
  453. Id EmitConvertF32U32(EmitContext& ctx, Id value);
  454. Id EmitConvertF32U64(EmitContext& ctx, Id value);
  455. Id EmitConvertF64S8(EmitContext& ctx, Id value);
  456. Id EmitConvertF64S16(EmitContext& ctx, Id value);
  457. Id EmitConvertF64S32(EmitContext& ctx, Id value);
  458. Id EmitConvertF64S64(EmitContext& ctx, Id value);
  459. Id EmitConvertF64U8(EmitContext& ctx, Id value);
  460. Id EmitConvertF64U16(EmitContext& ctx, Id value);
  461. Id EmitConvertF64U32(EmitContext& ctx, Id value);
  462. Id EmitConvertF64U64(EmitContext& ctx, Id value);
  463. Id EmitBindlessImageSampleImplicitLod(EmitContext&);
  464. Id EmitBindlessImageSampleExplicitLod(EmitContext&);
  465. Id EmitBindlessImageSampleDrefImplicitLod(EmitContext&);
  466. Id EmitBindlessImageSampleDrefExplicitLod(EmitContext&);
  467. Id EmitBindlessImageGather(EmitContext&);
  468. Id EmitBindlessImageGatherDref(EmitContext&);
  469. Id EmitBindlessImageFetch(EmitContext&);
  470. Id EmitBindlessImageQueryDimensions(EmitContext&);
  471. Id EmitBindlessImageQueryLod(EmitContext&);
  472. Id EmitBindlessImageGradient(EmitContext&);
  473. Id EmitBindlessImageRead(EmitContext&);
  474. Id EmitBindlessImageWrite(EmitContext&);
  475. Id EmitBoundImageSampleImplicitLod(EmitContext&);
  476. Id EmitBoundImageSampleExplicitLod(EmitContext&);
  477. Id EmitBoundImageSampleDrefImplicitLod(EmitContext&);
  478. Id EmitBoundImageSampleDrefExplicitLod(EmitContext&);
  479. Id EmitBoundImageGather(EmitContext&);
  480. Id EmitBoundImageGatherDref(EmitContext&);
  481. Id EmitBoundImageFetch(EmitContext&);
  482. Id EmitBoundImageQueryDimensions(EmitContext&);
  483. Id EmitBoundImageQueryLod(EmitContext&);
  484. Id EmitBoundImageGradient(EmitContext&);
  485. Id EmitBoundImageRead(EmitContext&);
  486. Id EmitBoundImageWrite(EmitContext&);
  487. Id EmitImageSampleImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  488. Id bias_lc, const IR::Value& offset);
  489. Id EmitImageSampleExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  490. Id lod, const IR::Value& offset);
  491. Id EmitImageSampleDrefImplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
  492. Id coords, Id dref, Id bias_lc, const IR::Value& offset);
  493. Id EmitImageSampleDrefExplicitLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index,
  494. Id coords, Id dref, Id lod, const IR::Value& offset);
  495. Id EmitImageGather(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  496. const IR::Value& offset, const IR::Value& offset2);
  497. Id EmitImageGatherDref(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  498. const IR::Value& offset, const IR::Value& offset2, Id dref);
  499. Id EmitImageFetch(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id offset,
  500. Id lod, Id ms);
  501. Id EmitImageQueryDimensions(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id lod);
  502. Id EmitImageQueryLod(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
  503. Id EmitImageGradient(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  504. Id derivates, Id offset, Id lod_clamp);
  505. Id EmitImageRead(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords);
  506. void EmitImageWrite(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords, Id color);
  507. Id EmitBindlessImageAtomicIAdd32(EmitContext&);
  508. Id EmitBindlessImageAtomicSMin32(EmitContext&);
  509. Id EmitBindlessImageAtomicUMin32(EmitContext&);
  510. Id EmitBindlessImageAtomicSMax32(EmitContext&);
  511. Id EmitBindlessImageAtomicUMax32(EmitContext&);
  512. Id EmitBindlessImageAtomicInc32(EmitContext&);
  513. Id EmitBindlessImageAtomicDec32(EmitContext&);
  514. Id EmitBindlessImageAtomicAnd32(EmitContext&);
  515. Id EmitBindlessImageAtomicOr32(EmitContext&);
  516. Id EmitBindlessImageAtomicXor32(EmitContext&);
  517. Id EmitBindlessImageAtomicExchange32(EmitContext&);
  518. Id EmitBoundImageAtomicIAdd32(EmitContext&);
  519. Id EmitBoundImageAtomicSMin32(EmitContext&);
  520. Id EmitBoundImageAtomicUMin32(EmitContext&);
  521. Id EmitBoundImageAtomicSMax32(EmitContext&);
  522. Id EmitBoundImageAtomicUMax32(EmitContext&);
  523. Id EmitBoundImageAtomicInc32(EmitContext&);
  524. Id EmitBoundImageAtomicDec32(EmitContext&);
  525. Id EmitBoundImageAtomicAnd32(EmitContext&);
  526. Id EmitBoundImageAtomicOr32(EmitContext&);
  527. Id EmitBoundImageAtomicXor32(EmitContext&);
  528. Id EmitBoundImageAtomicExchange32(EmitContext&);
  529. Id EmitImageAtomicIAdd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  530. Id value);
  531. Id EmitImageAtomicSMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  532. Id value);
  533. Id EmitImageAtomicUMin32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  534. Id value);
  535. Id EmitImageAtomicSMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  536. Id value);
  537. Id EmitImageAtomicUMax32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  538. Id value);
  539. Id EmitImageAtomicInc32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  540. Id value);
  541. Id EmitImageAtomicDec32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  542. Id value);
  543. Id EmitImageAtomicAnd32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  544. Id value);
  545. Id EmitImageAtomicOr32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  546. Id value);
  547. Id EmitImageAtomicXor32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  548. Id value);
  549. Id EmitImageAtomicExchange32(EmitContext& ctx, IR::Inst* inst, const IR::Value& index, Id coords,
  550. Id value);
  551. Id EmitLaneId(EmitContext& ctx);
  552. Id EmitVoteAll(EmitContext& ctx, Id pred);
  553. Id EmitVoteAny(EmitContext& ctx, Id pred);
  554. Id EmitVoteEqual(EmitContext& ctx, Id pred);
  555. Id EmitSubgroupBallot(EmitContext& ctx, Id pred);
  556. Id EmitSubgroupEqMask(EmitContext& ctx);
  557. Id EmitSubgroupLtMask(EmitContext& ctx);
  558. Id EmitSubgroupLeMask(EmitContext& ctx);
  559. Id EmitSubgroupGtMask(EmitContext& ctx);
  560. Id EmitSubgroupGeMask(EmitContext& ctx);
  561. Id EmitShuffleIndex(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  562. Id segmentation_mask);
  563. Id EmitShuffleUp(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  564. Id segmentation_mask);
  565. Id EmitShuffleDown(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  566. Id segmentation_mask);
  567. Id EmitShuffleButterfly(EmitContext& ctx, IR::Inst* inst, Id value, Id index, Id clamp,
  568. Id segmentation_mask);
  569. Id EmitFSwizzleAdd(EmitContext& ctx, Id op_a, Id op_b, Id swizzle);
  570. Id EmitDPdxFine(EmitContext& ctx, Id op_a);
  571. Id EmitDPdyFine(EmitContext& ctx, Id op_a);
  572. Id EmitDPdxCoarse(EmitContext& ctx, Id op_a);
  573. Id EmitDPdyCoarse(EmitContext& ctx, Id op_a);
  574. } // namespace Shader::Backend::SPIRV