emit_glsl_instructions.h 40 KB

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