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