xref: /aosp_15_r20/external/angle/src/common/spirv/spirv_instruction_builder_autogen.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by gen_spirv_builder_and_parser.py using data from spirv.core.grammar.json.
3 //
4 // Copyright 2021 The ANGLE Project Authors. All rights reserved.
5 // Use of this source code is governed by a BSD-style license that can be
6 // found in the LICENSE file.
7 //
8 // spirv_instruction_builder_autogen.cpp:
9 //   Functions to generate SPIR-V binary for each instruction.
10 
11 #include "spirv_instruction_builder_autogen.h"
12 
13 #include <string.h>
14 
15 #include "common/debug.h"
16 
17 namespace angle
18 {
19 namespace spirv
20 {
21 namespace
22 {
MakeLengthOp(size_t length,spv::Op op)23 uint32_t MakeLengthOp(size_t length, spv::Op op)
24 {
25     ASSERT(length <= 0xFFFFu);
26     ASSERT(op <= 0xFFFFu);
27 
28     // It's easy for a complex shader to be crafted to hit the length limit,
29     // turn that into a crash instead of a security bug.  Ideally, the compiler
30     // would gracefully fail compilation, so this is more of a safety net.
31     if (ANGLE_UNLIKELY(length > 0xFFFFu))
32     {
33         ERR() << "Complex shader not representible in SPIR-V";
34         ANGLE_CRASH();
35     }
36 
37     return static_cast<uint32_t>(length) << 16 | op;
38 }
39 }  // anonymous namespace
40 
WriteSpirvHeader(std::vector<uint32_t> * blob,uint32_t version,uint32_t idCount)41 void WriteSpirvHeader(std::vector<uint32_t> *blob, uint32_t version, uint32_t idCount)
42 {
43     // Header:
44     //
45     //  - Magic number
46     //  - Version (1.X)
47     //  - ANGLE's Generator number:
48     //     * 24 for tool id (higher 16 bits)
49     //     * 1 for tool version (lower 16 bits))
50     //  - Bound (idCount)
51     //  - 0 (reserved)
52     constexpr uint32_t kANGLEGeneratorId      = 24;
53     constexpr uint32_t kANGLEGeneratorVersion = 1;
54 
55     ASSERT(blob->empty());
56 
57     blob->push_back(spv::MagicNumber);
58     blob->push_back(version);
59     blob->push_back(kANGLEGeneratorId << 16 | kANGLEGeneratorVersion);
60     blob->push_back(idCount);
61     blob->push_back(0x00000000);
62 }
63 
WriteNop(Blob * blob)64 void WriteNop(Blob *blob)
65 {
66     const size_t startSize = blob->size();
67     blob->push_back(0);
68 
69     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNop);
70 }
WriteUndef(Blob * blob,IdResultType idResultType1,IdResult idResult2)71 void WriteUndef(Blob *blob, IdResultType idResultType1, IdResult idResult2)
72 {
73     const size_t startSize = blob->size();
74     blob->push_back(0);
75     blob->push_back(idResultType1);
76     blob->push_back(idResult2);
77     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUndef);
78 }
WriteSourceContinued(Blob * blob,LiteralString continuedSource)79 void WriteSourceContinued(Blob *blob, LiteralString continuedSource)
80 {
81     const size_t startSize = blob->size();
82     blob->push_back(0);
83     {
84         size_t d = blob->size();
85         blob->resize(d + strlen(continuedSource) / 4 + 1, 0);
86         ASSERT(IsLittleEndian());
87         strcpy(reinterpret_cast<char *>(blob->data() + d), continuedSource);
88     }
89     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSourceContinued);
90 }
WriteSource(Blob * blob,spv::SourceLanguage sourceLanguage1,LiteralInteger version,const IdRef * file,const LiteralString * source)91 void WriteSource(Blob *blob,
92                  spv::SourceLanguage sourceLanguage1,
93                  LiteralInteger version,
94                  const IdRef *file,
95                  const LiteralString *source)
96 {
97     const size_t startSize = blob->size();
98     blob->push_back(0);
99     blob->push_back(sourceLanguage1);
100     blob->push_back(version);
101     if (file)
102     {
103         blob->push_back(*file);
104     }
105     if (source)
106     {
107         {
108             size_t d = blob->size();
109             blob->resize(d + strlen(*source) / 4 + 1, 0);
110             ASSERT(IsLittleEndian());
111             strcpy(reinterpret_cast<char *>(blob->data() + d), *source);
112         }
113     }
114     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSource);
115 }
WriteSourceExtension(Blob * blob,LiteralString extension)116 void WriteSourceExtension(Blob *blob, LiteralString extension)
117 {
118     const size_t startSize = blob->size();
119     blob->push_back(0);
120     {
121         size_t d = blob->size();
122         blob->resize(d + strlen(extension) / 4 + 1, 0);
123         ASSERT(IsLittleEndian());
124         strcpy(reinterpret_cast<char *>(blob->data() + d), extension);
125     }
126     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSourceExtension);
127 }
WriteName(Blob * blob,IdRef target,LiteralString name)128 void WriteName(Blob *blob, IdRef target, LiteralString name)
129 {
130     const size_t startSize = blob->size();
131     blob->push_back(0);
132     blob->push_back(target);
133     {
134         size_t d = blob->size();
135         blob->resize(d + strlen(name) / 4 + 1, 0);
136         ASSERT(IsLittleEndian());
137         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
138     }
139     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpName);
140 }
WriteMemberName(Blob * blob,IdRef type,LiteralInteger member,LiteralString name)141 void WriteMemberName(Blob *blob, IdRef type, LiteralInteger member, LiteralString name)
142 {
143     const size_t startSize = blob->size();
144     blob->push_back(0);
145     blob->push_back(type);
146     blob->push_back(member);
147     {
148         size_t d = blob->size();
149         blob->resize(d + strlen(name) / 4 + 1, 0);
150         ASSERT(IsLittleEndian());
151         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
152     }
153     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemberName);
154 }
WriteString(Blob * blob,IdResult idResult1,LiteralString string)155 void WriteString(Blob *blob, IdResult idResult1, LiteralString string)
156 {
157     const size_t startSize = blob->size();
158     blob->push_back(0);
159     blob->push_back(idResult1);
160     {
161         size_t d = blob->size();
162         blob->resize(d + strlen(string) / 4 + 1, 0);
163         ASSERT(IsLittleEndian());
164         strcpy(reinterpret_cast<char *>(blob->data() + d), string);
165     }
166     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpString);
167 }
WriteLine(Blob * blob,IdRef file,LiteralInteger line,LiteralInteger column)168 void WriteLine(Blob *blob, IdRef file, LiteralInteger line, LiteralInteger column)
169 {
170     const size_t startSize = blob->size();
171     blob->push_back(0);
172     blob->push_back(file);
173     blob->push_back(line);
174     blob->push_back(column);
175     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLine);
176 }
WriteExtension(Blob * blob,LiteralString name)177 void WriteExtension(Blob *blob, LiteralString name)
178 {
179     const size_t startSize = blob->size();
180     blob->push_back(0);
181     {
182         size_t d = blob->size();
183         blob->resize(d + strlen(name) / 4 + 1, 0);
184         ASSERT(IsLittleEndian());
185         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
186     }
187     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtension);
188 }
WriteExtInstImport(Blob * blob,IdResult idResult1,LiteralString name)189 void WriteExtInstImport(Blob *blob, IdResult idResult1, LiteralString name)
190 {
191     const size_t startSize = blob->size();
192     blob->push_back(0);
193     blob->push_back(idResult1);
194     {
195         size_t d = blob->size();
196         blob->resize(d + strlen(name) / 4 + 1, 0);
197         ASSERT(IsLittleEndian());
198         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
199     }
200     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtInstImport);
201 }
WriteExtInst(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef set,LiteralExtInstInteger instruction,const IdRefList & operandList)202 void WriteExtInst(Blob *blob,
203                   IdResultType idResultType1,
204                   IdResult idResult2,
205                   IdRef set,
206                   LiteralExtInstInteger instruction,
207                   const IdRefList &operandList)
208 {
209     const size_t startSize = blob->size();
210     blob->push_back(0);
211     blob->push_back(idResultType1);
212     blob->push_back(idResult2);
213     blob->push_back(set);
214     blob->push_back(instruction);
215     for (const auto &operand : operandList)
216     {
217         blob->push_back(operand);
218     }
219     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExtInst);
220 }
WriteMemoryModel(Blob * blob,spv::AddressingModel addressingModel1,spv::MemoryModel memoryModel2)221 void WriteMemoryModel(Blob *blob,
222                       spv::AddressingModel addressingModel1,
223                       spv::MemoryModel memoryModel2)
224 {
225     const size_t startSize = blob->size();
226     blob->push_back(0);
227     blob->push_back(addressingModel1);
228     blob->push_back(memoryModel2);
229     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemoryModel);
230 }
WriteEntryPoint(Blob * blob,spv::ExecutionModel executionModel1,IdRef entryPoint,LiteralString name,const IdRefList & interfaceList)231 void WriteEntryPoint(Blob *blob,
232                      spv::ExecutionModel executionModel1,
233                      IdRef entryPoint,
234                      LiteralString name,
235                      const IdRefList &interfaceList)
236 {
237     const size_t startSize = blob->size();
238     blob->push_back(0);
239     blob->push_back(executionModel1);
240     blob->push_back(entryPoint);
241     {
242         size_t d = blob->size();
243         blob->resize(d + strlen(name) / 4 + 1, 0);
244         ASSERT(IsLittleEndian());
245         strcpy(reinterpret_cast<char *>(blob->data() + d), name);
246     }
247     for (const auto &operand : interfaceList)
248     {
249         blob->push_back(operand);
250     }
251     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEntryPoint);
252 }
WriteExecutionMode(Blob * blob,IdRef entryPoint,spv::ExecutionMode mode,const LiteralIntegerList & operandsList)253 void WriteExecutionMode(Blob *blob,
254                         IdRef entryPoint,
255                         spv::ExecutionMode mode,
256                         const LiteralIntegerList &operandsList)
257 {
258     const size_t startSize = blob->size();
259     blob->push_back(0);
260     blob->push_back(entryPoint);
261     blob->push_back(mode);
262     for (const auto &operand : operandsList)
263     {
264         blob->push_back(operand);
265     }
266     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExecutionMode);
267 }
WriteCapability(Blob * blob,spv::Capability capability)268 void WriteCapability(Blob *blob, spv::Capability capability)
269 {
270     const size_t startSize = blob->size();
271     blob->push_back(0);
272     blob->push_back(capability);
273     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCapability);
274 }
WriteTypeVoid(Blob * blob,IdResult idResult1)275 void WriteTypeVoid(Blob *blob, IdResult idResult1)
276 {
277     const size_t startSize = blob->size();
278     blob->push_back(0);
279     blob->push_back(idResult1);
280     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeVoid);
281 }
WriteTypeBool(Blob * blob,IdResult idResult1)282 void WriteTypeBool(Blob *blob, IdResult idResult1)
283 {
284     const size_t startSize = blob->size();
285     blob->push_back(0);
286     blob->push_back(idResult1);
287     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeBool);
288 }
WriteTypeInt(Blob * blob,IdResult idResult1,LiteralInteger width,LiteralInteger signedness)289 void WriteTypeInt(Blob *blob, IdResult idResult1, LiteralInteger width, LiteralInteger signedness)
290 {
291     const size_t startSize = blob->size();
292     blob->push_back(0);
293     blob->push_back(idResult1);
294     blob->push_back(width);
295     blob->push_back(signedness);
296     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeInt);
297 }
WriteTypeFloat(Blob * blob,IdResult idResult1,LiteralInteger width,const spv::FPEncoding * floatingPointEncoding)298 void WriteTypeFloat(Blob *blob,
299                     IdResult idResult1,
300                     LiteralInteger width,
301                     const spv::FPEncoding *floatingPointEncoding)
302 {
303     const size_t startSize = blob->size();
304     blob->push_back(0);
305     blob->push_back(idResult1);
306     blob->push_back(width);
307     if (floatingPointEncoding)
308     {
309         blob->push_back(*floatingPointEncoding);
310     }
311     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeFloat);
312 }
WriteTypeVector(Blob * blob,IdResult idResult1,IdRef componentType,LiteralInteger componentCount)313 void WriteTypeVector(Blob *blob,
314                      IdResult idResult1,
315                      IdRef componentType,
316                      LiteralInteger componentCount)
317 {
318     const size_t startSize = blob->size();
319     blob->push_back(0);
320     blob->push_back(idResult1);
321     blob->push_back(componentType);
322     blob->push_back(componentCount);
323     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeVector);
324 }
WriteTypeMatrix(Blob * blob,IdResult idResult1,IdRef columnType,LiteralInteger columnCount)325 void WriteTypeMatrix(Blob *blob, IdResult idResult1, IdRef columnType, LiteralInteger columnCount)
326 {
327     const size_t startSize = blob->size();
328     blob->push_back(0);
329     blob->push_back(idResult1);
330     blob->push_back(columnType);
331     blob->push_back(columnCount);
332     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeMatrix);
333 }
WriteTypeImage(Blob * blob,IdResult idResult1,IdRef sampledType,spv::Dim dim3,LiteralInteger depth,LiteralInteger arrayed,LiteralInteger mS,LiteralInteger sampled,spv::ImageFormat imageFormat8,const spv::AccessQualifier * accessQualifier9)334 void WriteTypeImage(Blob *blob,
335                     IdResult idResult1,
336                     IdRef sampledType,
337                     spv::Dim dim3,
338                     LiteralInteger depth,
339                     LiteralInteger arrayed,
340                     LiteralInteger mS,
341                     LiteralInteger sampled,
342                     spv::ImageFormat imageFormat8,
343                     const spv::AccessQualifier *accessQualifier9)
344 {
345     const size_t startSize = blob->size();
346     blob->push_back(0);
347     blob->push_back(idResult1);
348     blob->push_back(sampledType);
349     blob->push_back(dim3);
350     blob->push_back(depth);
351     blob->push_back(arrayed);
352     blob->push_back(mS);
353     blob->push_back(sampled);
354     blob->push_back(imageFormat8);
355     if (accessQualifier9)
356     {
357         blob->push_back(*accessQualifier9);
358     }
359     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeImage);
360 }
WriteTypeSampler(Blob * blob,IdResult idResult1)361 void WriteTypeSampler(Blob *blob, IdResult idResult1)
362 {
363     const size_t startSize = blob->size();
364     blob->push_back(0);
365     blob->push_back(idResult1);
366     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeSampler);
367 }
WriteTypeSampledImage(Blob * blob,IdResult idResult1,IdRef imageType)368 void WriteTypeSampledImage(Blob *blob, IdResult idResult1, IdRef imageType)
369 {
370     const size_t startSize = blob->size();
371     blob->push_back(0);
372     blob->push_back(idResult1);
373     blob->push_back(imageType);
374     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeSampledImage);
375 }
WriteTypeArray(Blob * blob,IdResult idResult1,IdRef elementType,IdRef length)376 void WriteTypeArray(Blob *blob, IdResult idResult1, IdRef elementType, IdRef length)
377 {
378     const size_t startSize = blob->size();
379     blob->push_back(0);
380     blob->push_back(idResult1);
381     blob->push_back(elementType);
382     blob->push_back(length);
383     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeArray);
384 }
WriteTypeRuntimeArray(Blob * blob,IdResult idResult1,IdRef elementType)385 void WriteTypeRuntimeArray(Blob *blob, IdResult idResult1, IdRef elementType)
386 {
387     const size_t startSize = blob->size();
388     blob->push_back(0);
389     blob->push_back(idResult1);
390     blob->push_back(elementType);
391     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeRuntimeArray);
392 }
WriteTypeStruct(Blob * blob,IdResult idResult1,const IdRefList & memberList)393 void WriteTypeStruct(Blob *blob, IdResult idResult1, const IdRefList &memberList)
394 {
395     const size_t startSize = blob->size();
396     blob->push_back(0);
397     blob->push_back(idResult1);
398     for (const auto &operand : memberList)
399     {
400         blob->push_back(operand);
401     }
402     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeStruct);
403 }
WriteTypePointer(Blob * blob,IdResult idResult1,spv::StorageClass storageClass2,IdRef type)404 void WriteTypePointer(Blob *blob, IdResult idResult1, spv::StorageClass storageClass2, IdRef type)
405 {
406     const size_t startSize = blob->size();
407     blob->push_back(0);
408     blob->push_back(idResult1);
409     blob->push_back(storageClass2);
410     blob->push_back(type);
411     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypePointer);
412 }
WriteTypeFunction(Blob * blob,IdResult idResult1,IdRef returnType,const IdRefList & parameterList)413 void WriteTypeFunction(Blob *blob,
414                        IdResult idResult1,
415                        IdRef returnType,
416                        const IdRefList &parameterList)
417 {
418     const size_t startSize = blob->size();
419     blob->push_back(0);
420     blob->push_back(idResult1);
421     blob->push_back(returnType);
422     for (const auto &operand : parameterList)
423     {
424         blob->push_back(operand);
425     }
426     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTypeFunction);
427 }
WriteConstantTrue(Blob * blob,IdResultType idResultType1,IdResult idResult2)428 void WriteConstantTrue(Blob *blob, IdResultType idResultType1, IdResult idResult2)
429 {
430     const size_t startSize = blob->size();
431     blob->push_back(0);
432     blob->push_back(idResultType1);
433     blob->push_back(idResult2);
434     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantTrue);
435 }
WriteConstantFalse(Blob * blob,IdResultType idResultType1,IdResult idResult2)436 void WriteConstantFalse(Blob *blob, IdResultType idResultType1, IdResult idResult2)
437 {
438     const size_t startSize = blob->size();
439     blob->push_back(0);
440     blob->push_back(idResultType1);
441     blob->push_back(idResult2);
442     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantFalse);
443 }
WriteConstant(Blob * blob,IdResultType idResultType1,IdResult idResult2,LiteralContextDependentNumber value)444 void WriteConstant(Blob *blob,
445                    IdResultType idResultType1,
446                    IdResult idResult2,
447                    LiteralContextDependentNumber value)
448 {
449     const size_t startSize = blob->size();
450     blob->push_back(0);
451     blob->push_back(idResultType1);
452     blob->push_back(idResult2);
453     blob->push_back(value);
454     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstant);
455 }
WriteConstantComposite(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)456 void WriteConstantComposite(Blob *blob,
457                             IdResultType idResultType1,
458                             IdResult idResult2,
459                             const IdRefList &constituentsList)
460 {
461     const size_t startSize = blob->size();
462     blob->push_back(0);
463     blob->push_back(idResultType1);
464     blob->push_back(idResult2);
465     for (const auto &operand : constituentsList)
466     {
467         blob->push_back(operand);
468     }
469     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantComposite);
470 }
WriteConstantNull(Blob * blob,IdResultType idResultType1,IdResult idResult2)471 void WriteConstantNull(Blob *blob, IdResultType idResultType1, IdResult idResult2)
472 {
473     const size_t startSize = blob->size();
474     blob->push_back(0);
475     blob->push_back(idResultType1);
476     blob->push_back(idResult2);
477     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConstantNull);
478 }
WriteSpecConstantTrue(Blob * blob,IdResultType idResultType1,IdResult idResult2)479 void WriteSpecConstantTrue(Blob *blob, IdResultType idResultType1, IdResult idResult2)
480 {
481     const size_t startSize = blob->size();
482     blob->push_back(0);
483     blob->push_back(idResultType1);
484     blob->push_back(idResult2);
485     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantTrue);
486 }
WriteSpecConstantFalse(Blob * blob,IdResultType idResultType1,IdResult idResult2)487 void WriteSpecConstantFalse(Blob *blob, IdResultType idResultType1, IdResult idResult2)
488 {
489     const size_t startSize = blob->size();
490     blob->push_back(0);
491     blob->push_back(idResultType1);
492     blob->push_back(idResult2);
493     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantFalse);
494 }
WriteSpecConstant(Blob * blob,IdResultType idResultType1,IdResult idResult2,LiteralContextDependentNumber value)495 void WriteSpecConstant(Blob *blob,
496                        IdResultType idResultType1,
497                        IdResult idResult2,
498                        LiteralContextDependentNumber value)
499 {
500     const size_t startSize = blob->size();
501     blob->push_back(0);
502     blob->push_back(idResultType1);
503     blob->push_back(idResult2);
504     blob->push_back(value);
505     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstant);
506 }
WriteSpecConstantComposite(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)507 void WriteSpecConstantComposite(Blob *blob,
508                                 IdResultType idResultType1,
509                                 IdResult idResult2,
510                                 const IdRefList &constituentsList)
511 {
512     const size_t startSize = blob->size();
513     blob->push_back(0);
514     blob->push_back(idResultType1);
515     blob->push_back(idResult2);
516     for (const auto &operand : constituentsList)
517     {
518         blob->push_back(operand);
519     }
520     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSpecConstantComposite);
521 }
WriteFunction(Blob * blob,IdResultType idResultType1,IdResult idResult2,spv::FunctionControlMask functionControl3,IdRef functionType)522 void WriteFunction(Blob *blob,
523                    IdResultType idResultType1,
524                    IdResult idResult2,
525                    spv::FunctionControlMask functionControl3,
526                    IdRef functionType)
527 {
528     const size_t startSize = blob->size();
529     blob->push_back(0);
530     blob->push_back(idResultType1);
531     blob->push_back(idResult2);
532     blob->push_back(functionControl3);
533     blob->push_back(functionType);
534     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunction);
535 }
WriteFunctionParameter(Blob * blob,IdResultType idResultType1,IdResult idResult2)536 void WriteFunctionParameter(Blob *blob, IdResultType idResultType1, IdResult idResult2)
537 {
538     const size_t startSize = blob->size();
539     blob->push_back(0);
540     blob->push_back(idResultType1);
541     blob->push_back(idResult2);
542     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionParameter);
543 }
WriteFunctionEnd(Blob * blob)544 void WriteFunctionEnd(Blob *blob)
545 {
546     const size_t startSize = blob->size();
547     blob->push_back(0);
548 
549     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionEnd);
550 }
WriteFunctionCall(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef function,const IdRefList & argumentList)551 void WriteFunctionCall(Blob *blob,
552                        IdResultType idResultType1,
553                        IdResult idResult2,
554                        IdRef function,
555                        const IdRefList &argumentList)
556 {
557     const size_t startSize = blob->size();
558     blob->push_back(0);
559     blob->push_back(idResultType1);
560     blob->push_back(idResult2);
561     blob->push_back(function);
562     for (const auto &operand : argumentList)
563     {
564         blob->push_back(operand);
565     }
566     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFunctionCall);
567 }
WriteVariable(Blob * blob,IdResultType idResultType1,IdResult idResult2,spv::StorageClass storageClass3,const IdRef * initializer)568 void WriteVariable(Blob *blob,
569                    IdResultType idResultType1,
570                    IdResult idResult2,
571                    spv::StorageClass storageClass3,
572                    const IdRef *initializer)
573 {
574     const size_t startSize = blob->size();
575     blob->push_back(0);
576     blob->push_back(idResultType1);
577     blob->push_back(idResult2);
578     blob->push_back(storageClass3);
579     if (initializer)
580     {
581         blob->push_back(*initializer);
582     }
583     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVariable);
584 }
WriteImageTexelPointer(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,IdRef sample)585 void WriteImageTexelPointer(Blob *blob,
586                             IdResultType idResultType1,
587                             IdResult idResult2,
588                             IdRef image,
589                             IdRef coordinate,
590                             IdRef sample)
591 {
592     const size_t startSize = blob->size();
593     blob->push_back(0);
594     blob->push_back(idResultType1);
595     blob->push_back(idResult2);
596     blob->push_back(image);
597     blob->push_back(coordinate);
598     blob->push_back(sample);
599     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageTexelPointer);
600 }
WriteLoad(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,const spv::MemoryAccessMask * memoryAccess4)601 void WriteLoad(Blob *blob,
602                IdResultType idResultType1,
603                IdResult idResult2,
604                IdRef pointer,
605                const spv::MemoryAccessMask *memoryAccess4)
606 {
607     const size_t startSize = blob->size();
608     blob->push_back(0);
609     blob->push_back(idResultType1);
610     blob->push_back(idResult2);
611     blob->push_back(pointer);
612     if (memoryAccess4)
613     {
614         blob->push_back(*memoryAccess4);
615     }
616     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLoad);
617 }
WriteStore(Blob * blob,IdRef pointer,IdRef object,const spv::MemoryAccessMask * memoryAccess3)618 void WriteStore(Blob *blob, IdRef pointer, IdRef object, const spv::MemoryAccessMask *memoryAccess3)
619 {
620     const size_t startSize = blob->size();
621     blob->push_back(0);
622     blob->push_back(pointer);
623     blob->push_back(object);
624     if (memoryAccess3)
625     {
626         blob->push_back(*memoryAccess3);
627     }
628     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpStore);
629 }
WriteCopyMemory(Blob * blob,IdRef target,IdRef source,const spv::MemoryAccessMask * memoryAccess3,const spv::MemoryAccessMask * memoryAccess4)630 void WriteCopyMemory(Blob *blob,
631                      IdRef target,
632                      IdRef source,
633                      const spv::MemoryAccessMask *memoryAccess3,
634                      const spv::MemoryAccessMask *memoryAccess4)
635 {
636     const size_t startSize = blob->size();
637     blob->push_back(0);
638     blob->push_back(target);
639     blob->push_back(source);
640     if (memoryAccess3)
641     {
642         blob->push_back(*memoryAccess3);
643     }
644     if (memoryAccess4)
645     {
646         blob->push_back(*memoryAccess4);
647     }
648     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyMemory);
649 }
WriteAccessChain(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,const IdRefList & indexesList)650 void WriteAccessChain(Blob *blob,
651                       IdResultType idResultType1,
652                       IdResult idResult2,
653                       IdRef base,
654                       const IdRefList &indexesList)
655 {
656     const size_t startSize = blob->size();
657     blob->push_back(0);
658     blob->push_back(idResultType1);
659     blob->push_back(idResult2);
660     blob->push_back(base);
661     for (const auto &operand : indexesList)
662     {
663         blob->push_back(operand);
664     }
665     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAccessChain);
666 }
WriteInBoundsAccessChain(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,const IdRefList & indexesList)667 void WriteInBoundsAccessChain(Blob *blob,
668                               IdResultType idResultType1,
669                               IdResult idResult2,
670                               IdRef base,
671                               const IdRefList &indexesList)
672 {
673     const size_t startSize = blob->size();
674     blob->push_back(0);
675     blob->push_back(idResultType1);
676     blob->push_back(idResult2);
677     blob->push_back(base);
678     for (const auto &operand : indexesList)
679     {
680         blob->push_back(operand);
681     }
682     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpInBoundsAccessChain);
683 }
WriteArrayLength(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef structure,LiteralInteger arraymember)684 void WriteArrayLength(Blob *blob,
685                       IdResultType idResultType1,
686                       IdResult idResult2,
687                       IdRef structure,
688                       LiteralInteger arraymember)
689 {
690     const size_t startSize = blob->size();
691     blob->push_back(0);
692     blob->push_back(idResultType1);
693     blob->push_back(idResult2);
694     blob->push_back(structure);
695     blob->push_back(arraymember);
696     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpArrayLength);
697 }
WriteDecorate(Blob * blob,IdRef target,spv::Decoration decoration2,const LiteralIntegerList & valuesList)698 void WriteDecorate(Blob *blob,
699                    IdRef target,
700                    spv::Decoration decoration2,
701                    const LiteralIntegerList &valuesList)
702 {
703     const size_t startSize = blob->size();
704     blob->push_back(0);
705     blob->push_back(target);
706     blob->push_back(decoration2);
707     for (const auto &operand : valuesList)
708     {
709         blob->push_back(operand);
710     }
711     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDecorate);
712 }
WriteMemberDecorate(Blob * blob,IdRef structureType,LiteralInteger member,spv::Decoration decoration3,const LiteralIntegerList & valuesList)713 void WriteMemberDecorate(Blob *blob,
714                          IdRef structureType,
715                          LiteralInteger member,
716                          spv::Decoration decoration3,
717                          const LiteralIntegerList &valuesList)
718 {
719     const size_t startSize = blob->size();
720     blob->push_back(0);
721     blob->push_back(structureType);
722     blob->push_back(member);
723     blob->push_back(decoration3);
724     for (const auto &operand : valuesList)
725     {
726         blob->push_back(operand);
727     }
728     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemberDecorate);
729 }
WriteDecorationGroup(Blob * blob,IdResult idResult1)730 void WriteDecorationGroup(Blob *blob, IdResult idResult1)
731 {
732     const size_t startSize = blob->size();
733     blob->push_back(0);
734     blob->push_back(idResult1);
735     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDecorationGroup);
736 }
WriteGroupDecorate(Blob * blob,IdRef decorationGroup,const IdRefList & targetsList)737 void WriteGroupDecorate(Blob *blob, IdRef decorationGroup, const IdRefList &targetsList)
738 {
739     const size_t startSize = blob->size();
740     blob->push_back(0);
741     blob->push_back(decorationGroup);
742     for (const auto &operand : targetsList)
743     {
744         blob->push_back(operand);
745     }
746     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupDecorate);
747 }
WriteGroupMemberDecorate(Blob * blob,IdRef decorationGroup,const PairIdRefLiteralIntegerList & targetsPairList)748 void WriteGroupMemberDecorate(Blob *blob,
749                               IdRef decorationGroup,
750                               const PairIdRefLiteralIntegerList &targetsPairList)
751 {
752     const size_t startSize = blob->size();
753     blob->push_back(0);
754     blob->push_back(decorationGroup);
755     for (const auto &operand : targetsPairList)
756     {
757         blob->push_back(operand.id);
758         blob->push_back(operand.literal);
759     }
760     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupMemberDecorate);
761 }
WriteVectorExtractDynamic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef index)762 void WriteVectorExtractDynamic(Blob *blob,
763                                IdResultType idResultType1,
764                                IdResult idResult2,
765                                IdRef vector,
766                                IdRef index)
767 {
768     const size_t startSize = blob->size();
769     blob->push_back(0);
770     blob->push_back(idResultType1);
771     blob->push_back(idResult2);
772     blob->push_back(vector);
773     blob->push_back(index);
774     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorExtractDynamic);
775 }
WriteVectorInsertDynamic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef component,IdRef index)776 void WriteVectorInsertDynamic(Blob *blob,
777                               IdResultType idResultType1,
778                               IdResult idResult2,
779                               IdRef vector,
780                               IdRef component,
781                               IdRef index)
782 {
783     const size_t startSize = blob->size();
784     blob->push_back(0);
785     blob->push_back(idResultType1);
786     blob->push_back(idResult2);
787     blob->push_back(vector);
788     blob->push_back(component);
789     blob->push_back(index);
790     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorInsertDynamic);
791 }
WriteVectorShuffle(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2,const LiteralIntegerList & componentsList)792 void WriteVectorShuffle(Blob *blob,
793                         IdResultType idResultType1,
794                         IdResult idResult2,
795                         IdRef vector1,
796                         IdRef vector2,
797                         const LiteralIntegerList &componentsList)
798 {
799     const size_t startSize = blob->size();
800     blob->push_back(0);
801     blob->push_back(idResultType1);
802     blob->push_back(idResult2);
803     blob->push_back(vector1);
804     blob->push_back(vector2);
805     for (const auto &operand : componentsList)
806     {
807         blob->push_back(operand);
808     }
809     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorShuffle);
810 }
WriteCompositeConstruct(Blob * blob,IdResultType idResultType1,IdResult idResult2,const IdRefList & constituentsList)811 void WriteCompositeConstruct(Blob *blob,
812                              IdResultType idResultType1,
813                              IdResult idResult2,
814                              const IdRefList &constituentsList)
815 {
816     const size_t startSize = blob->size();
817     blob->push_back(0);
818     blob->push_back(idResultType1);
819     blob->push_back(idResult2);
820     for (const auto &operand : constituentsList)
821     {
822         blob->push_back(operand);
823     }
824     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeConstruct);
825 }
WriteCompositeExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef composite,const LiteralIntegerList & indexesList)826 void WriteCompositeExtract(Blob *blob,
827                            IdResultType idResultType1,
828                            IdResult idResult2,
829                            IdRef composite,
830                            const LiteralIntegerList &indexesList)
831 {
832     const size_t startSize = blob->size();
833     blob->push_back(0);
834     blob->push_back(idResultType1);
835     blob->push_back(idResult2);
836     blob->push_back(composite);
837     for (const auto &operand : indexesList)
838     {
839         blob->push_back(operand);
840     }
841     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeExtract);
842 }
WriteCompositeInsert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef object,IdRef composite,const LiteralIntegerList & indexesList)843 void WriteCompositeInsert(Blob *blob,
844                           IdResultType idResultType1,
845                           IdResult idResult2,
846                           IdRef object,
847                           IdRef composite,
848                           const LiteralIntegerList &indexesList)
849 {
850     const size_t startSize = blob->size();
851     blob->push_back(0);
852     blob->push_back(idResultType1);
853     blob->push_back(idResult2);
854     blob->push_back(object);
855     blob->push_back(composite);
856     for (const auto &operand : indexesList)
857     {
858         blob->push_back(operand);
859     }
860     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCompositeInsert);
861 }
WriteCopyObject(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)862 void WriteCopyObject(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
863 {
864     const size_t startSize = blob->size();
865     blob->push_back(0);
866     blob->push_back(idResultType1);
867     blob->push_back(idResult2);
868     blob->push_back(operand);
869     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyObject);
870 }
WriteTranspose(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix)871 void WriteTranspose(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef matrix)
872 {
873     const size_t startSize = blob->size();
874     blob->push_back(0);
875     blob->push_back(idResultType1);
876     blob->push_back(idResult2);
877     blob->push_back(matrix);
878     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpTranspose);
879 }
WriteSampledImage(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef sampler)880 void WriteSampledImage(Blob *blob,
881                        IdResultType idResultType1,
882                        IdResult idResult2,
883                        IdRef image,
884                        IdRef sampler)
885 {
886     const size_t startSize = blob->size();
887     blob->push_back(0);
888     blob->push_back(idResultType1);
889     blob->push_back(idResult2);
890     blob->push_back(image);
891     blob->push_back(sampler);
892     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSampledImage);
893 }
WriteImageSampleImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)894 void WriteImageSampleImplicitLod(Blob *blob,
895                                  IdResultType idResultType1,
896                                  IdResult idResult2,
897                                  IdRef sampledImage,
898                                  IdRef coordinate,
899                                  const spv::ImageOperandsMask *imageOperands5,
900                                  const IdRefList &imageOperandIdsList)
901 {
902     const size_t startSize = blob->size();
903     blob->push_back(0);
904     blob->push_back(idResultType1);
905     blob->push_back(idResult2);
906     blob->push_back(sampledImage);
907     blob->push_back(coordinate);
908     if (imageOperands5)
909     {
910         blob->push_back(*imageOperands5);
911     }
912     for (const auto &operand : imageOperandIdsList)
913     {
914         blob->push_back(operand);
915     }
916     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleImplicitLod);
917 }
WriteImageSampleExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)918 void WriteImageSampleExplicitLod(Blob *blob,
919                                  IdResultType idResultType1,
920                                  IdResult idResult2,
921                                  IdRef sampledImage,
922                                  IdRef coordinate,
923                                  spv::ImageOperandsMask imageOperands5,
924                                  const IdRefList &imageOperandIdsList)
925 {
926     const size_t startSize = blob->size();
927     blob->push_back(0);
928     blob->push_back(idResultType1);
929     blob->push_back(idResult2);
930     blob->push_back(sampledImage);
931     blob->push_back(coordinate);
932     blob->push_back(imageOperands5);
933     for (const auto &operand : imageOperandIdsList)
934     {
935         blob->push_back(operand);
936     }
937     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleExplicitLod);
938 }
WriteImageSampleDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)939 void WriteImageSampleDrefImplicitLod(Blob *blob,
940                                      IdResultType idResultType1,
941                                      IdResult idResult2,
942                                      IdRef sampledImage,
943                                      IdRef coordinate,
944                                      IdRef dref,
945                                      const spv::ImageOperandsMask *imageOperands6,
946                                      const IdRefList &imageOperandIdsList)
947 {
948     const size_t startSize = blob->size();
949     blob->push_back(0);
950     blob->push_back(idResultType1);
951     blob->push_back(idResult2);
952     blob->push_back(sampledImage);
953     blob->push_back(coordinate);
954     blob->push_back(dref);
955     if (imageOperands6)
956     {
957         blob->push_back(*imageOperands6);
958     }
959     for (const auto &operand : imageOperandIdsList)
960     {
961         blob->push_back(operand);
962     }
963     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleDrefImplicitLod);
964 }
WriteImageSampleDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)965 void WriteImageSampleDrefExplicitLod(Blob *blob,
966                                      IdResultType idResultType1,
967                                      IdResult idResult2,
968                                      IdRef sampledImage,
969                                      IdRef coordinate,
970                                      IdRef dref,
971                                      spv::ImageOperandsMask imageOperands6,
972                                      const IdRefList &imageOperandIdsList)
973 {
974     const size_t startSize = blob->size();
975     blob->push_back(0);
976     blob->push_back(idResultType1);
977     blob->push_back(idResult2);
978     blob->push_back(sampledImage);
979     blob->push_back(coordinate);
980     blob->push_back(dref);
981     blob->push_back(imageOperands6);
982     for (const auto &operand : imageOperandIdsList)
983     {
984         blob->push_back(operand);
985     }
986     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleDrefExplicitLod);
987 }
WriteImageSampleProjImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)988 void WriteImageSampleProjImplicitLod(Blob *blob,
989                                      IdResultType idResultType1,
990                                      IdResult idResult2,
991                                      IdRef sampledImage,
992                                      IdRef coordinate,
993                                      const spv::ImageOperandsMask *imageOperands5,
994                                      const IdRefList &imageOperandIdsList)
995 {
996     const size_t startSize = blob->size();
997     blob->push_back(0);
998     blob->push_back(idResultType1);
999     blob->push_back(idResult2);
1000     blob->push_back(sampledImage);
1001     blob->push_back(coordinate);
1002     if (imageOperands5)
1003     {
1004         blob->push_back(*imageOperands5);
1005     }
1006     for (const auto &operand : imageOperandIdsList)
1007     {
1008         blob->push_back(operand);
1009     }
1010     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjImplicitLod);
1011 }
WriteImageSampleProjExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)1012 void WriteImageSampleProjExplicitLod(Blob *blob,
1013                                      IdResultType idResultType1,
1014                                      IdResult idResult2,
1015                                      IdRef sampledImage,
1016                                      IdRef coordinate,
1017                                      spv::ImageOperandsMask imageOperands5,
1018                                      const IdRefList &imageOperandIdsList)
1019 {
1020     const size_t startSize = blob->size();
1021     blob->push_back(0);
1022     blob->push_back(idResultType1);
1023     blob->push_back(idResult2);
1024     blob->push_back(sampledImage);
1025     blob->push_back(coordinate);
1026     blob->push_back(imageOperands5);
1027     for (const auto &operand : imageOperandIdsList)
1028     {
1029         blob->push_back(operand);
1030     }
1031     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjExplicitLod);
1032 }
WriteImageSampleProjDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1033 void WriteImageSampleProjDrefImplicitLod(Blob *blob,
1034                                          IdResultType idResultType1,
1035                                          IdResult idResult2,
1036                                          IdRef sampledImage,
1037                                          IdRef coordinate,
1038                                          IdRef dref,
1039                                          const spv::ImageOperandsMask *imageOperands6,
1040                                          const IdRefList &imageOperandIdsList)
1041 {
1042     const size_t startSize = blob->size();
1043     blob->push_back(0);
1044     blob->push_back(idResultType1);
1045     blob->push_back(idResult2);
1046     blob->push_back(sampledImage);
1047     blob->push_back(coordinate);
1048     blob->push_back(dref);
1049     if (imageOperands6)
1050     {
1051         blob->push_back(*imageOperands6);
1052     }
1053     for (const auto &operand : imageOperandIdsList)
1054     {
1055         blob->push_back(operand);
1056     }
1057     (*blob)[startSize] =
1058         MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjDrefImplicitLod);
1059 }
WriteImageSampleProjDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)1060 void WriteImageSampleProjDrefExplicitLod(Blob *blob,
1061                                          IdResultType idResultType1,
1062                                          IdResult idResult2,
1063                                          IdRef sampledImage,
1064                                          IdRef coordinate,
1065                                          IdRef dref,
1066                                          spv::ImageOperandsMask imageOperands6,
1067                                          const IdRefList &imageOperandIdsList)
1068 {
1069     const size_t startSize = blob->size();
1070     blob->push_back(0);
1071     blob->push_back(idResultType1);
1072     blob->push_back(idResult2);
1073     blob->push_back(sampledImage);
1074     blob->push_back(coordinate);
1075     blob->push_back(dref);
1076     blob->push_back(imageOperands6);
1077     for (const auto &operand : imageOperandIdsList)
1078     {
1079         blob->push_back(operand);
1080     }
1081     (*blob)[startSize] =
1082         MakeLengthOp(blob->size() - startSize, spv::OpImageSampleProjDrefExplicitLod);
1083 }
WriteImageFetch(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)1084 void WriteImageFetch(Blob *blob,
1085                      IdResultType idResultType1,
1086                      IdResult idResult2,
1087                      IdRef image,
1088                      IdRef coordinate,
1089                      const spv::ImageOperandsMask *imageOperands5,
1090                      const IdRefList &imageOperandIdsList)
1091 {
1092     const size_t startSize = blob->size();
1093     blob->push_back(0);
1094     blob->push_back(idResultType1);
1095     blob->push_back(idResult2);
1096     blob->push_back(image);
1097     blob->push_back(coordinate);
1098     if (imageOperands5)
1099     {
1100         blob->push_back(*imageOperands5);
1101     }
1102     for (const auto &operand : imageOperandIdsList)
1103     {
1104         blob->push_back(operand);
1105     }
1106     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageFetch);
1107 }
WriteImageGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef component,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1108 void WriteImageGather(Blob *blob,
1109                       IdResultType idResultType1,
1110                       IdResult idResult2,
1111                       IdRef sampledImage,
1112                       IdRef coordinate,
1113                       IdRef component,
1114                       const spv::ImageOperandsMask *imageOperands6,
1115                       const IdRefList &imageOperandIdsList)
1116 {
1117     const size_t startSize = blob->size();
1118     blob->push_back(0);
1119     blob->push_back(idResultType1);
1120     blob->push_back(idResult2);
1121     blob->push_back(sampledImage);
1122     blob->push_back(coordinate);
1123     blob->push_back(component);
1124     if (imageOperands6)
1125     {
1126         blob->push_back(*imageOperands6);
1127     }
1128     for (const auto &operand : imageOperandIdsList)
1129     {
1130         blob->push_back(operand);
1131     }
1132     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageGather);
1133 }
WriteImageDrefGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)1134 void WriteImageDrefGather(Blob *blob,
1135                           IdResultType idResultType1,
1136                           IdResult idResult2,
1137                           IdRef sampledImage,
1138                           IdRef coordinate,
1139                           IdRef dref,
1140                           const spv::ImageOperandsMask *imageOperands6,
1141                           const IdRefList &imageOperandIdsList)
1142 {
1143     const size_t startSize = blob->size();
1144     blob->push_back(0);
1145     blob->push_back(idResultType1);
1146     blob->push_back(idResult2);
1147     blob->push_back(sampledImage);
1148     blob->push_back(coordinate);
1149     blob->push_back(dref);
1150     if (imageOperands6)
1151     {
1152         blob->push_back(*imageOperands6);
1153     }
1154     for (const auto &operand : imageOperandIdsList)
1155     {
1156         blob->push_back(operand);
1157     }
1158     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageDrefGather);
1159 }
WriteImageRead(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)1160 void WriteImageRead(Blob *blob,
1161                     IdResultType idResultType1,
1162                     IdResult idResult2,
1163                     IdRef image,
1164                     IdRef coordinate,
1165                     const spv::ImageOperandsMask *imageOperands5,
1166                     const IdRefList &imageOperandIdsList)
1167 {
1168     const size_t startSize = blob->size();
1169     blob->push_back(0);
1170     blob->push_back(idResultType1);
1171     blob->push_back(idResult2);
1172     blob->push_back(image);
1173     blob->push_back(coordinate);
1174     if (imageOperands5)
1175     {
1176         blob->push_back(*imageOperands5);
1177     }
1178     for (const auto &operand : imageOperandIdsList)
1179     {
1180         blob->push_back(operand);
1181     }
1182     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageRead);
1183 }
WriteImageWrite(Blob * blob,IdRef image,IdRef coordinate,IdRef texel,const spv::ImageOperandsMask * imageOperands4,const IdRefList & imageOperandIdsList)1184 void WriteImageWrite(Blob *blob,
1185                      IdRef image,
1186                      IdRef coordinate,
1187                      IdRef texel,
1188                      const spv::ImageOperandsMask *imageOperands4,
1189                      const IdRefList &imageOperandIdsList)
1190 {
1191     const size_t startSize = blob->size();
1192     blob->push_back(0);
1193     blob->push_back(image);
1194     blob->push_back(coordinate);
1195     blob->push_back(texel);
1196     if (imageOperands4)
1197     {
1198         blob->push_back(*imageOperands4);
1199     }
1200     for (const auto &operand : imageOperandIdsList)
1201     {
1202         blob->push_back(operand);
1203     }
1204     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageWrite);
1205 }
WriteImage(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage)1206 void WriteImage(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef sampledImage)
1207 {
1208     const size_t startSize = blob->size();
1209     blob->push_back(0);
1210     blob->push_back(idResultType1);
1211     blob->push_back(idResult2);
1212     blob->push_back(sampledImage);
1213     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImage);
1214 }
WriteImageQuerySizeLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef levelofDetail)1215 void WriteImageQuerySizeLod(Blob *blob,
1216                             IdResultType idResultType1,
1217                             IdResult idResult2,
1218                             IdRef image,
1219                             IdRef levelofDetail)
1220 {
1221     const size_t startSize = blob->size();
1222     blob->push_back(0);
1223     blob->push_back(idResultType1);
1224     blob->push_back(idResult2);
1225     blob->push_back(image);
1226     blob->push_back(levelofDetail);
1227     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySizeLod);
1228 }
WriteImageQuerySize(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1229 void WriteImageQuerySize(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1230 {
1231     const size_t startSize = blob->size();
1232     blob->push_back(0);
1233     blob->push_back(idResultType1);
1234     blob->push_back(idResult2);
1235     blob->push_back(image);
1236     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySize);
1237 }
WriteImageQueryLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate)1238 void WriteImageQueryLod(Blob *blob,
1239                         IdResultType idResultType1,
1240                         IdResult idResult2,
1241                         IdRef sampledImage,
1242                         IdRef coordinate)
1243 {
1244     const size_t startSize = blob->size();
1245     blob->push_back(0);
1246     blob->push_back(idResultType1);
1247     blob->push_back(idResult2);
1248     blob->push_back(sampledImage);
1249     blob->push_back(coordinate);
1250     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQueryLod);
1251 }
WriteImageQueryLevels(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1252 void WriteImageQueryLevels(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1253 {
1254     const size_t startSize = blob->size();
1255     blob->push_back(0);
1256     blob->push_back(idResultType1);
1257     blob->push_back(idResult2);
1258     blob->push_back(image);
1259     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQueryLevels);
1260 }
WriteImageQuerySamples(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image)1261 void WriteImageQuerySamples(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef image)
1262 {
1263     const size_t startSize = blob->size();
1264     blob->push_back(0);
1265     blob->push_back(idResultType1);
1266     blob->push_back(idResult2);
1267     blob->push_back(image);
1268     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageQuerySamples);
1269 }
WriteConvertFToU(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1270 void WriteConvertFToU(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1271 {
1272     const size_t startSize = blob->size();
1273     blob->push_back(0);
1274     blob->push_back(idResultType1);
1275     blob->push_back(idResult2);
1276     blob->push_back(floatValue);
1277     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertFToU);
1278 }
WriteConvertFToS(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1279 void WriteConvertFToS(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1280 {
1281     const size_t startSize = blob->size();
1282     blob->push_back(0);
1283     blob->push_back(idResultType1);
1284     blob->push_back(idResult2);
1285     blob->push_back(floatValue);
1286     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertFToS);
1287 }
WriteConvertSToF(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef signedValue)1288 void WriteConvertSToF(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef signedValue)
1289 {
1290     const size_t startSize = blob->size();
1291     blob->push_back(0);
1292     blob->push_back(idResultType1);
1293     blob->push_back(idResult2);
1294     blob->push_back(signedValue);
1295     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertSToF);
1296 }
WriteConvertUToF(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef unsignedValue)1297 void WriteConvertUToF(Blob *blob,
1298                       IdResultType idResultType1,
1299                       IdResult idResult2,
1300                       IdRef unsignedValue)
1301 {
1302     const size_t startSize = blob->size();
1303     blob->push_back(0);
1304     blob->push_back(idResultType1);
1305     blob->push_back(idResult2);
1306     blob->push_back(unsignedValue);
1307     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpConvertUToF);
1308 }
WriteUConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef unsignedValue)1309 void WriteUConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef unsignedValue)
1310 {
1311     const size_t startSize = blob->size();
1312     blob->push_back(0);
1313     blob->push_back(idResultType1);
1314     blob->push_back(idResult2);
1315     blob->push_back(unsignedValue);
1316     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUConvert);
1317 }
WriteSConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef signedValue)1318 void WriteSConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef signedValue)
1319 {
1320     const size_t startSize = blob->size();
1321     blob->push_back(0);
1322     blob->push_back(idResultType1);
1323     blob->push_back(idResult2);
1324     blob->push_back(signedValue);
1325     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSConvert);
1326 }
WriteFConvert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef floatValue)1327 void WriteFConvert(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef floatValue)
1328 {
1329     const size_t startSize = blob->size();
1330     blob->push_back(0);
1331     blob->push_back(idResultType1);
1332     blob->push_back(idResult2);
1333     blob->push_back(floatValue);
1334     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFConvert);
1335 }
WriteQuantizeToF16(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef value)1336 void WriteQuantizeToF16(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef value)
1337 {
1338     const size_t startSize = blob->size();
1339     blob->push_back(0);
1340     blob->push_back(idResultType1);
1341     blob->push_back(idResult2);
1342     blob->push_back(value);
1343     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpQuantizeToF16);
1344 }
WriteBitcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1345 void WriteBitcast(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1346 {
1347     const size_t startSize = blob->size();
1348     blob->push_back(0);
1349     blob->push_back(idResultType1);
1350     blob->push_back(idResult2);
1351     blob->push_back(operand);
1352     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitcast);
1353 }
WriteSNegate(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1354 void WriteSNegate(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1355 {
1356     const size_t startSize = blob->size();
1357     blob->push_back(0);
1358     blob->push_back(idResultType1);
1359     blob->push_back(idResult2);
1360     blob->push_back(operand);
1361     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSNegate);
1362 }
WriteFNegate(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1363 void WriteFNegate(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1364 {
1365     const size_t startSize = blob->size();
1366     blob->push_back(0);
1367     blob->push_back(idResultType1);
1368     blob->push_back(idResult2);
1369     blob->push_back(operand);
1370     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFNegate);
1371 }
WriteIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1372 void WriteIAdd(Blob *blob,
1373                IdResultType idResultType1,
1374                IdResult idResult2,
1375                IdRef operand1,
1376                IdRef operand2)
1377 {
1378     const size_t startSize = blob->size();
1379     blob->push_back(0);
1380     blob->push_back(idResultType1);
1381     blob->push_back(idResult2);
1382     blob->push_back(operand1);
1383     blob->push_back(operand2);
1384     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIAdd);
1385 }
WriteFAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1386 void WriteFAdd(Blob *blob,
1387                IdResultType idResultType1,
1388                IdResult idResult2,
1389                IdRef operand1,
1390                IdRef operand2)
1391 {
1392     const size_t startSize = blob->size();
1393     blob->push_back(0);
1394     blob->push_back(idResultType1);
1395     blob->push_back(idResult2);
1396     blob->push_back(operand1);
1397     blob->push_back(operand2);
1398     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFAdd);
1399 }
WriteISub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1400 void WriteISub(Blob *blob,
1401                IdResultType idResultType1,
1402                IdResult idResult2,
1403                IdRef operand1,
1404                IdRef operand2)
1405 {
1406     const size_t startSize = blob->size();
1407     blob->push_back(0);
1408     blob->push_back(idResultType1);
1409     blob->push_back(idResult2);
1410     blob->push_back(operand1);
1411     blob->push_back(operand2);
1412     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpISub);
1413 }
WriteFSub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1414 void WriteFSub(Blob *blob,
1415                IdResultType idResultType1,
1416                IdResult idResult2,
1417                IdRef operand1,
1418                IdRef operand2)
1419 {
1420     const size_t startSize = blob->size();
1421     blob->push_back(0);
1422     blob->push_back(idResultType1);
1423     blob->push_back(idResult2);
1424     blob->push_back(operand1);
1425     blob->push_back(operand2);
1426     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFSub);
1427 }
WriteIMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1428 void WriteIMul(Blob *blob,
1429                IdResultType idResultType1,
1430                IdResult idResult2,
1431                IdRef operand1,
1432                IdRef operand2)
1433 {
1434     const size_t startSize = blob->size();
1435     blob->push_back(0);
1436     blob->push_back(idResultType1);
1437     blob->push_back(idResult2);
1438     blob->push_back(operand1);
1439     blob->push_back(operand2);
1440     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIMul);
1441 }
WriteFMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1442 void WriteFMul(Blob *blob,
1443                IdResultType idResultType1,
1444                IdResult idResult2,
1445                IdRef operand1,
1446                IdRef operand2)
1447 {
1448     const size_t startSize = blob->size();
1449     blob->push_back(0);
1450     blob->push_back(idResultType1);
1451     blob->push_back(idResult2);
1452     blob->push_back(operand1);
1453     blob->push_back(operand2);
1454     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFMul);
1455 }
WriteUDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1456 void WriteUDiv(Blob *blob,
1457                IdResultType idResultType1,
1458                IdResult idResult2,
1459                IdRef operand1,
1460                IdRef operand2)
1461 {
1462     const size_t startSize = blob->size();
1463     blob->push_back(0);
1464     blob->push_back(idResultType1);
1465     blob->push_back(idResult2);
1466     blob->push_back(operand1);
1467     blob->push_back(operand2);
1468     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUDiv);
1469 }
WriteSDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1470 void WriteSDiv(Blob *blob,
1471                IdResultType idResultType1,
1472                IdResult idResult2,
1473                IdRef operand1,
1474                IdRef operand2)
1475 {
1476     const size_t startSize = blob->size();
1477     blob->push_back(0);
1478     blob->push_back(idResultType1);
1479     blob->push_back(idResult2);
1480     blob->push_back(operand1);
1481     blob->push_back(operand2);
1482     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSDiv);
1483 }
WriteFDiv(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1484 void WriteFDiv(Blob *blob,
1485                IdResultType idResultType1,
1486                IdResult idResult2,
1487                IdRef operand1,
1488                IdRef operand2)
1489 {
1490     const size_t startSize = blob->size();
1491     blob->push_back(0);
1492     blob->push_back(idResultType1);
1493     blob->push_back(idResult2);
1494     blob->push_back(operand1);
1495     blob->push_back(operand2);
1496     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFDiv);
1497 }
WriteUMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1498 void WriteUMod(Blob *blob,
1499                IdResultType idResultType1,
1500                IdResult idResult2,
1501                IdRef operand1,
1502                IdRef operand2)
1503 {
1504     const size_t startSize = blob->size();
1505     blob->push_back(0);
1506     blob->push_back(idResultType1);
1507     blob->push_back(idResult2);
1508     blob->push_back(operand1);
1509     blob->push_back(operand2);
1510     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUMod);
1511 }
WriteSRem(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1512 void WriteSRem(Blob *blob,
1513                IdResultType idResultType1,
1514                IdResult idResult2,
1515                IdRef operand1,
1516                IdRef operand2)
1517 {
1518     const size_t startSize = blob->size();
1519     blob->push_back(0);
1520     blob->push_back(idResultType1);
1521     blob->push_back(idResult2);
1522     blob->push_back(operand1);
1523     blob->push_back(operand2);
1524     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSRem);
1525 }
WriteSMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1526 void WriteSMod(Blob *blob,
1527                IdResultType idResultType1,
1528                IdResult idResult2,
1529                IdRef operand1,
1530                IdRef operand2)
1531 {
1532     const size_t startSize = blob->size();
1533     blob->push_back(0);
1534     blob->push_back(idResultType1);
1535     blob->push_back(idResult2);
1536     blob->push_back(operand1);
1537     blob->push_back(operand2);
1538     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSMod);
1539 }
WriteFRem(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1540 void WriteFRem(Blob *blob,
1541                IdResultType idResultType1,
1542                IdResult idResult2,
1543                IdRef operand1,
1544                IdRef operand2)
1545 {
1546     const size_t startSize = blob->size();
1547     blob->push_back(0);
1548     blob->push_back(idResultType1);
1549     blob->push_back(idResult2);
1550     blob->push_back(operand1);
1551     blob->push_back(operand2);
1552     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFRem);
1553 }
WriteFMod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1554 void WriteFMod(Blob *blob,
1555                IdResultType idResultType1,
1556                IdResult idResult2,
1557                IdRef operand1,
1558                IdRef operand2)
1559 {
1560     const size_t startSize = blob->size();
1561     blob->push_back(0);
1562     blob->push_back(idResultType1);
1563     blob->push_back(idResult2);
1564     blob->push_back(operand1);
1565     blob->push_back(operand2);
1566     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFMod);
1567 }
WriteVectorTimesScalar(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef scalar)1568 void WriteVectorTimesScalar(Blob *blob,
1569                             IdResultType idResultType1,
1570                             IdResult idResult2,
1571                             IdRef vector,
1572                             IdRef scalar)
1573 {
1574     const size_t startSize = blob->size();
1575     blob->push_back(0);
1576     blob->push_back(idResultType1);
1577     blob->push_back(idResult2);
1578     blob->push_back(vector);
1579     blob->push_back(scalar);
1580     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorTimesScalar);
1581 }
WriteMatrixTimesScalar(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix,IdRef scalar)1582 void WriteMatrixTimesScalar(Blob *blob,
1583                             IdResultType idResultType1,
1584                             IdResult idResult2,
1585                             IdRef matrix,
1586                             IdRef scalar)
1587 {
1588     const size_t startSize = blob->size();
1589     blob->push_back(0);
1590     blob->push_back(idResultType1);
1591     blob->push_back(idResult2);
1592     blob->push_back(matrix);
1593     blob->push_back(scalar);
1594     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesScalar);
1595 }
WriteVectorTimesMatrix(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector,IdRef matrix)1596 void WriteVectorTimesMatrix(Blob *blob,
1597                             IdResultType idResultType1,
1598                             IdResult idResult2,
1599                             IdRef vector,
1600                             IdRef matrix)
1601 {
1602     const size_t startSize = blob->size();
1603     blob->push_back(0);
1604     blob->push_back(idResultType1);
1605     blob->push_back(idResult2);
1606     blob->push_back(vector);
1607     blob->push_back(matrix);
1608     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpVectorTimesMatrix);
1609 }
WriteMatrixTimesVector(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef matrix,IdRef vector)1610 void WriteMatrixTimesVector(Blob *blob,
1611                             IdResultType idResultType1,
1612                             IdResult idResult2,
1613                             IdRef matrix,
1614                             IdRef vector)
1615 {
1616     const size_t startSize = blob->size();
1617     blob->push_back(0);
1618     blob->push_back(idResultType1);
1619     blob->push_back(idResult2);
1620     blob->push_back(matrix);
1621     blob->push_back(vector);
1622     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesVector);
1623 }
WriteMatrixTimesMatrix(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef leftMatrix,IdRef rightMatrix)1624 void WriteMatrixTimesMatrix(Blob *blob,
1625                             IdResultType idResultType1,
1626                             IdResult idResult2,
1627                             IdRef leftMatrix,
1628                             IdRef rightMatrix)
1629 {
1630     const size_t startSize = blob->size();
1631     blob->push_back(0);
1632     blob->push_back(idResultType1);
1633     blob->push_back(idResult2);
1634     blob->push_back(leftMatrix);
1635     blob->push_back(rightMatrix);
1636     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMatrixTimesMatrix);
1637 }
WriteOuterProduct(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2)1638 void WriteOuterProduct(Blob *blob,
1639                        IdResultType idResultType1,
1640                        IdResult idResult2,
1641                        IdRef vector1,
1642                        IdRef vector2)
1643 {
1644     const size_t startSize = blob->size();
1645     blob->push_back(0);
1646     blob->push_back(idResultType1);
1647     blob->push_back(idResult2);
1648     blob->push_back(vector1);
1649     blob->push_back(vector2);
1650     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpOuterProduct);
1651 }
WriteDot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector1,IdRef vector2)1652 void WriteDot(Blob *blob,
1653               IdResultType idResultType1,
1654               IdResult idResult2,
1655               IdRef vector1,
1656               IdRef vector2)
1657 {
1658     const size_t startSize = blob->size();
1659     blob->push_back(0);
1660     blob->push_back(idResultType1);
1661     blob->push_back(idResult2);
1662     blob->push_back(vector1);
1663     blob->push_back(vector2);
1664     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDot);
1665 }
WriteIAddCarry(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1666 void WriteIAddCarry(Blob *blob,
1667                     IdResultType idResultType1,
1668                     IdResult idResult2,
1669                     IdRef operand1,
1670                     IdRef operand2)
1671 {
1672     const size_t startSize = blob->size();
1673     blob->push_back(0);
1674     blob->push_back(idResultType1);
1675     blob->push_back(idResult2);
1676     blob->push_back(operand1);
1677     blob->push_back(operand2);
1678     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIAddCarry);
1679 }
WriteISubBorrow(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1680 void WriteISubBorrow(Blob *blob,
1681                      IdResultType idResultType1,
1682                      IdResult idResult2,
1683                      IdRef operand1,
1684                      IdRef operand2)
1685 {
1686     const size_t startSize = blob->size();
1687     blob->push_back(0);
1688     blob->push_back(idResultType1);
1689     blob->push_back(idResult2);
1690     blob->push_back(operand1);
1691     blob->push_back(operand2);
1692     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpISubBorrow);
1693 }
WriteUMulExtended(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1694 void WriteUMulExtended(Blob *blob,
1695                        IdResultType idResultType1,
1696                        IdResult idResult2,
1697                        IdRef operand1,
1698                        IdRef operand2)
1699 {
1700     const size_t startSize = blob->size();
1701     blob->push_back(0);
1702     blob->push_back(idResultType1);
1703     blob->push_back(idResult2);
1704     blob->push_back(operand1);
1705     blob->push_back(operand2);
1706     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUMulExtended);
1707 }
WriteSMulExtended(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1708 void WriteSMulExtended(Blob *blob,
1709                        IdResultType idResultType1,
1710                        IdResult idResult2,
1711                        IdRef operand1,
1712                        IdRef operand2)
1713 {
1714     const size_t startSize = blob->size();
1715     blob->push_back(0);
1716     blob->push_back(idResultType1);
1717     blob->push_back(idResult2);
1718     blob->push_back(operand1);
1719     blob->push_back(operand2);
1720     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSMulExtended);
1721 }
WriteAny(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector)1722 void WriteAny(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef vector)
1723 {
1724     const size_t startSize = blob->size();
1725     blob->push_back(0);
1726     blob->push_back(idResultType1);
1727     blob->push_back(idResult2);
1728     blob->push_back(vector);
1729     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAny);
1730 }
WriteAll(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef vector)1731 void WriteAll(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef vector)
1732 {
1733     const size_t startSize = blob->size();
1734     blob->push_back(0);
1735     blob->push_back(idResultType1);
1736     blob->push_back(idResult2);
1737     blob->push_back(vector);
1738     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAll);
1739 }
WriteIsNan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef x)1740 void WriteIsNan(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef x)
1741 {
1742     const size_t startSize = blob->size();
1743     blob->push_back(0);
1744     blob->push_back(idResultType1);
1745     blob->push_back(idResult2);
1746     blob->push_back(x);
1747     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIsNan);
1748 }
WriteIsInf(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef x)1749 void WriteIsInf(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef x)
1750 {
1751     const size_t startSize = blob->size();
1752     blob->push_back(0);
1753     blob->push_back(idResultType1);
1754     blob->push_back(idResult2);
1755     blob->push_back(x);
1756     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIsInf);
1757 }
WriteLogicalEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1758 void WriteLogicalEqual(Blob *blob,
1759                        IdResultType idResultType1,
1760                        IdResult idResult2,
1761                        IdRef operand1,
1762                        IdRef operand2)
1763 {
1764     const size_t startSize = blob->size();
1765     blob->push_back(0);
1766     blob->push_back(idResultType1);
1767     blob->push_back(idResult2);
1768     blob->push_back(operand1);
1769     blob->push_back(operand2);
1770     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalEqual);
1771 }
WriteLogicalNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1772 void WriteLogicalNotEqual(Blob *blob,
1773                           IdResultType idResultType1,
1774                           IdResult idResult2,
1775                           IdRef operand1,
1776                           IdRef operand2)
1777 {
1778     const size_t startSize = blob->size();
1779     blob->push_back(0);
1780     blob->push_back(idResultType1);
1781     blob->push_back(idResult2);
1782     blob->push_back(operand1);
1783     blob->push_back(operand2);
1784     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalNotEqual);
1785 }
WriteLogicalOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1786 void WriteLogicalOr(Blob *blob,
1787                     IdResultType idResultType1,
1788                     IdResult idResult2,
1789                     IdRef operand1,
1790                     IdRef operand2)
1791 {
1792     const size_t startSize = blob->size();
1793     blob->push_back(0);
1794     blob->push_back(idResultType1);
1795     blob->push_back(idResult2);
1796     blob->push_back(operand1);
1797     blob->push_back(operand2);
1798     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalOr);
1799 }
WriteLogicalAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1800 void WriteLogicalAnd(Blob *blob,
1801                      IdResultType idResultType1,
1802                      IdResult idResult2,
1803                      IdRef operand1,
1804                      IdRef operand2)
1805 {
1806     const size_t startSize = blob->size();
1807     blob->push_back(0);
1808     blob->push_back(idResultType1);
1809     blob->push_back(idResult2);
1810     blob->push_back(operand1);
1811     blob->push_back(operand2);
1812     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalAnd);
1813 }
WriteLogicalNot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)1814 void WriteLogicalNot(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
1815 {
1816     const size_t startSize = blob->size();
1817     blob->push_back(0);
1818     blob->push_back(idResultType1);
1819     blob->push_back(idResult2);
1820     blob->push_back(operand);
1821     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLogicalNot);
1822 }
WriteSelect(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef condition,IdRef object1,IdRef object2)1823 void WriteSelect(Blob *blob,
1824                  IdResultType idResultType1,
1825                  IdResult idResult2,
1826                  IdRef condition,
1827                  IdRef object1,
1828                  IdRef object2)
1829 {
1830     const size_t startSize = blob->size();
1831     blob->push_back(0);
1832     blob->push_back(idResultType1);
1833     blob->push_back(idResult2);
1834     blob->push_back(condition);
1835     blob->push_back(object1);
1836     blob->push_back(object2);
1837     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSelect);
1838 }
WriteIEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1839 void WriteIEqual(Blob *blob,
1840                  IdResultType idResultType1,
1841                  IdResult idResult2,
1842                  IdRef operand1,
1843                  IdRef operand2)
1844 {
1845     const size_t startSize = blob->size();
1846     blob->push_back(0);
1847     blob->push_back(idResultType1);
1848     blob->push_back(idResult2);
1849     blob->push_back(operand1);
1850     blob->push_back(operand2);
1851     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpIEqual);
1852 }
WriteINotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1853 void WriteINotEqual(Blob *blob,
1854                     IdResultType idResultType1,
1855                     IdResult idResult2,
1856                     IdRef operand1,
1857                     IdRef operand2)
1858 {
1859     const size_t startSize = blob->size();
1860     blob->push_back(0);
1861     blob->push_back(idResultType1);
1862     blob->push_back(idResult2);
1863     blob->push_back(operand1);
1864     blob->push_back(operand2);
1865     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpINotEqual);
1866 }
WriteUGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1867 void WriteUGreaterThan(Blob *blob,
1868                        IdResultType idResultType1,
1869                        IdResult idResult2,
1870                        IdRef operand1,
1871                        IdRef operand2)
1872 {
1873     const size_t startSize = blob->size();
1874     blob->push_back(0);
1875     blob->push_back(idResultType1);
1876     blob->push_back(idResult2);
1877     blob->push_back(operand1);
1878     blob->push_back(operand2);
1879     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUGreaterThan);
1880 }
WriteSGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1881 void WriteSGreaterThan(Blob *blob,
1882                        IdResultType idResultType1,
1883                        IdResult idResult2,
1884                        IdRef operand1,
1885                        IdRef operand2)
1886 {
1887     const size_t startSize = blob->size();
1888     blob->push_back(0);
1889     blob->push_back(idResultType1);
1890     blob->push_back(idResult2);
1891     blob->push_back(operand1);
1892     blob->push_back(operand2);
1893     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSGreaterThan);
1894 }
WriteUGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1895 void WriteUGreaterThanEqual(Blob *blob,
1896                             IdResultType idResultType1,
1897                             IdResult idResult2,
1898                             IdRef operand1,
1899                             IdRef operand2)
1900 {
1901     const size_t startSize = blob->size();
1902     blob->push_back(0);
1903     blob->push_back(idResultType1);
1904     blob->push_back(idResult2);
1905     blob->push_back(operand1);
1906     blob->push_back(operand2);
1907     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUGreaterThanEqual);
1908 }
WriteSGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1909 void WriteSGreaterThanEqual(Blob *blob,
1910                             IdResultType idResultType1,
1911                             IdResult idResult2,
1912                             IdRef operand1,
1913                             IdRef operand2)
1914 {
1915     const size_t startSize = blob->size();
1916     blob->push_back(0);
1917     blob->push_back(idResultType1);
1918     blob->push_back(idResult2);
1919     blob->push_back(operand1);
1920     blob->push_back(operand2);
1921     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSGreaterThanEqual);
1922 }
WriteULessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1923 void WriteULessThan(Blob *blob,
1924                     IdResultType idResultType1,
1925                     IdResult idResult2,
1926                     IdRef operand1,
1927                     IdRef operand2)
1928 {
1929     const size_t startSize = blob->size();
1930     blob->push_back(0);
1931     blob->push_back(idResultType1);
1932     blob->push_back(idResult2);
1933     blob->push_back(operand1);
1934     blob->push_back(operand2);
1935     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpULessThan);
1936 }
WriteSLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1937 void WriteSLessThan(Blob *blob,
1938                     IdResultType idResultType1,
1939                     IdResult idResult2,
1940                     IdRef operand1,
1941                     IdRef operand2)
1942 {
1943     const size_t startSize = blob->size();
1944     blob->push_back(0);
1945     blob->push_back(idResultType1);
1946     blob->push_back(idResult2);
1947     blob->push_back(operand1);
1948     blob->push_back(operand2);
1949     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSLessThan);
1950 }
WriteULessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1951 void WriteULessThanEqual(Blob *blob,
1952                          IdResultType idResultType1,
1953                          IdResult idResult2,
1954                          IdRef operand1,
1955                          IdRef operand2)
1956 {
1957     const size_t startSize = blob->size();
1958     blob->push_back(0);
1959     blob->push_back(idResultType1);
1960     blob->push_back(idResult2);
1961     blob->push_back(operand1);
1962     blob->push_back(operand2);
1963     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpULessThanEqual);
1964 }
WriteSLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1965 void WriteSLessThanEqual(Blob *blob,
1966                          IdResultType idResultType1,
1967                          IdResult idResult2,
1968                          IdRef operand1,
1969                          IdRef operand2)
1970 {
1971     const size_t startSize = blob->size();
1972     blob->push_back(0);
1973     blob->push_back(idResultType1);
1974     blob->push_back(idResult2);
1975     blob->push_back(operand1);
1976     blob->push_back(operand2);
1977     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSLessThanEqual);
1978 }
WriteFOrdEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1979 void WriteFOrdEqual(Blob *blob,
1980                     IdResultType idResultType1,
1981                     IdResult idResult2,
1982                     IdRef operand1,
1983                     IdRef operand2)
1984 {
1985     const size_t startSize = blob->size();
1986     blob->push_back(0);
1987     blob->push_back(idResultType1);
1988     blob->push_back(idResult2);
1989     blob->push_back(operand1);
1990     blob->push_back(operand2);
1991     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdEqual);
1992 }
WriteFUnordEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)1993 void WriteFUnordEqual(Blob *blob,
1994                       IdResultType idResultType1,
1995                       IdResult idResult2,
1996                       IdRef operand1,
1997                       IdRef operand2)
1998 {
1999     const size_t startSize = blob->size();
2000     blob->push_back(0);
2001     blob->push_back(idResultType1);
2002     blob->push_back(idResult2);
2003     blob->push_back(operand1);
2004     blob->push_back(operand2);
2005     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordEqual);
2006 }
WriteFOrdNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2007 void WriteFOrdNotEqual(Blob *blob,
2008                        IdResultType idResultType1,
2009                        IdResult idResult2,
2010                        IdRef operand1,
2011                        IdRef operand2)
2012 {
2013     const size_t startSize = blob->size();
2014     blob->push_back(0);
2015     blob->push_back(idResultType1);
2016     blob->push_back(idResult2);
2017     blob->push_back(operand1);
2018     blob->push_back(operand2);
2019     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdNotEqual);
2020 }
WriteFUnordNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2021 void WriteFUnordNotEqual(Blob *blob,
2022                          IdResultType idResultType1,
2023                          IdResult idResult2,
2024                          IdRef operand1,
2025                          IdRef operand2)
2026 {
2027     const size_t startSize = blob->size();
2028     blob->push_back(0);
2029     blob->push_back(idResultType1);
2030     blob->push_back(idResult2);
2031     blob->push_back(operand1);
2032     blob->push_back(operand2);
2033     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordNotEqual);
2034 }
WriteFOrdLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2035 void WriteFOrdLessThan(Blob *blob,
2036                        IdResultType idResultType1,
2037                        IdResult idResult2,
2038                        IdRef operand1,
2039                        IdRef operand2)
2040 {
2041     const size_t startSize = blob->size();
2042     blob->push_back(0);
2043     blob->push_back(idResultType1);
2044     blob->push_back(idResult2);
2045     blob->push_back(operand1);
2046     blob->push_back(operand2);
2047     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdLessThan);
2048 }
WriteFUnordLessThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2049 void WriteFUnordLessThan(Blob *blob,
2050                          IdResultType idResultType1,
2051                          IdResult idResult2,
2052                          IdRef operand1,
2053                          IdRef operand2)
2054 {
2055     const size_t startSize = blob->size();
2056     blob->push_back(0);
2057     blob->push_back(idResultType1);
2058     blob->push_back(idResult2);
2059     blob->push_back(operand1);
2060     blob->push_back(operand2);
2061     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordLessThan);
2062 }
WriteFOrdGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2063 void WriteFOrdGreaterThan(Blob *blob,
2064                           IdResultType idResultType1,
2065                           IdResult idResult2,
2066                           IdRef operand1,
2067                           IdRef operand2)
2068 {
2069     const size_t startSize = blob->size();
2070     blob->push_back(0);
2071     blob->push_back(idResultType1);
2072     blob->push_back(idResult2);
2073     blob->push_back(operand1);
2074     blob->push_back(operand2);
2075     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdGreaterThan);
2076 }
WriteFUnordGreaterThan(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2077 void WriteFUnordGreaterThan(Blob *blob,
2078                             IdResultType idResultType1,
2079                             IdResult idResult2,
2080                             IdRef operand1,
2081                             IdRef operand2)
2082 {
2083     const size_t startSize = blob->size();
2084     blob->push_back(0);
2085     blob->push_back(idResultType1);
2086     blob->push_back(idResult2);
2087     blob->push_back(operand1);
2088     blob->push_back(operand2);
2089     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordGreaterThan);
2090 }
WriteFOrdLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2091 void WriteFOrdLessThanEqual(Blob *blob,
2092                             IdResultType idResultType1,
2093                             IdResult idResult2,
2094                             IdRef operand1,
2095                             IdRef operand2)
2096 {
2097     const size_t startSize = blob->size();
2098     blob->push_back(0);
2099     blob->push_back(idResultType1);
2100     blob->push_back(idResult2);
2101     blob->push_back(operand1);
2102     blob->push_back(operand2);
2103     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdLessThanEqual);
2104 }
WriteFUnordLessThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2105 void WriteFUnordLessThanEqual(Blob *blob,
2106                               IdResultType idResultType1,
2107                               IdResult idResult2,
2108                               IdRef operand1,
2109                               IdRef operand2)
2110 {
2111     const size_t startSize = blob->size();
2112     blob->push_back(0);
2113     blob->push_back(idResultType1);
2114     blob->push_back(idResult2);
2115     blob->push_back(operand1);
2116     blob->push_back(operand2);
2117     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordLessThanEqual);
2118 }
WriteFOrdGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2119 void WriteFOrdGreaterThanEqual(Blob *blob,
2120                                IdResultType idResultType1,
2121                                IdResult idResult2,
2122                                IdRef operand1,
2123                                IdRef operand2)
2124 {
2125     const size_t startSize = blob->size();
2126     blob->push_back(0);
2127     blob->push_back(idResultType1);
2128     blob->push_back(idResult2);
2129     blob->push_back(operand1);
2130     blob->push_back(operand2);
2131     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFOrdGreaterThanEqual);
2132 }
WriteFUnordGreaterThanEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2133 void WriteFUnordGreaterThanEqual(Blob *blob,
2134                                  IdResultType idResultType1,
2135                                  IdResult idResult2,
2136                                  IdRef operand1,
2137                                  IdRef operand2)
2138 {
2139     const size_t startSize = blob->size();
2140     blob->push_back(0);
2141     blob->push_back(idResultType1);
2142     blob->push_back(idResult2);
2143     blob->push_back(operand1);
2144     blob->push_back(operand2);
2145     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFUnordGreaterThanEqual);
2146 }
WriteShiftRightLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2147 void WriteShiftRightLogical(Blob *blob,
2148                             IdResultType idResultType1,
2149                             IdResult idResult2,
2150                             IdRef base,
2151                             IdRef shift)
2152 {
2153     const size_t startSize = blob->size();
2154     blob->push_back(0);
2155     blob->push_back(idResultType1);
2156     blob->push_back(idResult2);
2157     blob->push_back(base);
2158     blob->push_back(shift);
2159     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftRightLogical);
2160 }
WriteShiftRightArithmetic(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2161 void WriteShiftRightArithmetic(Blob *blob,
2162                                IdResultType idResultType1,
2163                                IdResult idResult2,
2164                                IdRef base,
2165                                IdRef shift)
2166 {
2167     const size_t startSize = blob->size();
2168     blob->push_back(0);
2169     blob->push_back(idResultType1);
2170     blob->push_back(idResult2);
2171     blob->push_back(base);
2172     blob->push_back(shift);
2173     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftRightArithmetic);
2174 }
WriteShiftLeftLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef shift)2175 void WriteShiftLeftLogical(Blob *blob,
2176                            IdResultType idResultType1,
2177                            IdResult idResult2,
2178                            IdRef base,
2179                            IdRef shift)
2180 {
2181     const size_t startSize = blob->size();
2182     blob->push_back(0);
2183     blob->push_back(idResultType1);
2184     blob->push_back(idResult2);
2185     blob->push_back(base);
2186     blob->push_back(shift);
2187     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpShiftLeftLogical);
2188 }
WriteBitwiseOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2189 void WriteBitwiseOr(Blob *blob,
2190                     IdResultType idResultType1,
2191                     IdResult idResult2,
2192                     IdRef operand1,
2193                     IdRef operand2)
2194 {
2195     const size_t startSize = blob->size();
2196     blob->push_back(0);
2197     blob->push_back(idResultType1);
2198     blob->push_back(idResult2);
2199     blob->push_back(operand1);
2200     blob->push_back(operand2);
2201     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseOr);
2202 }
WriteBitwiseXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2203 void WriteBitwiseXor(Blob *blob,
2204                      IdResultType idResultType1,
2205                      IdResult idResult2,
2206                      IdRef operand1,
2207                      IdRef operand2)
2208 {
2209     const size_t startSize = blob->size();
2210     blob->push_back(0);
2211     blob->push_back(idResultType1);
2212     blob->push_back(idResult2);
2213     blob->push_back(operand1);
2214     blob->push_back(operand2);
2215     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseXor);
2216 }
WriteBitwiseAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)2217 void WriteBitwiseAnd(Blob *blob,
2218                      IdResultType idResultType1,
2219                      IdResult idResult2,
2220                      IdRef operand1,
2221                      IdRef operand2)
2222 {
2223     const size_t startSize = blob->size();
2224     blob->push_back(0);
2225     blob->push_back(idResultType1);
2226     blob->push_back(idResult2);
2227     blob->push_back(operand1);
2228     blob->push_back(operand2);
2229     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitwiseAnd);
2230 }
WriteNot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)2231 void WriteNot(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
2232 {
2233     const size_t startSize = blob->size();
2234     blob->push_back(0);
2235     blob->push_back(idResultType1);
2236     blob->push_back(idResult2);
2237     blob->push_back(operand);
2238     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNot);
2239 }
WriteBitFieldInsert(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef insert,IdRef offset,IdRef count)2240 void WriteBitFieldInsert(Blob *blob,
2241                          IdResultType idResultType1,
2242                          IdResult idResult2,
2243                          IdRef base,
2244                          IdRef insert,
2245                          IdRef offset,
2246                          IdRef count)
2247 {
2248     const size_t startSize = blob->size();
2249     blob->push_back(0);
2250     blob->push_back(idResultType1);
2251     blob->push_back(idResult2);
2252     blob->push_back(base);
2253     blob->push_back(insert);
2254     blob->push_back(offset);
2255     blob->push_back(count);
2256     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldInsert);
2257 }
WriteBitFieldSExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef offset,IdRef count)2258 void WriteBitFieldSExtract(Blob *blob,
2259                            IdResultType idResultType1,
2260                            IdResult idResult2,
2261                            IdRef base,
2262                            IdRef offset,
2263                            IdRef count)
2264 {
2265     const size_t startSize = blob->size();
2266     blob->push_back(0);
2267     blob->push_back(idResultType1);
2268     blob->push_back(idResult2);
2269     blob->push_back(base);
2270     blob->push_back(offset);
2271     blob->push_back(count);
2272     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldSExtract);
2273 }
WriteBitFieldUExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base,IdRef offset,IdRef count)2274 void WriteBitFieldUExtract(Blob *blob,
2275                            IdResultType idResultType1,
2276                            IdResult idResult2,
2277                            IdRef base,
2278                            IdRef offset,
2279                            IdRef count)
2280 {
2281     const size_t startSize = blob->size();
2282     blob->push_back(0);
2283     blob->push_back(idResultType1);
2284     blob->push_back(idResult2);
2285     blob->push_back(base);
2286     blob->push_back(offset);
2287     blob->push_back(count);
2288     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitFieldUExtract);
2289 }
WriteBitReverse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base)2290 void WriteBitReverse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef base)
2291 {
2292     const size_t startSize = blob->size();
2293     blob->push_back(0);
2294     blob->push_back(idResultType1);
2295     blob->push_back(idResult2);
2296     blob->push_back(base);
2297     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitReverse);
2298 }
WriteBitCount(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef base)2299 void WriteBitCount(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef base)
2300 {
2301     const size_t startSize = blob->size();
2302     blob->push_back(0);
2303     blob->push_back(idResultType1);
2304     blob->push_back(idResult2);
2305     blob->push_back(base);
2306     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBitCount);
2307 }
WriteDPdx(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2308 void WriteDPdx(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2309 {
2310     const size_t startSize = blob->size();
2311     blob->push_back(0);
2312     blob->push_back(idResultType1);
2313     blob->push_back(idResult2);
2314     blob->push_back(p);
2315     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdx);
2316 }
WriteDPdy(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2317 void WriteDPdy(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2318 {
2319     const size_t startSize = blob->size();
2320     blob->push_back(0);
2321     blob->push_back(idResultType1);
2322     blob->push_back(idResult2);
2323     blob->push_back(p);
2324     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdy);
2325 }
WriteFwidth(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2326 void WriteFwidth(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2327 {
2328     const size_t startSize = blob->size();
2329     blob->push_back(0);
2330     blob->push_back(idResultType1);
2331     blob->push_back(idResult2);
2332     blob->push_back(p);
2333     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidth);
2334 }
WriteDPdxFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2335 void WriteDPdxFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2336 {
2337     const size_t startSize = blob->size();
2338     blob->push_back(0);
2339     blob->push_back(idResultType1);
2340     blob->push_back(idResult2);
2341     blob->push_back(p);
2342     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdxFine);
2343 }
WriteDPdyFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2344 void WriteDPdyFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2345 {
2346     const size_t startSize = blob->size();
2347     blob->push_back(0);
2348     blob->push_back(idResultType1);
2349     blob->push_back(idResult2);
2350     blob->push_back(p);
2351     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdyFine);
2352 }
WriteFwidthFine(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2353 void WriteFwidthFine(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2354 {
2355     const size_t startSize = blob->size();
2356     blob->push_back(0);
2357     blob->push_back(idResultType1);
2358     blob->push_back(idResult2);
2359     blob->push_back(p);
2360     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidthFine);
2361 }
WriteDPdxCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2362 void WriteDPdxCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2363 {
2364     const size_t startSize = blob->size();
2365     blob->push_back(0);
2366     blob->push_back(idResultType1);
2367     blob->push_back(idResult2);
2368     blob->push_back(p);
2369     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdxCoarse);
2370 }
WriteDPdyCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2371 void WriteDPdyCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2372 {
2373     const size_t startSize = blob->size();
2374     blob->push_back(0);
2375     blob->push_back(idResultType1);
2376     blob->push_back(idResult2);
2377     blob->push_back(p);
2378     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpDPdyCoarse);
2379 }
WriteFwidthCoarse(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef p)2380 void WriteFwidthCoarse(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef p)
2381 {
2382     const size_t startSize = blob->size();
2383     blob->push_back(0);
2384     blob->push_back(idResultType1);
2385     blob->push_back(idResult2);
2386     blob->push_back(p);
2387     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpFwidthCoarse);
2388 }
WriteEmitVertex(Blob * blob)2389 void WriteEmitVertex(Blob *blob)
2390 {
2391     const size_t startSize = blob->size();
2392     blob->push_back(0);
2393 
2394     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEmitVertex);
2395 }
WriteEndPrimitive(Blob * blob)2396 void WriteEndPrimitive(Blob *blob)
2397 {
2398     const size_t startSize = blob->size();
2399     blob->push_back(0);
2400 
2401     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndPrimitive);
2402 }
WriteEmitStreamVertex(Blob * blob,IdRef stream)2403 void WriteEmitStreamVertex(Blob *blob, IdRef stream)
2404 {
2405     const size_t startSize = blob->size();
2406     blob->push_back(0);
2407     blob->push_back(stream);
2408     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEmitStreamVertex);
2409 }
WriteEndStreamPrimitive(Blob * blob,IdRef stream)2410 void WriteEndStreamPrimitive(Blob *blob, IdRef stream)
2411 {
2412     const size_t startSize = blob->size();
2413     blob->push_back(0);
2414     blob->push_back(stream);
2415     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndStreamPrimitive);
2416 }
WriteControlBarrier(Blob * blob,IdScope execution,IdScope memory,IdMemorySemantics semantics)2417 void WriteControlBarrier(Blob *blob, IdScope execution, IdScope memory, IdMemorySemantics semantics)
2418 {
2419     const size_t startSize = blob->size();
2420     blob->push_back(0);
2421     blob->push_back(execution);
2422     blob->push_back(memory);
2423     blob->push_back(semantics);
2424     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpControlBarrier);
2425 }
WriteMemoryBarrier(Blob * blob,IdScope memory,IdMemorySemantics semantics)2426 void WriteMemoryBarrier(Blob *blob, IdScope memory, IdMemorySemantics semantics)
2427 {
2428     const size_t startSize = blob->size();
2429     blob->push_back(0);
2430     blob->push_back(memory);
2431     blob->push_back(semantics);
2432     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpMemoryBarrier);
2433 }
WriteAtomicLoad(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2434 void WriteAtomicLoad(Blob *blob,
2435                      IdResultType idResultType1,
2436                      IdResult idResult2,
2437                      IdRef pointer,
2438                      IdScope memory,
2439                      IdMemorySemantics semantics)
2440 {
2441     const size_t startSize = blob->size();
2442     blob->push_back(0);
2443     blob->push_back(idResultType1);
2444     blob->push_back(idResult2);
2445     blob->push_back(pointer);
2446     blob->push_back(memory);
2447     blob->push_back(semantics);
2448     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicLoad);
2449 }
WriteAtomicStore(Blob * blob,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2450 void WriteAtomicStore(Blob *blob,
2451                       IdRef pointer,
2452                       IdScope memory,
2453                       IdMemorySemantics semantics,
2454                       IdRef value)
2455 {
2456     const size_t startSize = blob->size();
2457     blob->push_back(0);
2458     blob->push_back(pointer);
2459     blob->push_back(memory);
2460     blob->push_back(semantics);
2461     blob->push_back(value);
2462     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicStore);
2463 }
WriteAtomicExchange(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2464 void WriteAtomicExchange(Blob *blob,
2465                          IdResultType idResultType1,
2466                          IdResult idResult2,
2467                          IdRef pointer,
2468                          IdScope memory,
2469                          IdMemorySemantics semantics,
2470                          IdRef value)
2471 {
2472     const size_t startSize = blob->size();
2473     blob->push_back(0);
2474     blob->push_back(idResultType1);
2475     blob->push_back(idResult2);
2476     blob->push_back(pointer);
2477     blob->push_back(memory);
2478     blob->push_back(semantics);
2479     blob->push_back(value);
2480     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicExchange);
2481 }
WriteAtomicCompareExchange(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics equal,IdMemorySemantics unequal,IdRef value,IdRef comparator)2482 void WriteAtomicCompareExchange(Blob *blob,
2483                                 IdResultType idResultType1,
2484                                 IdResult idResult2,
2485                                 IdRef pointer,
2486                                 IdScope memory,
2487                                 IdMemorySemantics equal,
2488                                 IdMemorySemantics unequal,
2489                                 IdRef value,
2490                                 IdRef comparator)
2491 {
2492     const size_t startSize = blob->size();
2493     blob->push_back(0);
2494     blob->push_back(idResultType1);
2495     blob->push_back(idResult2);
2496     blob->push_back(pointer);
2497     blob->push_back(memory);
2498     blob->push_back(equal);
2499     blob->push_back(unequal);
2500     blob->push_back(value);
2501     blob->push_back(comparator);
2502     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicCompareExchange);
2503 }
WriteAtomicIIncrement(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2504 void WriteAtomicIIncrement(Blob *blob,
2505                            IdResultType idResultType1,
2506                            IdResult idResult2,
2507                            IdRef pointer,
2508                            IdScope memory,
2509                            IdMemorySemantics semantics)
2510 {
2511     const size_t startSize = blob->size();
2512     blob->push_back(0);
2513     blob->push_back(idResultType1);
2514     blob->push_back(idResult2);
2515     blob->push_back(pointer);
2516     blob->push_back(memory);
2517     blob->push_back(semantics);
2518     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIIncrement);
2519 }
WriteAtomicIDecrement(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics)2520 void WriteAtomicIDecrement(Blob *blob,
2521                            IdResultType idResultType1,
2522                            IdResult idResult2,
2523                            IdRef pointer,
2524                            IdScope memory,
2525                            IdMemorySemantics semantics)
2526 {
2527     const size_t startSize = blob->size();
2528     blob->push_back(0);
2529     blob->push_back(idResultType1);
2530     blob->push_back(idResult2);
2531     blob->push_back(pointer);
2532     blob->push_back(memory);
2533     blob->push_back(semantics);
2534     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIDecrement);
2535 }
WriteAtomicIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2536 void WriteAtomicIAdd(Blob *blob,
2537                      IdResultType idResultType1,
2538                      IdResult idResult2,
2539                      IdRef pointer,
2540                      IdScope memory,
2541                      IdMemorySemantics semantics,
2542                      IdRef value)
2543 {
2544     const size_t startSize = blob->size();
2545     blob->push_back(0);
2546     blob->push_back(idResultType1);
2547     blob->push_back(idResult2);
2548     blob->push_back(pointer);
2549     blob->push_back(memory);
2550     blob->push_back(semantics);
2551     blob->push_back(value);
2552     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicIAdd);
2553 }
WriteAtomicISub(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2554 void WriteAtomicISub(Blob *blob,
2555                      IdResultType idResultType1,
2556                      IdResult idResult2,
2557                      IdRef pointer,
2558                      IdScope memory,
2559                      IdMemorySemantics semantics,
2560                      IdRef value)
2561 {
2562     const size_t startSize = blob->size();
2563     blob->push_back(0);
2564     blob->push_back(idResultType1);
2565     blob->push_back(idResult2);
2566     blob->push_back(pointer);
2567     blob->push_back(memory);
2568     blob->push_back(semantics);
2569     blob->push_back(value);
2570     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicISub);
2571 }
WriteAtomicSMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2572 void WriteAtomicSMin(Blob *blob,
2573                      IdResultType idResultType1,
2574                      IdResult idResult2,
2575                      IdRef pointer,
2576                      IdScope memory,
2577                      IdMemorySemantics semantics,
2578                      IdRef value)
2579 {
2580     const size_t startSize = blob->size();
2581     blob->push_back(0);
2582     blob->push_back(idResultType1);
2583     blob->push_back(idResult2);
2584     blob->push_back(pointer);
2585     blob->push_back(memory);
2586     blob->push_back(semantics);
2587     blob->push_back(value);
2588     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicSMin);
2589 }
WriteAtomicUMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2590 void WriteAtomicUMin(Blob *blob,
2591                      IdResultType idResultType1,
2592                      IdResult idResult2,
2593                      IdRef pointer,
2594                      IdScope memory,
2595                      IdMemorySemantics semantics,
2596                      IdRef value)
2597 {
2598     const size_t startSize = blob->size();
2599     blob->push_back(0);
2600     blob->push_back(idResultType1);
2601     blob->push_back(idResult2);
2602     blob->push_back(pointer);
2603     blob->push_back(memory);
2604     blob->push_back(semantics);
2605     blob->push_back(value);
2606     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicUMin);
2607 }
WriteAtomicSMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2608 void WriteAtomicSMax(Blob *blob,
2609                      IdResultType idResultType1,
2610                      IdResult idResult2,
2611                      IdRef pointer,
2612                      IdScope memory,
2613                      IdMemorySemantics semantics,
2614                      IdRef value)
2615 {
2616     const size_t startSize = blob->size();
2617     blob->push_back(0);
2618     blob->push_back(idResultType1);
2619     blob->push_back(idResult2);
2620     blob->push_back(pointer);
2621     blob->push_back(memory);
2622     blob->push_back(semantics);
2623     blob->push_back(value);
2624     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicSMax);
2625 }
WriteAtomicUMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2626 void WriteAtomicUMax(Blob *blob,
2627                      IdResultType idResultType1,
2628                      IdResult idResult2,
2629                      IdRef pointer,
2630                      IdScope memory,
2631                      IdMemorySemantics semantics,
2632                      IdRef value)
2633 {
2634     const size_t startSize = blob->size();
2635     blob->push_back(0);
2636     blob->push_back(idResultType1);
2637     blob->push_back(idResult2);
2638     blob->push_back(pointer);
2639     blob->push_back(memory);
2640     blob->push_back(semantics);
2641     blob->push_back(value);
2642     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicUMax);
2643 }
WriteAtomicAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2644 void WriteAtomicAnd(Blob *blob,
2645                     IdResultType idResultType1,
2646                     IdResult idResult2,
2647                     IdRef pointer,
2648                     IdScope memory,
2649                     IdMemorySemantics semantics,
2650                     IdRef value)
2651 {
2652     const size_t startSize = blob->size();
2653     blob->push_back(0);
2654     blob->push_back(idResultType1);
2655     blob->push_back(idResult2);
2656     blob->push_back(pointer);
2657     blob->push_back(memory);
2658     blob->push_back(semantics);
2659     blob->push_back(value);
2660     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicAnd);
2661 }
WriteAtomicOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2662 void WriteAtomicOr(Blob *blob,
2663                    IdResultType idResultType1,
2664                    IdResult idResult2,
2665                    IdRef pointer,
2666                    IdScope memory,
2667                    IdMemorySemantics semantics,
2668                    IdRef value)
2669 {
2670     const size_t startSize = blob->size();
2671     blob->push_back(0);
2672     blob->push_back(idResultType1);
2673     blob->push_back(idResult2);
2674     blob->push_back(pointer);
2675     blob->push_back(memory);
2676     blob->push_back(semantics);
2677     blob->push_back(value);
2678     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicOr);
2679 }
WriteAtomicXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef pointer,IdScope memory,IdMemorySemantics semantics,IdRef value)2680 void WriteAtomicXor(Blob *blob,
2681                     IdResultType idResultType1,
2682                     IdResult idResult2,
2683                     IdRef pointer,
2684                     IdScope memory,
2685                     IdMemorySemantics semantics,
2686                     IdRef value)
2687 {
2688     const size_t startSize = blob->size();
2689     blob->push_back(0);
2690     blob->push_back(idResultType1);
2691     blob->push_back(idResult2);
2692     blob->push_back(pointer);
2693     blob->push_back(memory);
2694     blob->push_back(semantics);
2695     blob->push_back(value);
2696     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpAtomicXor);
2697 }
WritePhi(Blob * blob,IdResultType idResultType1,IdResult idResult2,const PairIdRefIdRefList & variableParentPairList)2698 void WritePhi(Blob *blob,
2699               IdResultType idResultType1,
2700               IdResult idResult2,
2701               const PairIdRefIdRefList &variableParentPairList)
2702 {
2703     const size_t startSize = blob->size();
2704     blob->push_back(0);
2705     blob->push_back(idResultType1);
2706     blob->push_back(idResult2);
2707     for (const auto &operand : variableParentPairList)
2708     {
2709         blob->push_back(operand.id1);
2710         blob->push_back(operand.id2);
2711     }
2712     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPhi);
2713 }
WriteLoopMerge(Blob * blob,IdRef mergeBlock,IdRef continueTarget,spv::LoopControlMask loopControl3)2714 void WriteLoopMerge(Blob *blob,
2715                     IdRef mergeBlock,
2716                     IdRef continueTarget,
2717                     spv::LoopControlMask loopControl3)
2718 {
2719     const size_t startSize = blob->size();
2720     blob->push_back(0);
2721     blob->push_back(mergeBlock);
2722     blob->push_back(continueTarget);
2723     blob->push_back(loopControl3);
2724     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLoopMerge);
2725 }
WriteSelectionMerge(Blob * blob,IdRef mergeBlock,spv::SelectionControlMask selectionControl2)2726 void WriteSelectionMerge(Blob *blob, IdRef mergeBlock, spv::SelectionControlMask selectionControl2)
2727 {
2728     const size_t startSize = blob->size();
2729     blob->push_back(0);
2730     blob->push_back(mergeBlock);
2731     blob->push_back(selectionControl2);
2732     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSelectionMerge);
2733 }
WriteLabel(Blob * blob,IdResult idResult1)2734 void WriteLabel(Blob *blob, IdResult idResult1)
2735 {
2736     const size_t startSize = blob->size();
2737     blob->push_back(0);
2738     blob->push_back(idResult1);
2739     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpLabel);
2740 }
WriteBranch(Blob * blob,IdRef targetLabel)2741 void WriteBranch(Blob *blob, IdRef targetLabel)
2742 {
2743     const size_t startSize = blob->size();
2744     blob->push_back(0);
2745     blob->push_back(targetLabel);
2746     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBranch);
2747 }
WriteBranchConditional(Blob * blob,IdRef condition,IdRef trueLabel,IdRef falseLabel,const LiteralIntegerList & branchweightsList)2748 void WriteBranchConditional(Blob *blob,
2749                             IdRef condition,
2750                             IdRef trueLabel,
2751                             IdRef falseLabel,
2752                             const LiteralIntegerList &branchweightsList)
2753 {
2754     const size_t startSize = blob->size();
2755     blob->push_back(0);
2756     blob->push_back(condition);
2757     blob->push_back(trueLabel);
2758     blob->push_back(falseLabel);
2759     for (const auto &operand : branchweightsList)
2760     {
2761         blob->push_back(operand);
2762     }
2763     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBranchConditional);
2764 }
WriteSwitch(Blob * blob,IdRef selector,IdRef default_,const PairLiteralIntegerIdRefList & targetPairList)2765 void WriteSwitch(Blob *blob,
2766                  IdRef selector,
2767                  IdRef default_,
2768                  const PairLiteralIntegerIdRefList &targetPairList)
2769 {
2770     const size_t startSize = blob->size();
2771     blob->push_back(0);
2772     blob->push_back(selector);
2773     blob->push_back(default_);
2774     for (const auto &operand : targetPairList)
2775     {
2776         blob->push_back(operand.literal);
2777         blob->push_back(operand.id);
2778     }
2779     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpSwitch);
2780 }
WriteKill(Blob * blob)2781 void WriteKill(Blob *blob)
2782 {
2783     const size_t startSize = blob->size();
2784     blob->push_back(0);
2785 
2786     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpKill);
2787 }
WriteReturn(Blob * blob)2788 void WriteReturn(Blob *blob)
2789 {
2790     const size_t startSize = blob->size();
2791     blob->push_back(0);
2792 
2793     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpReturn);
2794 }
WriteReturnValue(Blob * blob,IdRef value)2795 void WriteReturnValue(Blob *blob, IdRef value)
2796 {
2797     const size_t startSize = blob->size();
2798     blob->push_back(0);
2799     blob->push_back(value);
2800     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpReturnValue);
2801 }
WriteUnreachable(Blob * blob)2802 void WriteUnreachable(Blob *blob)
2803 {
2804     const size_t startSize = blob->size();
2805     blob->push_back(0);
2806 
2807     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpUnreachable);
2808 }
WriteImageSparseSampleImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)2809 void WriteImageSparseSampleImplicitLod(Blob *blob,
2810                                        IdResultType idResultType1,
2811                                        IdResult idResult2,
2812                                        IdRef sampledImage,
2813                                        IdRef coordinate,
2814                                        const spv::ImageOperandsMask *imageOperands5,
2815                                        const IdRefList &imageOperandIdsList)
2816 {
2817     const size_t startSize = blob->size();
2818     blob->push_back(0);
2819     blob->push_back(idResultType1);
2820     blob->push_back(idResult2);
2821     blob->push_back(sampledImage);
2822     blob->push_back(coordinate);
2823     if (imageOperands5)
2824     {
2825         blob->push_back(*imageOperands5);
2826     }
2827     for (const auto &operand : imageOperandIdsList)
2828     {
2829         blob->push_back(operand);
2830     }
2831     (*blob)[startSize] =
2832         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleImplicitLod);
2833 }
WriteImageSparseSampleExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)2834 void WriteImageSparseSampleExplicitLod(Blob *blob,
2835                                        IdResultType idResultType1,
2836                                        IdResult idResult2,
2837                                        IdRef sampledImage,
2838                                        IdRef coordinate,
2839                                        spv::ImageOperandsMask imageOperands5,
2840                                        const IdRefList &imageOperandIdsList)
2841 {
2842     const size_t startSize = blob->size();
2843     blob->push_back(0);
2844     blob->push_back(idResultType1);
2845     blob->push_back(idResult2);
2846     blob->push_back(sampledImage);
2847     blob->push_back(coordinate);
2848     blob->push_back(imageOperands5);
2849     for (const auto &operand : imageOperandIdsList)
2850     {
2851         blob->push_back(operand);
2852     }
2853     (*blob)[startSize] =
2854         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleExplicitLod);
2855 }
WriteImageSparseSampleDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)2856 void WriteImageSparseSampleDrefImplicitLod(Blob *blob,
2857                                            IdResultType idResultType1,
2858                                            IdResult idResult2,
2859                                            IdRef sampledImage,
2860                                            IdRef coordinate,
2861                                            IdRef dref,
2862                                            const spv::ImageOperandsMask *imageOperands6,
2863                                            const IdRefList &imageOperandIdsList)
2864 {
2865     const size_t startSize = blob->size();
2866     blob->push_back(0);
2867     blob->push_back(idResultType1);
2868     blob->push_back(idResult2);
2869     blob->push_back(sampledImage);
2870     blob->push_back(coordinate);
2871     blob->push_back(dref);
2872     if (imageOperands6)
2873     {
2874         blob->push_back(*imageOperands6);
2875     }
2876     for (const auto &operand : imageOperandIdsList)
2877     {
2878         blob->push_back(operand);
2879     }
2880     (*blob)[startSize] =
2881         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleDrefImplicitLod);
2882 }
WriteImageSparseSampleDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)2883 void WriteImageSparseSampleDrefExplicitLod(Blob *blob,
2884                                            IdResultType idResultType1,
2885                                            IdResult idResult2,
2886                                            IdRef sampledImage,
2887                                            IdRef coordinate,
2888                                            IdRef dref,
2889                                            spv::ImageOperandsMask imageOperands6,
2890                                            const IdRefList &imageOperandIdsList)
2891 {
2892     const size_t startSize = blob->size();
2893     blob->push_back(0);
2894     blob->push_back(idResultType1);
2895     blob->push_back(idResult2);
2896     blob->push_back(sampledImage);
2897     blob->push_back(coordinate);
2898     blob->push_back(dref);
2899     blob->push_back(imageOperands6);
2900     for (const auto &operand : imageOperandIdsList)
2901     {
2902         blob->push_back(operand);
2903     }
2904     (*blob)[startSize] =
2905         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleDrefExplicitLod);
2906 }
WriteImageSparseSampleProjImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)2907 void WriteImageSparseSampleProjImplicitLod(Blob *blob,
2908                                            IdResultType idResultType1,
2909                                            IdResult idResult2,
2910                                            IdRef sampledImage,
2911                                            IdRef coordinate,
2912                                            const spv::ImageOperandsMask *imageOperands5,
2913                                            const IdRefList &imageOperandIdsList)
2914 {
2915     const size_t startSize = blob->size();
2916     blob->push_back(0);
2917     blob->push_back(idResultType1);
2918     blob->push_back(idResult2);
2919     blob->push_back(sampledImage);
2920     blob->push_back(coordinate);
2921     if (imageOperands5)
2922     {
2923         blob->push_back(*imageOperands5);
2924     }
2925     for (const auto &operand : imageOperandIdsList)
2926     {
2927         blob->push_back(operand);
2928     }
2929     (*blob)[startSize] =
2930         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjImplicitLod);
2931 }
WriteImageSparseSampleProjExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,spv::ImageOperandsMask imageOperands5,const IdRefList & imageOperandIdsList)2932 void WriteImageSparseSampleProjExplicitLod(Blob *blob,
2933                                            IdResultType idResultType1,
2934                                            IdResult idResult2,
2935                                            IdRef sampledImage,
2936                                            IdRef coordinate,
2937                                            spv::ImageOperandsMask imageOperands5,
2938                                            const IdRefList &imageOperandIdsList)
2939 {
2940     const size_t startSize = blob->size();
2941     blob->push_back(0);
2942     blob->push_back(idResultType1);
2943     blob->push_back(idResult2);
2944     blob->push_back(sampledImage);
2945     blob->push_back(coordinate);
2946     blob->push_back(imageOperands5);
2947     for (const auto &operand : imageOperandIdsList)
2948     {
2949         blob->push_back(operand);
2950     }
2951     (*blob)[startSize] =
2952         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjExplicitLod);
2953 }
WriteImageSparseSampleProjDrefImplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)2954 void WriteImageSparseSampleProjDrefImplicitLod(Blob *blob,
2955                                                IdResultType idResultType1,
2956                                                IdResult idResult2,
2957                                                IdRef sampledImage,
2958                                                IdRef coordinate,
2959                                                IdRef dref,
2960                                                const spv::ImageOperandsMask *imageOperands6,
2961                                                const IdRefList &imageOperandIdsList)
2962 {
2963     const size_t startSize = blob->size();
2964     blob->push_back(0);
2965     blob->push_back(idResultType1);
2966     blob->push_back(idResult2);
2967     blob->push_back(sampledImage);
2968     blob->push_back(coordinate);
2969     blob->push_back(dref);
2970     if (imageOperands6)
2971     {
2972         blob->push_back(*imageOperands6);
2973     }
2974     for (const auto &operand : imageOperandIdsList)
2975     {
2976         blob->push_back(operand);
2977     }
2978     (*blob)[startSize] =
2979         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjDrefImplicitLod);
2980 }
WriteImageSparseSampleProjDrefExplicitLod(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,spv::ImageOperandsMask imageOperands6,const IdRefList & imageOperandIdsList)2981 void WriteImageSparseSampleProjDrefExplicitLod(Blob *blob,
2982                                                IdResultType idResultType1,
2983                                                IdResult idResult2,
2984                                                IdRef sampledImage,
2985                                                IdRef coordinate,
2986                                                IdRef dref,
2987                                                spv::ImageOperandsMask imageOperands6,
2988                                                const IdRefList &imageOperandIdsList)
2989 {
2990     const size_t startSize = blob->size();
2991     blob->push_back(0);
2992     blob->push_back(idResultType1);
2993     blob->push_back(idResult2);
2994     blob->push_back(sampledImage);
2995     blob->push_back(coordinate);
2996     blob->push_back(dref);
2997     blob->push_back(imageOperands6);
2998     for (const auto &operand : imageOperandIdsList)
2999     {
3000         blob->push_back(operand);
3001     }
3002     (*blob)[startSize] =
3003         MakeLengthOp(blob->size() - startSize, spv::OpImageSparseSampleProjDrefExplicitLod);
3004 }
WriteImageSparseFetch(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)3005 void WriteImageSparseFetch(Blob *blob,
3006                            IdResultType idResultType1,
3007                            IdResult idResult2,
3008                            IdRef image,
3009                            IdRef coordinate,
3010                            const spv::ImageOperandsMask *imageOperands5,
3011                            const IdRefList &imageOperandIdsList)
3012 {
3013     const size_t startSize = blob->size();
3014     blob->push_back(0);
3015     blob->push_back(idResultType1);
3016     blob->push_back(idResult2);
3017     blob->push_back(image);
3018     blob->push_back(coordinate);
3019     if (imageOperands5)
3020     {
3021         blob->push_back(*imageOperands5);
3022     }
3023     for (const auto &operand : imageOperandIdsList)
3024     {
3025         blob->push_back(operand);
3026     }
3027     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseFetch);
3028 }
WriteImageSparseGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef component,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)3029 void WriteImageSparseGather(Blob *blob,
3030                             IdResultType idResultType1,
3031                             IdResult idResult2,
3032                             IdRef sampledImage,
3033                             IdRef coordinate,
3034                             IdRef component,
3035                             const spv::ImageOperandsMask *imageOperands6,
3036                             const IdRefList &imageOperandIdsList)
3037 {
3038     const size_t startSize = blob->size();
3039     blob->push_back(0);
3040     blob->push_back(idResultType1);
3041     blob->push_back(idResult2);
3042     blob->push_back(sampledImage);
3043     blob->push_back(coordinate);
3044     blob->push_back(component);
3045     if (imageOperands6)
3046     {
3047         blob->push_back(*imageOperands6);
3048     }
3049     for (const auto &operand : imageOperandIdsList)
3050     {
3051         blob->push_back(operand);
3052     }
3053     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseGather);
3054 }
WriteImageSparseDrefGather(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef sampledImage,IdRef coordinate,IdRef dref,const spv::ImageOperandsMask * imageOperands6,const IdRefList & imageOperandIdsList)3055 void WriteImageSparseDrefGather(Blob *blob,
3056                                 IdResultType idResultType1,
3057                                 IdResult idResult2,
3058                                 IdRef sampledImage,
3059                                 IdRef coordinate,
3060                                 IdRef dref,
3061                                 const spv::ImageOperandsMask *imageOperands6,
3062                                 const IdRefList &imageOperandIdsList)
3063 {
3064     const size_t startSize = blob->size();
3065     blob->push_back(0);
3066     blob->push_back(idResultType1);
3067     blob->push_back(idResult2);
3068     blob->push_back(sampledImage);
3069     blob->push_back(coordinate);
3070     blob->push_back(dref);
3071     if (imageOperands6)
3072     {
3073         blob->push_back(*imageOperands6);
3074     }
3075     for (const auto &operand : imageOperandIdsList)
3076     {
3077         blob->push_back(operand);
3078     }
3079     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseDrefGather);
3080 }
WriteImageSparseTexelsResident(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef residentCode)3081 void WriteImageSparseTexelsResident(Blob *blob,
3082                                     IdResultType idResultType1,
3083                                     IdResult idResult2,
3084                                     IdRef residentCode)
3085 {
3086     const size_t startSize = blob->size();
3087     blob->push_back(0);
3088     blob->push_back(idResultType1);
3089     blob->push_back(idResult2);
3090     blob->push_back(residentCode);
3091     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseTexelsResident);
3092 }
WriteNoLine(Blob * blob)3093 void WriteNoLine(Blob *blob)
3094 {
3095     const size_t startSize = blob->size();
3096     blob->push_back(0);
3097 
3098     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpNoLine);
3099 }
WriteImageSparseRead(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef image,IdRef coordinate,const spv::ImageOperandsMask * imageOperands5,const IdRefList & imageOperandIdsList)3100 void WriteImageSparseRead(Blob *blob,
3101                           IdResultType idResultType1,
3102                           IdResult idResult2,
3103                           IdRef image,
3104                           IdRef coordinate,
3105                           const spv::ImageOperandsMask *imageOperands5,
3106                           const IdRefList &imageOperandIdsList)
3107 {
3108     const size_t startSize = blob->size();
3109     blob->push_back(0);
3110     blob->push_back(idResultType1);
3111     blob->push_back(idResult2);
3112     blob->push_back(image);
3113     blob->push_back(coordinate);
3114     if (imageOperands5)
3115     {
3116         blob->push_back(*imageOperands5);
3117     }
3118     for (const auto &operand : imageOperandIdsList)
3119     {
3120         blob->push_back(operand);
3121     }
3122     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpImageSparseRead);
3123 }
WriteModuleProcessed(Blob * blob,LiteralString process)3124 void WriteModuleProcessed(Blob *blob, LiteralString process)
3125 {
3126     const size_t startSize = blob->size();
3127     blob->push_back(0);
3128     {
3129         size_t d = blob->size();
3130         blob->resize(d + strlen(process) / 4 + 1, 0);
3131         ASSERT(IsLittleEndian());
3132         strcpy(reinterpret_cast<char *>(blob->data() + d), process);
3133     }
3134     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpModuleProcessed);
3135 }
WriteExecutionModeId(Blob * blob,IdRef entryPoint,spv::ExecutionMode mode,const LiteralIntegerList & operandsList)3136 void WriteExecutionModeId(Blob *blob,
3137                           IdRef entryPoint,
3138                           spv::ExecutionMode mode,
3139                           const LiteralIntegerList &operandsList)
3140 {
3141     const size_t startSize = blob->size();
3142     blob->push_back(0);
3143     blob->push_back(entryPoint);
3144     blob->push_back(mode);
3145     for (const auto &operand : operandsList)
3146     {
3147         blob->push_back(operand);
3148     }
3149     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpExecutionModeId);
3150 }
WriteGroupNonUniformElect(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution)3151 void WriteGroupNonUniformElect(Blob *blob,
3152                                IdResultType idResultType1,
3153                                IdResult idResult2,
3154                                IdScope execution)
3155 {
3156     const size_t startSize = blob->size();
3157     blob->push_back(0);
3158     blob->push_back(idResultType1);
3159     blob->push_back(idResult2);
3160     blob->push_back(execution);
3161     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformElect);
3162 }
WriteGroupNonUniformAll(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3163 void WriteGroupNonUniformAll(Blob *blob,
3164                              IdResultType idResultType1,
3165                              IdResult idResult2,
3166                              IdScope execution,
3167                              IdRef predicate)
3168 {
3169     const size_t startSize = blob->size();
3170     blob->push_back(0);
3171     blob->push_back(idResultType1);
3172     blob->push_back(idResult2);
3173     blob->push_back(execution);
3174     blob->push_back(predicate);
3175     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAll);
3176 }
WriteGroupNonUniformAny(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3177 void WriteGroupNonUniformAny(Blob *blob,
3178                              IdResultType idResultType1,
3179                              IdResult idResult2,
3180                              IdScope execution,
3181                              IdRef predicate)
3182 {
3183     const size_t startSize = blob->size();
3184     blob->push_back(0);
3185     blob->push_back(idResultType1);
3186     blob->push_back(idResult2);
3187     blob->push_back(execution);
3188     blob->push_back(predicate);
3189     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAny);
3190 }
WriteGroupNonUniformAllEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3191 void WriteGroupNonUniformAllEqual(Blob *blob,
3192                                   IdResultType idResultType1,
3193                                   IdResult idResult2,
3194                                   IdScope execution,
3195                                   IdRef value)
3196 {
3197     const size_t startSize = blob->size();
3198     blob->push_back(0);
3199     blob->push_back(idResultType1);
3200     blob->push_back(idResult2);
3201     blob->push_back(execution);
3202     blob->push_back(value);
3203     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformAllEqual);
3204 }
WriteGroupNonUniformBroadcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef id)3205 void WriteGroupNonUniformBroadcast(Blob *blob,
3206                                    IdResultType idResultType1,
3207                                    IdResult idResult2,
3208                                    IdScope execution,
3209                                    IdRef value,
3210                                    IdRef id)
3211 {
3212     const size_t startSize = blob->size();
3213     blob->push_back(0);
3214     blob->push_back(idResultType1);
3215     blob->push_back(idResult2);
3216     blob->push_back(execution);
3217     blob->push_back(value);
3218     blob->push_back(id);
3219     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBroadcast);
3220 }
WriteGroupNonUniformBroadcastFirst(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3221 void WriteGroupNonUniformBroadcastFirst(Blob *blob,
3222                                         IdResultType idResultType1,
3223                                         IdResult idResult2,
3224                                         IdScope execution,
3225                                         IdRef value)
3226 {
3227     const size_t startSize = blob->size();
3228     blob->push_back(0);
3229     blob->push_back(idResultType1);
3230     blob->push_back(idResult2);
3231     blob->push_back(execution);
3232     blob->push_back(value);
3233     (*blob)[startSize] =
3234         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBroadcastFirst);
3235 }
WriteGroupNonUniformBallot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef predicate)3236 void WriteGroupNonUniformBallot(Blob *blob,
3237                                 IdResultType idResultType1,
3238                                 IdResult idResult2,
3239                                 IdScope execution,
3240                                 IdRef predicate)
3241 {
3242     const size_t startSize = blob->size();
3243     blob->push_back(0);
3244     blob->push_back(idResultType1);
3245     blob->push_back(idResult2);
3246     blob->push_back(execution);
3247     blob->push_back(predicate);
3248     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallot);
3249 }
WriteGroupNonUniformInverseBallot(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3250 void WriteGroupNonUniformInverseBallot(Blob *blob,
3251                                        IdResultType idResultType1,
3252                                        IdResult idResult2,
3253                                        IdScope execution,
3254                                        IdRef value)
3255 {
3256     const size_t startSize = blob->size();
3257     blob->push_back(0);
3258     blob->push_back(idResultType1);
3259     blob->push_back(idResult2);
3260     blob->push_back(execution);
3261     blob->push_back(value);
3262     (*blob)[startSize] =
3263         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformInverseBallot);
3264 }
WriteGroupNonUniformBallotBitExtract(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef index)3265 void WriteGroupNonUniformBallotBitExtract(Blob *blob,
3266                                           IdResultType idResultType1,
3267                                           IdResult idResult2,
3268                                           IdScope execution,
3269                                           IdRef value,
3270                                           IdRef index)
3271 {
3272     const size_t startSize = blob->size();
3273     blob->push_back(0);
3274     blob->push_back(idResultType1);
3275     blob->push_back(idResult2);
3276     blob->push_back(execution);
3277     blob->push_back(value);
3278     blob->push_back(index);
3279     (*blob)[startSize] =
3280         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotBitExtract);
3281 }
WriteGroupNonUniformBallotBitCount(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value)3282 void WriteGroupNonUniformBallotBitCount(Blob *blob,
3283                                         IdResultType idResultType1,
3284                                         IdResult idResult2,
3285                                         IdScope execution,
3286                                         spv::GroupOperation operation,
3287                                         IdRef value)
3288 {
3289     const size_t startSize = blob->size();
3290     blob->push_back(0);
3291     blob->push_back(idResultType1);
3292     blob->push_back(idResult2);
3293     blob->push_back(execution);
3294     blob->push_back(operation);
3295     blob->push_back(value);
3296     (*blob)[startSize] =
3297         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotBitCount);
3298 }
WriteGroupNonUniformBallotFindLSB(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3299 void WriteGroupNonUniformBallotFindLSB(Blob *blob,
3300                                        IdResultType idResultType1,
3301                                        IdResult idResult2,
3302                                        IdScope execution,
3303                                        IdRef value)
3304 {
3305     const size_t startSize = blob->size();
3306     blob->push_back(0);
3307     blob->push_back(idResultType1);
3308     blob->push_back(idResult2);
3309     blob->push_back(execution);
3310     blob->push_back(value);
3311     (*blob)[startSize] =
3312         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotFindLSB);
3313 }
WriteGroupNonUniformBallotFindMSB(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value)3314 void WriteGroupNonUniformBallotFindMSB(Blob *blob,
3315                                        IdResultType idResultType1,
3316                                        IdResult idResult2,
3317                                        IdScope execution,
3318                                        IdRef value)
3319 {
3320     const size_t startSize = blob->size();
3321     blob->push_back(0);
3322     blob->push_back(idResultType1);
3323     blob->push_back(idResult2);
3324     blob->push_back(execution);
3325     blob->push_back(value);
3326     (*blob)[startSize] =
3327         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBallotFindMSB);
3328 }
WriteGroupNonUniformShuffle(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef id)3329 void WriteGroupNonUniformShuffle(Blob *blob,
3330                                  IdResultType idResultType1,
3331                                  IdResult idResult2,
3332                                  IdScope execution,
3333                                  IdRef value,
3334                                  IdRef id)
3335 {
3336     const size_t startSize = blob->size();
3337     blob->push_back(0);
3338     blob->push_back(idResultType1);
3339     blob->push_back(idResult2);
3340     blob->push_back(execution);
3341     blob->push_back(value);
3342     blob->push_back(id);
3343     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffle);
3344 }
WriteGroupNonUniformShuffleXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef mask)3345 void WriteGroupNonUniformShuffleXor(Blob *blob,
3346                                     IdResultType idResultType1,
3347                                     IdResult idResult2,
3348                                     IdScope execution,
3349                                     IdRef value,
3350                                     IdRef mask)
3351 {
3352     const size_t startSize = blob->size();
3353     blob->push_back(0);
3354     blob->push_back(idResultType1);
3355     blob->push_back(idResult2);
3356     blob->push_back(execution);
3357     blob->push_back(value);
3358     blob->push_back(mask);
3359     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleXor);
3360 }
WriteGroupNonUniformShuffleUp(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef delta)3361 void WriteGroupNonUniformShuffleUp(Blob *blob,
3362                                    IdResultType idResultType1,
3363                                    IdResult idResult2,
3364                                    IdScope execution,
3365                                    IdRef value,
3366                                    IdRef delta)
3367 {
3368     const size_t startSize = blob->size();
3369     blob->push_back(0);
3370     blob->push_back(idResultType1);
3371     blob->push_back(idResult2);
3372     blob->push_back(execution);
3373     blob->push_back(value);
3374     blob->push_back(delta);
3375     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleUp);
3376 }
WriteGroupNonUniformShuffleDown(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef delta)3377 void WriteGroupNonUniformShuffleDown(Blob *blob,
3378                                      IdResultType idResultType1,
3379                                      IdResult idResult2,
3380                                      IdScope execution,
3381                                      IdRef value,
3382                                      IdRef delta)
3383 {
3384     const size_t startSize = blob->size();
3385     blob->push_back(0);
3386     blob->push_back(idResultType1);
3387     blob->push_back(idResult2);
3388     blob->push_back(execution);
3389     blob->push_back(value);
3390     blob->push_back(delta);
3391     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformShuffleDown);
3392 }
WriteGroupNonUniformIAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3393 void WriteGroupNonUniformIAdd(Blob *blob,
3394                               IdResultType idResultType1,
3395                               IdResult idResult2,
3396                               IdScope execution,
3397                               spv::GroupOperation operation,
3398                               IdRef value,
3399                               const IdRef *clusterSize)
3400 {
3401     const size_t startSize = blob->size();
3402     blob->push_back(0);
3403     blob->push_back(idResultType1);
3404     blob->push_back(idResult2);
3405     blob->push_back(execution);
3406     blob->push_back(operation);
3407     blob->push_back(value);
3408     if (clusterSize)
3409     {
3410         blob->push_back(*clusterSize);
3411     }
3412     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformIAdd);
3413 }
WriteGroupNonUniformFAdd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3414 void WriteGroupNonUniformFAdd(Blob *blob,
3415                               IdResultType idResultType1,
3416                               IdResult idResult2,
3417                               IdScope execution,
3418                               spv::GroupOperation operation,
3419                               IdRef value,
3420                               const IdRef *clusterSize)
3421 {
3422     const size_t startSize = blob->size();
3423     blob->push_back(0);
3424     blob->push_back(idResultType1);
3425     blob->push_back(idResult2);
3426     blob->push_back(execution);
3427     blob->push_back(operation);
3428     blob->push_back(value);
3429     if (clusterSize)
3430     {
3431         blob->push_back(*clusterSize);
3432     }
3433     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFAdd);
3434 }
WriteGroupNonUniformIMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3435 void WriteGroupNonUniformIMul(Blob *blob,
3436                               IdResultType idResultType1,
3437                               IdResult idResult2,
3438                               IdScope execution,
3439                               spv::GroupOperation operation,
3440                               IdRef value,
3441                               const IdRef *clusterSize)
3442 {
3443     const size_t startSize = blob->size();
3444     blob->push_back(0);
3445     blob->push_back(idResultType1);
3446     blob->push_back(idResult2);
3447     blob->push_back(execution);
3448     blob->push_back(operation);
3449     blob->push_back(value);
3450     if (clusterSize)
3451     {
3452         blob->push_back(*clusterSize);
3453     }
3454     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformIMul);
3455 }
WriteGroupNonUniformFMul(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3456 void WriteGroupNonUniformFMul(Blob *blob,
3457                               IdResultType idResultType1,
3458                               IdResult idResult2,
3459                               IdScope execution,
3460                               spv::GroupOperation operation,
3461                               IdRef value,
3462                               const IdRef *clusterSize)
3463 {
3464     const size_t startSize = blob->size();
3465     blob->push_back(0);
3466     blob->push_back(idResultType1);
3467     blob->push_back(idResult2);
3468     blob->push_back(execution);
3469     blob->push_back(operation);
3470     blob->push_back(value);
3471     if (clusterSize)
3472     {
3473         blob->push_back(*clusterSize);
3474     }
3475     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMul);
3476 }
WriteGroupNonUniformSMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3477 void WriteGroupNonUniformSMin(Blob *blob,
3478                               IdResultType idResultType1,
3479                               IdResult idResult2,
3480                               IdScope execution,
3481                               spv::GroupOperation operation,
3482                               IdRef value,
3483                               const IdRef *clusterSize)
3484 {
3485     const size_t startSize = blob->size();
3486     blob->push_back(0);
3487     blob->push_back(idResultType1);
3488     blob->push_back(idResult2);
3489     blob->push_back(execution);
3490     blob->push_back(operation);
3491     blob->push_back(value);
3492     if (clusterSize)
3493     {
3494         blob->push_back(*clusterSize);
3495     }
3496     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformSMin);
3497 }
WriteGroupNonUniformUMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3498 void WriteGroupNonUniformUMin(Blob *blob,
3499                               IdResultType idResultType1,
3500                               IdResult idResult2,
3501                               IdScope execution,
3502                               spv::GroupOperation operation,
3503                               IdRef value,
3504                               const IdRef *clusterSize)
3505 {
3506     const size_t startSize = blob->size();
3507     blob->push_back(0);
3508     blob->push_back(idResultType1);
3509     blob->push_back(idResult2);
3510     blob->push_back(execution);
3511     blob->push_back(operation);
3512     blob->push_back(value);
3513     if (clusterSize)
3514     {
3515         blob->push_back(*clusterSize);
3516     }
3517     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformUMin);
3518 }
WriteGroupNonUniformFMin(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3519 void WriteGroupNonUniformFMin(Blob *blob,
3520                               IdResultType idResultType1,
3521                               IdResult idResult2,
3522                               IdScope execution,
3523                               spv::GroupOperation operation,
3524                               IdRef value,
3525                               const IdRef *clusterSize)
3526 {
3527     const size_t startSize = blob->size();
3528     blob->push_back(0);
3529     blob->push_back(idResultType1);
3530     blob->push_back(idResult2);
3531     blob->push_back(execution);
3532     blob->push_back(operation);
3533     blob->push_back(value);
3534     if (clusterSize)
3535     {
3536         blob->push_back(*clusterSize);
3537     }
3538     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMin);
3539 }
WriteGroupNonUniformSMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3540 void WriteGroupNonUniformSMax(Blob *blob,
3541                               IdResultType idResultType1,
3542                               IdResult idResult2,
3543                               IdScope execution,
3544                               spv::GroupOperation operation,
3545                               IdRef value,
3546                               const IdRef *clusterSize)
3547 {
3548     const size_t startSize = blob->size();
3549     blob->push_back(0);
3550     blob->push_back(idResultType1);
3551     blob->push_back(idResult2);
3552     blob->push_back(execution);
3553     blob->push_back(operation);
3554     blob->push_back(value);
3555     if (clusterSize)
3556     {
3557         blob->push_back(*clusterSize);
3558     }
3559     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformSMax);
3560 }
WriteGroupNonUniformUMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3561 void WriteGroupNonUniformUMax(Blob *blob,
3562                               IdResultType idResultType1,
3563                               IdResult idResult2,
3564                               IdScope execution,
3565                               spv::GroupOperation operation,
3566                               IdRef value,
3567                               const IdRef *clusterSize)
3568 {
3569     const size_t startSize = blob->size();
3570     blob->push_back(0);
3571     blob->push_back(idResultType1);
3572     blob->push_back(idResult2);
3573     blob->push_back(execution);
3574     blob->push_back(operation);
3575     blob->push_back(value);
3576     if (clusterSize)
3577     {
3578         blob->push_back(*clusterSize);
3579     }
3580     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformUMax);
3581 }
WriteGroupNonUniformFMax(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3582 void WriteGroupNonUniformFMax(Blob *blob,
3583                               IdResultType idResultType1,
3584                               IdResult idResult2,
3585                               IdScope execution,
3586                               spv::GroupOperation operation,
3587                               IdRef value,
3588                               const IdRef *clusterSize)
3589 {
3590     const size_t startSize = blob->size();
3591     blob->push_back(0);
3592     blob->push_back(idResultType1);
3593     blob->push_back(idResult2);
3594     blob->push_back(execution);
3595     blob->push_back(operation);
3596     blob->push_back(value);
3597     if (clusterSize)
3598     {
3599         blob->push_back(*clusterSize);
3600     }
3601     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformFMax);
3602 }
WriteGroupNonUniformBitwiseAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3603 void WriteGroupNonUniformBitwiseAnd(Blob *blob,
3604                                     IdResultType idResultType1,
3605                                     IdResult idResult2,
3606                                     IdScope execution,
3607                                     spv::GroupOperation operation,
3608                                     IdRef value,
3609                                     const IdRef *clusterSize)
3610 {
3611     const size_t startSize = blob->size();
3612     blob->push_back(0);
3613     blob->push_back(idResultType1);
3614     blob->push_back(idResult2);
3615     blob->push_back(execution);
3616     blob->push_back(operation);
3617     blob->push_back(value);
3618     if (clusterSize)
3619     {
3620         blob->push_back(*clusterSize);
3621     }
3622     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseAnd);
3623 }
WriteGroupNonUniformBitwiseOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3624 void WriteGroupNonUniformBitwiseOr(Blob *blob,
3625                                    IdResultType idResultType1,
3626                                    IdResult idResult2,
3627                                    IdScope execution,
3628                                    spv::GroupOperation operation,
3629                                    IdRef value,
3630                                    const IdRef *clusterSize)
3631 {
3632     const size_t startSize = blob->size();
3633     blob->push_back(0);
3634     blob->push_back(idResultType1);
3635     blob->push_back(idResult2);
3636     blob->push_back(execution);
3637     blob->push_back(operation);
3638     blob->push_back(value);
3639     if (clusterSize)
3640     {
3641         blob->push_back(*clusterSize);
3642     }
3643     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseOr);
3644 }
WriteGroupNonUniformBitwiseXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3645 void WriteGroupNonUniformBitwiseXor(Blob *blob,
3646                                     IdResultType idResultType1,
3647                                     IdResult idResult2,
3648                                     IdScope execution,
3649                                     spv::GroupOperation operation,
3650                                     IdRef value,
3651                                     const IdRef *clusterSize)
3652 {
3653     const size_t startSize = blob->size();
3654     blob->push_back(0);
3655     blob->push_back(idResultType1);
3656     blob->push_back(idResult2);
3657     blob->push_back(execution);
3658     blob->push_back(operation);
3659     blob->push_back(value);
3660     if (clusterSize)
3661     {
3662         blob->push_back(*clusterSize);
3663     }
3664     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformBitwiseXor);
3665 }
WriteGroupNonUniformLogicalAnd(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3666 void WriteGroupNonUniformLogicalAnd(Blob *blob,
3667                                     IdResultType idResultType1,
3668                                     IdResult idResult2,
3669                                     IdScope execution,
3670                                     spv::GroupOperation operation,
3671                                     IdRef value,
3672                                     const IdRef *clusterSize)
3673 {
3674     const size_t startSize = blob->size();
3675     blob->push_back(0);
3676     blob->push_back(idResultType1);
3677     blob->push_back(idResult2);
3678     blob->push_back(execution);
3679     blob->push_back(operation);
3680     blob->push_back(value);
3681     if (clusterSize)
3682     {
3683         blob->push_back(*clusterSize);
3684     }
3685     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalAnd);
3686 }
WriteGroupNonUniformLogicalOr(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3687 void WriteGroupNonUniformLogicalOr(Blob *blob,
3688                                    IdResultType idResultType1,
3689                                    IdResult idResult2,
3690                                    IdScope execution,
3691                                    spv::GroupOperation operation,
3692                                    IdRef value,
3693                                    const IdRef *clusterSize)
3694 {
3695     const size_t startSize = blob->size();
3696     blob->push_back(0);
3697     blob->push_back(idResultType1);
3698     blob->push_back(idResult2);
3699     blob->push_back(execution);
3700     blob->push_back(operation);
3701     blob->push_back(value);
3702     if (clusterSize)
3703     {
3704         blob->push_back(*clusterSize);
3705     }
3706     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalOr);
3707 }
WriteGroupNonUniformLogicalXor(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,spv::GroupOperation operation,IdRef value,const IdRef * clusterSize)3708 void WriteGroupNonUniformLogicalXor(Blob *blob,
3709                                     IdResultType idResultType1,
3710                                     IdResult idResult2,
3711                                     IdScope execution,
3712                                     spv::GroupOperation operation,
3713                                     IdRef value,
3714                                     const IdRef *clusterSize)
3715 {
3716     const size_t startSize = blob->size();
3717     blob->push_back(0);
3718     blob->push_back(idResultType1);
3719     blob->push_back(idResult2);
3720     blob->push_back(execution);
3721     blob->push_back(operation);
3722     blob->push_back(value);
3723     if (clusterSize)
3724     {
3725         blob->push_back(*clusterSize);
3726     }
3727     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformLogicalXor);
3728 }
WriteGroupNonUniformQuadBroadcast(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef index)3729 void WriteGroupNonUniformQuadBroadcast(Blob *blob,
3730                                        IdResultType idResultType1,
3731                                        IdResult idResult2,
3732                                        IdScope execution,
3733                                        IdRef value,
3734                                        IdRef index)
3735 {
3736     const size_t startSize = blob->size();
3737     blob->push_back(0);
3738     blob->push_back(idResultType1);
3739     blob->push_back(idResult2);
3740     blob->push_back(execution);
3741     blob->push_back(value);
3742     blob->push_back(index);
3743     (*blob)[startSize] =
3744         MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformQuadBroadcast);
3745 }
WriteGroupNonUniformQuadSwap(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdScope execution,IdRef value,IdRef direction)3746 void WriteGroupNonUniformQuadSwap(Blob *blob,
3747                                   IdResultType idResultType1,
3748                                   IdResult idResult2,
3749                                   IdScope execution,
3750                                   IdRef value,
3751                                   IdRef direction)
3752 {
3753     const size_t startSize = blob->size();
3754     blob->push_back(0);
3755     blob->push_back(idResultType1);
3756     blob->push_back(idResult2);
3757     blob->push_back(execution);
3758     blob->push_back(value);
3759     blob->push_back(direction);
3760     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpGroupNonUniformQuadSwap);
3761 }
WriteCopyLogical(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand)3762 void WriteCopyLogical(Blob *blob, IdResultType idResultType1, IdResult idResult2, IdRef operand)
3763 {
3764     const size_t startSize = blob->size();
3765     blob->push_back(0);
3766     blob->push_back(idResultType1);
3767     blob->push_back(idResult2);
3768     blob->push_back(operand);
3769     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpCopyLogical);
3770 }
WritePtrEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)3771 void WritePtrEqual(Blob *blob,
3772                    IdResultType idResultType1,
3773                    IdResult idResult2,
3774                    IdRef operand1,
3775                    IdRef operand2)
3776 {
3777     const size_t startSize = blob->size();
3778     blob->push_back(0);
3779     blob->push_back(idResultType1);
3780     blob->push_back(idResult2);
3781     blob->push_back(operand1);
3782     blob->push_back(operand2);
3783     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPtrEqual);
3784 }
WritePtrNotEqual(Blob * blob,IdResultType idResultType1,IdResult idResult2,IdRef operand1,IdRef operand2)3785 void WritePtrNotEqual(Blob *blob,
3786                       IdResultType idResultType1,
3787                       IdResult idResult2,
3788                       IdRef operand1,
3789                       IdRef operand2)
3790 {
3791     const size_t startSize = blob->size();
3792     blob->push_back(0);
3793     blob->push_back(idResultType1);
3794     blob->push_back(idResult2);
3795     blob->push_back(operand1);
3796     blob->push_back(operand2);
3797     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpPtrNotEqual);
3798 }
WriteBeginInvocationInterlockEXT(Blob * blob)3799 void WriteBeginInvocationInterlockEXT(Blob *blob)
3800 {
3801     const size_t startSize = blob->size();
3802     blob->push_back(0);
3803 
3804     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpBeginInvocationInterlockEXT);
3805 }
WriteEndInvocationInterlockEXT(Blob * blob)3806 void WriteEndInvocationInterlockEXT(Blob *blob)
3807 {
3808     const size_t startSize = blob->size();
3809     blob->push_back(0);
3810 
3811     (*blob)[startSize] = MakeLengthOp(blob->size() - startSize, spv::OpEndInvocationInterlockEXT);
3812 }
3813 
3814 }  // namespace spirv
3815 }  // namespace angle
3816