• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2002-2005  3Dlabs Inc. Ltd.
3 // Copyright (C) 2012-2016 LunarG, Inc.
4 // Copyright (C) 2017 ARM Limited.
5 // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
6 //
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions
11 // are met:
12 //
13 //    Redistributions of source code must retain the above copyright
14 //    notice, this list of conditions and the following disclaimer.
15 //
16 //    Redistributions in binary form must reproduce the above
17 //    copyright notice, this list of conditions and the following
18 //    disclaimer in the documentation and/or other materials provided
19 //    with the distribution.
20 //
21 //    Neither the name of 3Dlabs Inc. Ltd. nor the names of its
22 //    contributors may be used to endorse or promote products derived
23 //    from this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29 // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 // POSSIBILITY OF SUCH DAMAGE.
37 //
38 
39 #include "localintermediate.h"
40 #include "../Include/InfoSink.h"
41 
42 #ifdef _MSC_VER
43 #include <cfloat>
44 #else
45 #include <cmath>
46 #endif
47 #include <cstdint>
48 
49 
50 namespace glslang {
51 
52 //
53 // Two purposes:
54 // 1.  Show an example of how to iterate tree.  Functions can
55 //     also directly call Traverse() on children themselves to
56 //     have finer grained control over the process than shown here.
57 //     See the last function for how to get started.
58 // 2.  Print out a text based description of the tree.
59 //
60 
61 //
62 // Use this class to carry along data from node to node in
63 // the traversal
64 //
65 class TOutputTraverser : public TIntermTraverser {
66 public:
TOutputTraverser(TInfoSink & i)67     TOutputTraverser(TInfoSink& i) : infoSink(i), extraOutput(NoExtraOutput) { }
68 
69     enum EExtraOutput {
70         NoExtraOutput,
71         BinaryDoubleOutput
72     };
setDoubleOutput(EExtraOutput extra)73     void setDoubleOutput(EExtraOutput extra) { extraOutput = extra; }
74 
75     virtual bool visitBinary(TVisit, TIntermBinary* node);
76     virtual bool visitUnary(TVisit, TIntermUnary* node);
77     virtual bool visitAggregate(TVisit, TIntermAggregate* node);
78     virtual bool visitSelection(TVisit, TIntermSelection* node);
79     virtual void visitConstantUnion(TIntermConstantUnion* node);
80     virtual void visitSymbol(TIntermSymbol* node);
81     virtual bool visitLoop(TVisit, TIntermLoop* node);
82     virtual bool visitBranch(TVisit, TIntermBranch* node);
83     virtual bool visitSwitch(TVisit, TIntermSwitch* node);
84 
85     TInfoSink& infoSink;
86 protected:
87     TOutputTraverser(TOutputTraverser&);
88     TOutputTraverser& operator=(TOutputTraverser&);
89 
90     EExtraOutput extraOutput;
91 };
92 
93 //
94 // Helper functions for printing, not part of traversing.
95 //
96 
OutputTreeText(TInfoSink & infoSink,const TIntermNode * node,const int depth)97 static void OutputTreeText(TInfoSink& infoSink, const TIntermNode* node, const int depth)
98 {
99     int i;
100 
101     infoSink.debug << node->getLoc().string << ":";
102     if (node->getLoc().line)
103         infoSink.debug << node->getLoc().line;
104     else
105         infoSink.debug << "? ";
106 
107     for (i = 0; i < depth; ++i)
108         infoSink.debug << "  ";
109 }
110 
111 //
112 // The rest of the file are the traversal functions.  The last one
113 // is the one that starts the traversal.
114 //
115 // Return true from interior nodes to have the external traversal
116 // continue on to children.  If you process children yourself,
117 // return false.
118 //
119 
visitBinary(TVisit,TIntermBinary * node)120 bool TOutputTraverser::visitBinary(TVisit /* visit */, TIntermBinary* node)
121 {
122     TInfoSink& out = infoSink;
123 
124     OutputTreeText(out, node, depth);
125 
126     switch (node->getOp()) {
127     case EOpAssign:                   out.debug << "move second child to first child";           break;
128     case EOpAddAssign:                out.debug << "add second child into first child";          break;
129     case EOpSubAssign:                out.debug << "subtract second child into first child";     break;
130     case EOpMulAssign:                out.debug << "multiply second child into first child";     break;
131     case EOpVectorTimesMatrixAssign:  out.debug << "matrix mult second child into first child";  break;
132     case EOpVectorTimesScalarAssign:  out.debug << "vector scale second child into first child"; break;
133     case EOpMatrixTimesScalarAssign:  out.debug << "matrix scale second child into first child"; break;
134     case EOpMatrixTimesMatrixAssign:  out.debug << "matrix mult second child into first child";  break;
135     case EOpDivAssign:                out.debug << "divide second child into first child";       break;
136     case EOpModAssign:                out.debug << "mod second child into first child";          break;
137     case EOpAndAssign:                out.debug << "and second child into first child";          break;
138     case EOpInclusiveOrAssign:        out.debug << "or second child into first child";           break;
139     case EOpExclusiveOrAssign:        out.debug << "exclusive or second child into first child"; break;
140     case EOpLeftShiftAssign:          out.debug << "left shift second child into first child";   break;
141     case EOpRightShiftAssign:         out.debug << "right shift second child into first child";  break;
142 
143     case EOpIndexDirect:   out.debug << "direct index";   break;
144     case EOpIndexIndirect: out.debug << "indirect index"; break;
145     case EOpIndexDirectStruct:
146         {
147             bool reference = node->getLeft()->getType().isReference();
148             const TTypeList *members = reference ? node->getLeft()->getType().getReferentType()->getStruct() : node->getLeft()->getType().getStruct();
149             out.debug << (*members)[node->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst()].type->getFieldName();
150             out.debug << ": direct index for structure";      break;
151         }
152     case EOpVectorSwizzle: out.debug << "vector swizzle"; break;
153     case EOpMatrixSwizzle: out.debug << "matrix swizzle"; break;
154 
155     case EOpAdd:    out.debug << "add";                     break;
156     case EOpSub:    out.debug << "subtract";                break;
157     case EOpMul:    out.debug << "component-wise multiply"; break;
158     case EOpDiv:    out.debug << "divide";                  break;
159     case EOpMod:    out.debug << "mod";                     break;
160     case EOpRightShift:  out.debug << "right-shift";  break;
161     case EOpLeftShift:   out.debug << "left-shift";   break;
162     case EOpAnd:         out.debug << "bitwise and";  break;
163     case EOpInclusiveOr: out.debug << "inclusive-or"; break;
164     case EOpExclusiveOr: out.debug << "exclusive-or"; break;
165     case EOpEqual:            out.debug << "Compare Equal";                 break;
166     case EOpNotEqual:         out.debug << "Compare Not Equal";             break;
167     case EOpLessThan:         out.debug << "Compare Less Than";             break;
168     case EOpGreaterThan:      out.debug << "Compare Greater Than";          break;
169     case EOpLessThanEqual:    out.debug << "Compare Less Than or Equal";    break;
170     case EOpGreaterThanEqual: out.debug << "Compare Greater Than or Equal"; break;
171     case EOpVectorEqual:      out.debug << "Equal";                         break;
172     case EOpVectorNotEqual:   out.debug << "NotEqual";                      break;
173 
174     case EOpVectorTimesScalar: out.debug << "vector-scale";          break;
175     case EOpVectorTimesMatrix: out.debug << "vector-times-matrix";   break;
176     case EOpMatrixTimesVector: out.debug << "matrix-times-vector";   break;
177     case EOpMatrixTimesScalar: out.debug << "matrix-scale";          break;
178     case EOpMatrixTimesMatrix: out.debug << "matrix-multiply";       break;
179 
180     case EOpLogicalOr:  out.debug << "logical-or";   break;
181     case EOpLogicalXor: out.debug << "logical-xor"; break;
182     case EOpLogicalAnd: out.debug << "logical-and"; break;
183 
184     case EOpAbsDifference:          out.debug << "absoluteDifference";    break;
185     case EOpAddSaturate:            out.debug << "addSaturate";           break;
186     case EOpSubSaturate:            out.debug << "subtractSaturate";      break;
187     case EOpAverage:                out.debug << "average";               break;
188     case EOpAverageRounded:         out.debug << "averageRounded";        break;
189     case EOpMul32x16:               out.debug << "multiply32x16";         break;
190 
191     default: out.debug << "<unknown op>";
192     }
193 
194     out.debug << " (" << node->getCompleteString() << ")";
195 
196     out.debug << "\n";
197 
198     return true;
199 }
200 
visitUnary(TVisit,TIntermUnary * node)201 bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
202 {
203     TInfoSink& out = infoSink;
204 
205     OutputTreeText(out, node, depth);
206 
207     switch (node->getOp()) {
208     case EOpNegative:       out.debug << "Negate value";         break;
209     case EOpVectorLogicalNot:
210     case EOpLogicalNot:     out.debug << "Negate conditional";   break;
211     case EOpBitwiseNot:     out.debug << "Bitwise not";          break;
212 
213     case EOpPostIncrement:  out.debug << "Post-Increment";       break;
214     case EOpPostDecrement:  out.debug << "Post-Decrement";       break;
215     case EOpPreIncrement:   out.debug << "Pre-Increment";        break;
216     case EOpPreDecrement:   out.debug << "Pre-Decrement";        break;
217     case EOpCopyObject:     out.debug << "copy object";          break;
218 
219     // * -> bool
220     case EOpConvInt8ToBool:    out.debug << "Convert int8_t to bool";  break;
221     case EOpConvUint8ToBool:   out.debug << "Convert uint8_t to bool"; break;
222     case EOpConvInt16ToBool:   out.debug << "Convert int16_t to bool"; break;
223     case EOpConvUint16ToBool:  out.debug << "Convert uint16_t to bool";break;
224     case EOpConvIntToBool:     out.debug << "Convert int to bool";     break;
225     case EOpConvUintToBool:    out.debug << "Convert uint to bool";    break;
226     case EOpConvInt64ToBool:   out.debug << "Convert int64 to bool";   break;
227     case EOpConvUint64ToBool:  out.debug << "Convert uint64 to bool";  break;
228     case EOpConvFloat16ToBool: out.debug << "Convert float16_t to bool";   break;
229     case EOpConvFloatToBool:   out.debug << "Convert float to bool";   break;
230     case EOpConvDoubleToBool:  out.debug << "Convert double to bool";  break;
231 
232     // bool -> *
233     case EOpConvBoolToInt8:    out.debug << "Convert bool to int8_t";  break;
234     case EOpConvBoolToUint8:   out.debug << "Convert bool to uint8_t"; break;
235     case EOpConvBoolToInt16:   out.debug << "Convert bool to in16t_t"; break;
236     case EOpConvBoolToUint16:  out.debug << "Convert bool to uint16_t";break;
237     case EOpConvBoolToInt:     out.debug << "Convert bool to int"  ;   break;
238     case EOpConvBoolToUint:    out.debug << "Convert bool to uint";    break;
239     case EOpConvBoolToInt64:   out.debug << "Convert bool to int64"; break;
240     case EOpConvBoolToUint64:  out.debug << "Convert bool to uint64";break;
241     case EOpConvBoolToFloat16: out.debug << "Convert bool to float16_t";   break;
242     case EOpConvBoolToFloat:   out.debug << "Convert bool to float";   break;
243     case EOpConvBoolToDouble:  out.debug << "Convert bool to double";   break;
244 
245     // int8_t -> (u)int*
246     case EOpConvInt8ToInt16:   out.debug << "Convert int8_t to int16_t";break;
247     case EOpConvInt8ToInt:     out.debug << "Convert int8_t to int";    break;
248     case EOpConvInt8ToInt64:   out.debug << "Convert int8_t to int64";   break;
249     case EOpConvInt8ToUint8:   out.debug << "Convert int8_t to uint8_t";break;
250     case EOpConvInt8ToUint16:  out.debug << "Convert int8_t to uint16_t";break;
251     case EOpConvInt8ToUint:    out.debug << "Convert int8_t to uint";    break;
252     case EOpConvInt8ToUint64:  out.debug << "Convert int8_t to uint64";   break;
253 
254     // uint8_t -> (u)int*
255     case EOpConvUint8ToInt8:    out.debug << "Convert uint8_t to int8_t";break;
256     case EOpConvUint8ToInt16:   out.debug << "Convert uint8_t to int16_t";break;
257     case EOpConvUint8ToInt:     out.debug << "Convert uint8_t to int";    break;
258     case EOpConvUint8ToInt64:   out.debug << "Convert uint8_t to int64";   break;
259     case EOpConvUint8ToUint16:  out.debug << "Convert uint8_t to uint16_t";break;
260     case EOpConvUint8ToUint:    out.debug << "Convert uint8_t to uint";    break;
261     case EOpConvUint8ToUint64:  out.debug << "Convert uint8_t to uint64";   break;
262 
263     // int8_t -> float*
264     case EOpConvInt8ToFloat16:  out.debug << "Convert int8_t to float16_t";break;
265     case EOpConvInt8ToFloat:    out.debug << "Convert int8_t to float";    break;
266     case EOpConvInt8ToDouble:   out.debug << "Convert int8_t to double";   break;
267 
268     // uint8_t -> float*
269     case EOpConvUint8ToFloat16: out.debug << "Convert uint8_t to float16_t";break;
270     case EOpConvUint8ToFloat:   out.debug << "Convert uint8_t to float";    break;
271     case EOpConvUint8ToDouble:  out.debug << "Convert uint8_t to double";   break;
272 
273     // int16_t -> (u)int*
274     case EOpConvInt16ToInt8:    out.debug << "Convert int16_t to int8_t";break;
275     case EOpConvInt16ToInt:     out.debug << "Convert int16_t to int";    break;
276     case EOpConvInt16ToInt64:   out.debug << "Convert int16_t to int64";   break;
277     case EOpConvInt16ToUint8:   out.debug << "Convert int16_t to uint8_t";break;
278     case EOpConvInt16ToUint16:  out.debug << "Convert int16_t to uint16_t";break;
279     case EOpConvInt16ToUint:    out.debug << "Convert int16_t to uint";    break;
280     case EOpConvInt16ToUint64:  out.debug << "Convert int16_t to uint64";   break;
281 
282     // int16_t -> float*
283     case EOpConvInt16ToFloat16:  out.debug << "Convert int16_t to float16_t";break;
284     case EOpConvInt16ToFloat:    out.debug << "Convert int16_t to float";    break;
285     case EOpConvInt16ToDouble:   out.debug << "Convert int16_t to double";   break;
286 
287     // uint16_t -> (u)int*
288     case EOpConvUint16ToInt8:    out.debug << "Convert uint16_t to int8_t";break;
289     case EOpConvUint16ToInt16:   out.debug << "Convert uint16_t to int16_t";break;
290     case EOpConvUint16ToInt:     out.debug << "Convert uint16_t to int";    break;
291     case EOpConvUint16ToInt64:   out.debug << "Convert uint16_t to int64";   break;
292     case EOpConvUint16ToUint8:   out.debug << "Convert uint16_t to uint8_t";break;
293     case EOpConvUint16ToUint:    out.debug << "Convert uint16_t to uint";    break;
294     case EOpConvUint16ToUint64:  out.debug << "Convert uint16_t to uint64";   break;
295 
296     // uint16_t -> float*
297     case EOpConvUint16ToFloat16: out.debug << "Convert uint16_t to float16_t";break;
298     case EOpConvUint16ToFloat:   out.debug << "Convert uint16_t to float";    break;
299     case EOpConvUint16ToDouble:  out.debug << "Convert uint16_t to double";   break;
300 
301     // int32_t -> (u)int*
302     case EOpConvIntToInt8:    out.debug << "Convert int to int8_t";break;
303     case EOpConvIntToInt16:   out.debug << "Convert int to int16_t";break;
304     case EOpConvIntToInt64:   out.debug << "Convert int to int64";   break;
305     case EOpConvIntToUint8:   out.debug << "Convert int to uint8_t";break;
306     case EOpConvIntToUint16:  out.debug << "Convert int to uint16_t";break;
307     case EOpConvIntToUint:    out.debug << "Convert int to uint";    break;
308     case EOpConvIntToUint64:  out.debug << "Convert int to uint64";   break;
309 
310     // int32_t -> float*
311     case EOpConvIntToFloat16:  out.debug << "Convert int to float16_t";break;
312     case EOpConvIntToFloat:    out.debug << "Convert int to float";    break;
313     case EOpConvIntToDouble:   out.debug << "Convert int to double";   break;
314 
315     // uint32_t -> (u)int*
316     case EOpConvUintToInt8:    out.debug << "Convert uint to int8_t";break;
317     case EOpConvUintToInt16:   out.debug << "Convert uint to int16_t";break;
318     case EOpConvUintToInt:     out.debug << "Convert uint to int";break;
319     case EOpConvUintToInt64:   out.debug << "Convert uint to int64";   break;
320     case EOpConvUintToUint8:   out.debug << "Convert uint to uint8_t";break;
321     case EOpConvUintToUint16:  out.debug << "Convert uint to uint16_t";break;
322     case EOpConvUintToUint64:  out.debug << "Convert uint to uint64";   break;
323 
324     // uint32_t -> float*
325     case EOpConvUintToFloat16: out.debug << "Convert uint to float16_t";break;
326     case EOpConvUintToFloat:   out.debug << "Convert uint to float";    break;
327     case EOpConvUintToDouble:  out.debug << "Convert uint to double";   break;
328 
329     // int64 -> (u)int*
330     case EOpConvInt64ToInt8:    out.debug << "Convert int64 to int8_t";  break;
331     case EOpConvInt64ToInt16:   out.debug << "Convert int64 to int16_t"; break;
332     case EOpConvInt64ToInt:     out.debug << "Convert int64 to int";   break;
333     case EOpConvInt64ToUint8:   out.debug << "Convert int64 to uint8_t";break;
334     case EOpConvInt64ToUint16:  out.debug << "Convert int64 to uint16_t";break;
335     case EOpConvInt64ToUint:    out.debug << "Convert int64 to uint";    break;
336     case EOpConvInt64ToUint64:  out.debug << "Convert int64 to uint64";   break;
337 
338      // int64 -> float*
339     case EOpConvInt64ToFloat16:  out.debug << "Convert int64 to float16_t";break;
340     case EOpConvInt64ToFloat:    out.debug << "Convert int64 to float";    break;
341     case EOpConvInt64ToDouble:   out.debug << "Convert int64 to double";   break;
342 
343     // uint64 -> (u)int*
344     case EOpConvUint64ToInt8:    out.debug << "Convert uint64 to int8_t";break;
345     case EOpConvUint64ToInt16:   out.debug << "Convert uint64 to int16_t";break;
346     case EOpConvUint64ToInt:     out.debug << "Convert uint64 to int";    break;
347     case EOpConvUint64ToInt64:   out.debug << "Convert uint64 to int64";   break;
348     case EOpConvUint64ToUint8:   out.debug << "Convert uint64 to uint8_t";break;
349     case EOpConvUint64ToUint16:  out.debug << "Convert uint64 to uint16";    break;
350     case EOpConvUint64ToUint:    out.debug << "Convert uint64 to uint";   break;
351 
352     // uint64 -> float*
353     case EOpConvUint64ToFloat16: out.debug << "Convert uint64 to float16_t";break;
354     case EOpConvUint64ToFloat:   out.debug << "Convert uint64 to float";    break;
355     case EOpConvUint64ToDouble:  out.debug << "Convert uint64 to double";   break;
356 
357     // float16_t -> int*
358     case EOpConvFloat16ToInt8:  out.debug << "Convert float16_t to int8_t"; break;
359     case EOpConvFloat16ToInt16: out.debug << "Convert float16_t to int16_t"; break;
360     case EOpConvFloat16ToInt:   out.debug << "Convert float16_t to int"; break;
361     case EOpConvFloat16ToInt64: out.debug << "Convert float16_t to int64"; break;
362 
363     // float16_t -> uint*
364     case EOpConvFloat16ToUint8:  out.debug << "Convert float16_t to uint8_t"; break;
365     case EOpConvFloat16ToUint16: out.debug << "Convert float16_t to uint16_t"; break;
366     case EOpConvFloat16ToUint:   out.debug << "Convert float16_t to uint"; break;
367     case EOpConvFloat16ToUint64: out.debug << "Convert float16_t to uint64"; break;
368 
369     // float16_t -> float*
370     case EOpConvFloat16ToFloat:  out.debug << "Convert float16_t to float"; break;
371     case EOpConvFloat16ToDouble: out.debug << "Convert float16_t to double"; break;
372 
373     // float32 -> float*
374     case EOpConvFloatToFloat16: out.debug << "Convert float to float16_t"; break;
375     case EOpConvFloatToDouble:  out.debug << "Convert float to double"; break;
376 
377     // float32_t -> int*
378     case EOpConvFloatToInt8:  out.debug << "Convert float to int8_t"; break;
379     case EOpConvFloatToInt16: out.debug << "Convert float to int16_t"; break;
380     case EOpConvFloatToInt:   out.debug << "Convert float to int"; break;
381     case EOpConvFloatToInt64: out.debug << "Convert float to int64"; break;
382 
383     // float32_t -> uint*
384     case EOpConvFloatToUint8:  out.debug << "Convert float to uint8_t"; break;
385     case EOpConvFloatToUint16: out.debug << "Convert float to uint16_t"; break;
386     case EOpConvFloatToUint:   out.debug << "Convert float to uint"; break;
387     case EOpConvFloatToUint64: out.debug << "Convert float to uint64"; break;
388 
389     // double -> float*
390     case EOpConvDoubleToFloat16: out.debug << "Convert double to float16_t"; break;
391     case EOpConvDoubleToFloat:   out.debug << "Convert double to float"; break;
392 
393     // double -> int*
394     case EOpConvDoubleToInt8:  out.debug << "Convert double to int8_t"; break;
395     case EOpConvDoubleToInt16: out.debug << "Convert double to int16_t"; break;
396     case EOpConvDoubleToInt:   out.debug << "Convert double to int"; break;
397     case EOpConvDoubleToInt64: out.debug << "Convert double to int64"; break;
398 
399     // float32_t -> uint*
400     case EOpConvDoubleToUint8:  out.debug << "Convert double to uint8_t"; break;
401     case EOpConvDoubleToUint16: out.debug << "Convert double to uint16_t"; break;
402     case EOpConvDoubleToUint:   out.debug << "Convert double to uint"; break;
403     case EOpConvDoubleToUint64: out.debug << "Convert double to uint64"; break;
404 
405     case EOpConvUint64ToPtr:  out.debug << "Convert uint64_t to pointer";   break;
406     case EOpConvPtrToUint64:  out.debug << "Convert pointer to uint64_t";   break;
407 
408     case EOpConvUint64ToAccStruct: out.debug << "Convert uint64_t to acceleration structure"; break;
409     case EOpConvUvec2ToAccStruct:  out.debug << "Convert uvec2 to acceleration strucuture "; break;
410 
411     case EOpRadians:        out.debug << "radians";              break;
412     case EOpDegrees:        out.debug << "degrees";              break;
413     case EOpSin:            out.debug << "sine";                 break;
414     case EOpCos:            out.debug << "cosine";               break;
415     case EOpTan:            out.debug << "tangent";              break;
416     case EOpAsin:           out.debug << "arc sine";             break;
417     case EOpAcos:           out.debug << "arc cosine";           break;
418     case EOpAtan:           out.debug << "arc tangent";          break;
419     case EOpSinh:           out.debug << "hyp. sine";            break;
420     case EOpCosh:           out.debug << "hyp. cosine";          break;
421     case EOpTanh:           out.debug << "hyp. tangent";         break;
422     case EOpAsinh:          out.debug << "arc hyp. sine";        break;
423     case EOpAcosh:          out.debug << "arc hyp. cosine";      break;
424     case EOpAtanh:          out.debug << "arc hyp. tangent";     break;
425 
426     case EOpExp:            out.debug << "exp";                  break;
427     case EOpLog:            out.debug << "log";                  break;
428     case EOpExp2:           out.debug << "exp2";                 break;
429     case EOpLog2:           out.debug << "log2";                 break;
430     case EOpSqrt:           out.debug << "sqrt";                 break;
431     case EOpInverseSqrt:    out.debug << "inverse sqrt";         break;
432 
433     case EOpAbs:            out.debug << "Absolute value";       break;
434     case EOpSign:           out.debug << "Sign";                 break;
435     case EOpFloor:          out.debug << "Floor";                break;
436     case EOpTrunc:          out.debug << "trunc";                break;
437     case EOpRound:          out.debug << "round";                break;
438     case EOpRoundEven:      out.debug << "roundEven";            break;
439     case EOpCeil:           out.debug << "Ceiling";              break;
440     case EOpFract:          out.debug << "Fraction";             break;
441 
442     case EOpIsNan:          out.debug << "isnan";                break;
443     case EOpIsInf:          out.debug << "isinf";                break;
444 
445     case EOpFloatBitsToInt: out.debug << "floatBitsToInt";       break;
446     case EOpFloatBitsToUint:out.debug << "floatBitsToUint";      break;
447     case EOpIntBitsToFloat: out.debug << "intBitsToFloat";       break;
448     case EOpUintBitsToFloat:out.debug << "uintBitsToFloat";      break;
449     case EOpDoubleBitsToInt64:  out.debug << "doubleBitsToInt64";  break;
450     case EOpDoubleBitsToUint64: out.debug << "doubleBitsToUint64"; break;
451     case EOpInt64BitsToDouble:  out.debug << "int64BitsToDouble";  break;
452     case EOpUint64BitsToDouble: out.debug << "uint64BitsToDouble"; break;
453     case EOpFloat16BitsToInt16:  out.debug << "float16BitsToInt16";  break;
454     case EOpFloat16BitsToUint16: out.debug << "float16BitsToUint16"; break;
455     case EOpInt16BitsToFloat16:  out.debug << "int16BitsToFloat16";  break;
456     case EOpUint16BitsToFloat16: out.debug << "uint16BitsToFloat16"; break;
457 
458     case EOpPackSnorm2x16:  out.debug << "packSnorm2x16";        break;
459     case EOpUnpackSnorm2x16:out.debug << "unpackSnorm2x16";      break;
460     case EOpPackUnorm2x16:  out.debug << "packUnorm2x16";        break;
461     case EOpUnpackUnorm2x16:out.debug << "unpackUnorm2x16";      break;
462     case EOpPackHalf2x16:   out.debug << "packHalf2x16";         break;
463     case EOpUnpackHalf2x16: out.debug << "unpackHalf2x16";       break;
464     case EOpPack16:           out.debug << "pack16";                 break;
465     case EOpPack32:           out.debug << "pack32";                 break;
466     case EOpPack64:           out.debug << "pack64";                 break;
467     case EOpUnpack32:         out.debug << "unpack32";               break;
468     case EOpUnpack16:         out.debug << "unpack16";               break;
469     case EOpUnpack8:          out.debug << "unpack8";               break;
470 
471     case EOpPackSnorm4x8:     out.debug << "PackSnorm4x8";       break;
472     case EOpUnpackSnorm4x8:   out.debug << "UnpackSnorm4x8";     break;
473     case EOpPackUnorm4x8:     out.debug << "PackUnorm4x8";       break;
474     case EOpUnpackUnorm4x8:   out.debug << "UnpackUnorm4x8";     break;
475     case EOpPackDouble2x32:   out.debug << "PackDouble2x32";     break;
476     case EOpUnpackDouble2x32: out.debug << "UnpackDouble2x32";   break;
477 
478     case EOpPackInt2x32:      out.debug << "packInt2x32";        break;
479     case EOpUnpackInt2x32:    out.debug << "unpackInt2x32";      break;
480     case EOpPackUint2x32:     out.debug << "packUint2x32";       break;
481     case EOpUnpackUint2x32:   out.debug << "unpackUint2x32";     break;
482 
483     case EOpPackInt2x16:      out.debug << "packInt2x16";        break;
484     case EOpUnpackInt2x16:    out.debug << "unpackInt2x16";      break;
485     case EOpPackUint2x16:     out.debug << "packUint2x16";       break;
486     case EOpUnpackUint2x16:   out.debug << "unpackUint2x16";     break;
487 
488     case EOpPackInt4x16:      out.debug << "packInt4x16";        break;
489     case EOpUnpackInt4x16:    out.debug << "unpackInt4x16";      break;
490     case EOpPackUint4x16:     out.debug << "packUint4x16";       break;
491     case EOpUnpackUint4x16:   out.debug << "unpackUint4x16";     break;
492     case EOpPackFloat2x16:    out.debug << "packFloat2x16";      break;
493     case EOpUnpackFloat2x16:  out.debug << "unpackFloat2x16";    break;
494 
495     case EOpLength:         out.debug << "length";               break;
496     case EOpNormalize:      out.debug << "normalize";            break;
497     case EOpDPdx:           out.debug << "dPdx";                 break;
498     case EOpDPdy:           out.debug << "dPdy";                 break;
499     case EOpFwidth:         out.debug << "fwidth";               break;
500     case EOpDPdxFine:       out.debug << "dPdxFine";             break;
501     case EOpDPdyFine:       out.debug << "dPdyFine";             break;
502     case EOpFwidthFine:     out.debug << "fwidthFine";           break;
503     case EOpDPdxCoarse:     out.debug << "dPdxCoarse";           break;
504     case EOpDPdyCoarse:     out.debug << "dPdyCoarse";           break;
505     case EOpFwidthCoarse:   out.debug << "fwidthCoarse";         break;
506 
507     case EOpInterpolateAtCentroid: out.debug << "interpolateAtCentroid";  break;
508 
509     case EOpDeterminant:    out.debug << "determinant";          break;
510     case EOpMatrixInverse:  out.debug << "inverse";              break;
511     case EOpTranspose:      out.debug << "transpose";            break;
512 
513     case EOpAny:            out.debug << "any";                  break;
514     case EOpAll:            out.debug << "all";                  break;
515 
516     case EOpArrayLength:    out.debug << "array length";         break;
517 
518     case EOpEmitStreamVertex:   out.debug << "EmitStreamVertex";   break;
519     case EOpEndStreamPrimitive: out.debug << "EndStreamPrimitive"; break;
520 
521     case EOpAtomicCounterIncrement: out.debug << "AtomicCounterIncrement";break;
522     case EOpAtomicCounterDecrement: out.debug << "AtomicCounterDecrement";break;
523     case EOpAtomicCounter:          out.debug << "AtomicCounter";         break;
524 
525     case EOpTextureQuerySize:       out.debug << "textureSize";           break;
526     case EOpTextureQueryLod:        out.debug << "textureQueryLod";       break;
527     case EOpTextureQueryLevels:     out.debug << "textureQueryLevels";    break;
528     case EOpTextureQuerySamples:    out.debug << "textureSamples";        break;
529     case EOpImageQuerySize:         out.debug << "imageQuerySize";        break;
530     case EOpImageQuerySamples:      out.debug << "imageQuerySamples";     break;
531     case EOpImageLoad:              out.debug << "imageLoad";             break;
532 
533     case EOpBitFieldReverse:        out.debug << "bitFieldReverse";       break;
534     case EOpBitCount:               out.debug << "bitCount";              break;
535     case EOpFindLSB:                out.debug << "findLSB";               break;
536     case EOpFindMSB:                out.debug << "findMSB";               break;
537 
538     case EOpCountLeadingZeros:      out.debug << "countLeadingZeros";     break;
539     case EOpCountTrailingZeros:     out.debug << "countTrailingZeros";    break;
540 
541     case EOpNoise:                  out.debug << "noise";                 break;
542 
543     case EOpBallot:                 out.debug << "ballot";                break;
544     case EOpReadFirstInvocation:    out.debug << "readFirstInvocation";   break;
545 
546     case EOpAnyInvocation:          out.debug << "anyInvocation";         break;
547     case EOpAllInvocations:         out.debug << "allInvocations";        break;
548     case EOpAllInvocationsEqual:    out.debug << "allInvocationsEqual";   break;
549 
550     case EOpSubgroupElect:                   out.debug << "subgroupElect";                   break;
551     case EOpSubgroupAll:                     out.debug << "subgroupAll";                     break;
552     case EOpSubgroupAny:                     out.debug << "subgroupAny";                     break;
553     case EOpSubgroupAllEqual:                out.debug << "subgroupAllEqual";                break;
554     case EOpSubgroupBroadcast:               out.debug << "subgroupBroadcast";               break;
555     case EOpSubgroupBroadcastFirst:          out.debug << "subgroupBroadcastFirst";          break;
556     case EOpSubgroupBallot:                  out.debug << "subgroupBallot";                  break;
557     case EOpSubgroupInverseBallot:           out.debug << "subgroupInverseBallot";           break;
558     case EOpSubgroupBallotBitExtract:        out.debug << "subgroupBallotBitExtract";        break;
559     case EOpSubgroupBallotBitCount:          out.debug << "subgroupBallotBitCount";          break;
560     case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break;
561     case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break;
562     case EOpSubgroupBallotFindLSB:           out.debug << "subgroupBallotFindLSB";           break;
563     case EOpSubgroupBallotFindMSB:           out.debug << "subgroupBallotFindMSB";           break;
564     case EOpSubgroupShuffle:                 out.debug << "subgroupShuffle";                 break;
565     case EOpSubgroupShuffleXor:              out.debug << "subgroupShuffleXor";              break;
566     case EOpSubgroupShuffleUp:               out.debug << "subgroupShuffleUp";               break;
567     case EOpSubgroupShuffleDown:             out.debug << "subgroupShuffleDown";             break;
568     case EOpSubgroupAdd:                     out.debug << "subgroupAdd";                     break;
569     case EOpSubgroupMul:                     out.debug << "subgroupMul";                     break;
570     case EOpSubgroupMin:                     out.debug << "subgroupMin";                     break;
571     case EOpSubgroupMax:                     out.debug << "subgroupMax";                     break;
572     case EOpSubgroupAnd:                     out.debug << "subgroupAnd";                     break;
573     case EOpSubgroupOr:                      out.debug << "subgroupOr";                      break;
574     case EOpSubgroupXor:                     out.debug << "subgroupXor";                     break;
575     case EOpSubgroupInclusiveAdd:            out.debug << "subgroupInclusiveAdd";            break;
576     case EOpSubgroupInclusiveMul:            out.debug << "subgroupInclusiveMul";            break;
577     case EOpSubgroupInclusiveMin:            out.debug << "subgroupInclusiveMin";            break;
578     case EOpSubgroupInclusiveMax:            out.debug << "subgroupInclusiveMax";            break;
579     case EOpSubgroupInclusiveAnd:            out.debug << "subgroupInclusiveAnd";            break;
580     case EOpSubgroupInclusiveOr:             out.debug << "subgroupInclusiveOr";             break;
581     case EOpSubgroupInclusiveXor:            out.debug << "subgroupInclusiveXor";            break;
582     case EOpSubgroupExclusiveAdd:            out.debug << "subgroupExclusiveAdd";            break;
583     case EOpSubgroupExclusiveMul:            out.debug << "subgroupExclusiveMul";            break;
584     case EOpSubgroupExclusiveMin:            out.debug << "subgroupExclusiveMin";            break;
585     case EOpSubgroupExclusiveMax:            out.debug << "subgroupExclusiveMax";            break;
586     case EOpSubgroupExclusiveAnd:            out.debug << "subgroupExclusiveAnd";            break;
587     case EOpSubgroupExclusiveOr:             out.debug << "subgroupExclusiveOr";             break;
588     case EOpSubgroupExclusiveXor:            out.debug << "subgroupExclusiveXor";            break;
589     case EOpSubgroupClusteredAdd:            out.debug << "subgroupClusteredAdd";            break;
590     case EOpSubgroupClusteredMul:            out.debug << "subgroupClusteredMul";            break;
591     case EOpSubgroupClusteredMin:            out.debug << "subgroupClusteredMin";            break;
592     case EOpSubgroupClusteredMax:            out.debug << "subgroupClusteredMax";            break;
593     case EOpSubgroupClusteredAnd:            out.debug << "subgroupClusteredAnd";            break;
594     case EOpSubgroupClusteredOr:             out.debug << "subgroupClusteredOr";             break;
595     case EOpSubgroupClusteredXor:            out.debug << "subgroupClusteredXor";            break;
596     case EOpSubgroupQuadBroadcast:           out.debug << "subgroupQuadBroadcast";           break;
597     case EOpSubgroupQuadSwapHorizontal:      out.debug << "subgroupQuadSwapHorizontal";      break;
598     case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical";        break;
599     case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal";        break;
600 
601     case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
602     case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
603     case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
604     case EOpSubgroupPartitionedMin:                     out.debug << "subgroupPartitionedMinNV";                     break;
605     case EOpSubgroupPartitionedMax:                     out.debug << "subgroupPartitionedMaxNV";                     break;
606     case EOpSubgroupPartitionedAnd:                     out.debug << "subgroupPartitionedAndNV";                     break;
607     case EOpSubgroupPartitionedOr:                      out.debug << "subgroupPartitionedOrNV";                      break;
608     case EOpSubgroupPartitionedXor:                     out.debug << "subgroupPartitionedXorNV";                     break;
609     case EOpSubgroupPartitionedInclusiveAdd:            out.debug << "subgroupPartitionedInclusiveAddNV";            break;
610     case EOpSubgroupPartitionedInclusiveMul:            out.debug << "subgroupPartitionedInclusiveMulNV";            break;
611     case EOpSubgroupPartitionedInclusiveMin:            out.debug << "subgroupPartitionedInclusiveMinNV";            break;
612     case EOpSubgroupPartitionedInclusiveMax:            out.debug << "subgroupPartitionedInclusiveMaxNV";            break;
613     case EOpSubgroupPartitionedInclusiveAnd:            out.debug << "subgroupPartitionedInclusiveAndNV";            break;
614     case EOpSubgroupPartitionedInclusiveOr:             out.debug << "subgroupPartitionedInclusiveOrNV";             break;
615     case EOpSubgroupPartitionedInclusiveXor:            out.debug << "subgroupPartitionedInclusiveXorNV";            break;
616     case EOpSubgroupPartitionedExclusiveAdd:            out.debug << "subgroupPartitionedExclusiveAddNV";            break;
617     case EOpSubgroupPartitionedExclusiveMul:            out.debug << "subgroupPartitionedExclusiveMulNV";            break;
618     case EOpSubgroupPartitionedExclusiveMin:            out.debug << "subgroupPartitionedExclusiveMinNV";            break;
619     case EOpSubgroupPartitionedExclusiveMax:            out.debug << "subgroupPartitionedExclusiveMaxNV";            break;
620     case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
621     case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
622     case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
623 
624     case EOpClip:                   out.debug << "clip";                  break;
625     case EOpIsFinite:               out.debug << "isfinite";              break;
626     case EOpLog10:                  out.debug << "log10";                 break;
627     case EOpRcp:                    out.debug << "rcp";                   break;
628     case EOpSaturate:               out.debug << "saturate";              break;
629 
630     case EOpSparseTexelsResident:   out.debug << "sparseTexelsResident";  break;
631 
632     case EOpMinInvocations:             out.debug << "minInvocations";              break;
633     case EOpMaxInvocations:             out.debug << "maxInvocations";              break;
634     case EOpAddInvocations:             out.debug << "addInvocations";              break;
635     case EOpMinInvocationsNonUniform:   out.debug << "minInvocationsNonUniform";    break;
636     case EOpMaxInvocationsNonUniform:   out.debug << "maxInvocationsNonUniform";    break;
637     case EOpAddInvocationsNonUniform:   out.debug << "addInvocationsNonUniform";    break;
638 
639     case EOpMinInvocationsInclusiveScan:            out.debug << "minInvocationsInclusiveScan";             break;
640     case EOpMaxInvocationsInclusiveScan:            out.debug << "maxInvocationsInclusiveScan";             break;
641     case EOpAddInvocationsInclusiveScan:            out.debug << "addInvocationsInclusiveScan";             break;
642     case EOpMinInvocationsInclusiveScanNonUniform:  out.debug << "minInvocationsInclusiveScanNonUniform";   break;
643     case EOpMaxInvocationsInclusiveScanNonUniform:  out.debug << "maxInvocationsInclusiveScanNonUniform";   break;
644     case EOpAddInvocationsInclusiveScanNonUniform:  out.debug << "addInvocationsInclusiveScanNonUniform";   break;
645 
646     case EOpMinInvocationsExclusiveScan:            out.debug << "minInvocationsExclusiveScan";             break;
647     case EOpMaxInvocationsExclusiveScan:            out.debug << "maxInvocationsExclusiveScan";             break;
648     case EOpAddInvocationsExclusiveScan:            out.debug << "addInvocationsExclusiveScan";             break;
649     case EOpMinInvocationsExclusiveScanNonUniform:  out.debug << "minInvocationsExclusiveScanNonUniform";   break;
650     case EOpMaxInvocationsExclusiveScanNonUniform:  out.debug << "maxInvocationsExclusiveScanNonUniform";   break;
651     case EOpAddInvocationsExclusiveScanNonUniform:  out.debug << "addInvocationsExclusiveScanNonUniform";   break;
652 
653     case EOpMbcnt:                  out.debug << "mbcnt";                       break;
654 
655     case EOpFragmentMaskFetch:      out.debug << "fragmentMaskFetchAMD";        break;
656     case EOpFragmentFetch:          out.debug << "fragmentFetchAMD";            break;
657 
658     case EOpCubeFaceIndex:          out.debug << "cubeFaceIndex";               break;
659     case EOpCubeFaceCoord:          out.debug << "cubeFaceCoord";               break;
660 
661     case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
662     case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
663 
664     case EOpColorAttachmentReadEXT:   out.debug << "colorAttachmentReadEXT";   break;
665 
666     case EOpConstructReference: out.debug << "Construct reference type"; break;
667 
668     case EOpDeclare: out.debug << "Declare"; break;
669 
670     case EOpSpirvInst: out.debug << "spirv_instruction"; break;
671 
672     default: out.debug.message(EPrefixError, "Bad unary op");
673     }
674 
675     out.debug << " (" << node->getCompleteString() << ")";
676 
677     out.debug << "\n";
678 
679     return true;
680 }
681 
visitAggregate(TVisit,TIntermAggregate * node)682 bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)
683 {
684     TInfoSink& out = infoSink;
685 
686     if (node->getOp() == EOpNull) {
687         out.debug.message(EPrefixError, "node is still EOpNull!");
688         return true;
689     }
690 
691     OutputTreeText(out, node, depth);
692 
693     switch (node->getOp()) {
694     case EOpSequence:      out.debug << "Sequence\n";       return true;
695     case EOpScope:         out.debug << "Scope\n";       return true;
696     case EOpLinkerObjects: out.debug << "Linker Objects\n"; return true;
697     case EOpComma:         out.debug << "Comma";            break;
698     case EOpFunction:      out.debug << "Function Definition: " << node->getName(); break;
699     case EOpFunctionCall:  out.debug << "Function Call: "       << node->getName(); break;
700     case EOpParameters:    out.debug << "Function Parameters: ";                    break;
701 
702     case EOpConstructFloat: out.debug << "Construct float"; break;
703     case EOpConstructDouble:out.debug << "Construct double"; break;
704 
705     case EOpConstructVec2:  out.debug << "Construct vec2";  break;
706     case EOpConstructVec3:  out.debug << "Construct vec3";  break;
707     case EOpConstructVec4:  out.debug << "Construct vec4";  break;
708     case EOpConstructDVec2: out.debug << "Construct dvec2";  break;
709     case EOpConstructDVec3: out.debug << "Construct dvec3";  break;
710     case EOpConstructDVec4: out.debug << "Construct dvec4";  break;
711     case EOpConstructBool:  out.debug << "Construct bool";  break;
712     case EOpConstructBVec2: out.debug << "Construct bvec2"; break;
713     case EOpConstructBVec3: out.debug << "Construct bvec3"; break;
714     case EOpConstructBVec4: out.debug << "Construct bvec4"; break;
715     case EOpConstructInt8:   out.debug << "Construct int8_t";   break;
716     case EOpConstructI8Vec2: out.debug << "Construct i8vec2"; break;
717     case EOpConstructI8Vec3: out.debug << "Construct i8vec3"; break;
718     case EOpConstructI8Vec4: out.debug << "Construct i8vec4"; break;
719     case EOpConstructInt:   out.debug << "Construct int";   break;
720     case EOpConstructIVec2: out.debug << "Construct ivec2"; break;
721     case EOpConstructIVec3: out.debug << "Construct ivec3"; break;
722     case EOpConstructIVec4: out.debug << "Construct ivec4"; break;
723     case EOpConstructUint8:    out.debug << "Construct uint8_t";    break;
724     case EOpConstructU8Vec2:   out.debug << "Construct u8vec2";   break;
725     case EOpConstructU8Vec3:   out.debug << "Construct u8vec3";   break;
726     case EOpConstructU8Vec4:   out.debug << "Construct u8vec4";   break;
727     case EOpConstructUint:    out.debug << "Construct uint";    break;
728     case EOpConstructUVec2:   out.debug << "Construct uvec2";   break;
729     case EOpConstructUVec3:   out.debug << "Construct uvec3";   break;
730     case EOpConstructUVec4:   out.debug << "Construct uvec4";   break;
731     case EOpConstructInt64:   out.debug << "Construct int64"; break;
732     case EOpConstructI64Vec2: out.debug << "Construct i64vec2"; break;
733     case EOpConstructI64Vec3: out.debug << "Construct i64vec3"; break;
734     case EOpConstructI64Vec4: out.debug << "Construct i64vec4"; break;
735     case EOpConstructUint64:  out.debug << "Construct uint64"; break;
736     case EOpConstructU64Vec2: out.debug << "Construct u64vec2"; break;
737     case EOpConstructU64Vec3: out.debug << "Construct u64vec3"; break;
738     case EOpConstructU64Vec4: out.debug << "Construct u64vec4"; break;
739     case EOpConstructInt16:   out.debug << "Construct int16_t"; break;
740     case EOpConstructI16Vec2: out.debug << "Construct i16vec2"; break;
741     case EOpConstructI16Vec3: out.debug << "Construct i16vec3"; break;
742     case EOpConstructI16Vec4: out.debug << "Construct i16vec4"; break;
743     case EOpConstructUint16:  out.debug << "Construct uint16_t"; break;
744     case EOpConstructU16Vec2: out.debug << "Construct u16vec2"; break;
745     case EOpConstructU16Vec3: out.debug << "Construct u16vec3"; break;
746     case EOpConstructU16Vec4: out.debug << "Construct u16vec4"; break;
747     case EOpConstructMat2x2:  out.debug << "Construct mat2";    break;
748     case EOpConstructMat2x3:  out.debug << "Construct mat2x3";  break;
749     case EOpConstructMat2x4:  out.debug << "Construct mat2x4";  break;
750     case EOpConstructMat3x2:  out.debug << "Construct mat3x2";  break;
751     case EOpConstructMat3x3:  out.debug << "Construct mat3";    break;
752     case EOpConstructMat3x4:  out.debug << "Construct mat3x4";  break;
753     case EOpConstructMat4x2:  out.debug << "Construct mat4x2";  break;
754     case EOpConstructMat4x3:  out.debug << "Construct mat4x3";  break;
755     case EOpConstructMat4x4:  out.debug << "Construct mat4";    break;
756     case EOpConstructDMat2x2: out.debug << "Construct dmat2";   break;
757     case EOpConstructDMat2x3: out.debug << "Construct dmat2x3"; break;
758     case EOpConstructDMat2x4: out.debug << "Construct dmat2x4"; break;
759     case EOpConstructDMat3x2: out.debug << "Construct dmat3x2"; break;
760     case EOpConstructDMat3x3: out.debug << "Construct dmat3";   break;
761     case EOpConstructDMat3x4: out.debug << "Construct dmat3x4"; break;
762     case EOpConstructDMat4x2: out.debug << "Construct dmat4x2"; break;
763     case EOpConstructDMat4x3: out.debug << "Construct dmat4x3"; break;
764     case EOpConstructDMat4x4: out.debug << "Construct dmat4";   break;
765     case EOpConstructIMat2x2: out.debug << "Construct imat2";   break;
766     case EOpConstructIMat2x3: out.debug << "Construct imat2x3"; break;
767     case EOpConstructIMat2x4: out.debug << "Construct imat2x4"; break;
768     case EOpConstructIMat3x2: out.debug << "Construct imat3x2"; break;
769     case EOpConstructIMat3x3: out.debug << "Construct imat3";   break;
770     case EOpConstructIMat3x4: out.debug << "Construct imat3x4"; break;
771     case EOpConstructIMat4x2: out.debug << "Construct imat4x2"; break;
772     case EOpConstructIMat4x3: out.debug << "Construct imat4x3"; break;
773     case EOpConstructIMat4x4: out.debug << "Construct imat4";   break;
774     case EOpConstructUMat2x2: out.debug << "Construct umat2";   break;
775     case EOpConstructUMat2x3: out.debug << "Construct umat2x3"; break;
776     case EOpConstructUMat2x4: out.debug << "Construct umat2x4"; break;
777     case EOpConstructUMat3x2: out.debug << "Construct umat3x2"; break;
778     case EOpConstructUMat3x3: out.debug << "Construct umat3";   break;
779     case EOpConstructUMat3x4: out.debug << "Construct umat3x4"; break;
780     case EOpConstructUMat4x2: out.debug << "Construct umat4x2"; break;
781     case EOpConstructUMat4x3: out.debug << "Construct umat4x3"; break;
782     case EOpConstructUMat4x4: out.debug << "Construct umat4";   break;
783     case EOpConstructBMat2x2: out.debug << "Construct bmat2";   break;
784     case EOpConstructBMat2x3: out.debug << "Construct bmat2x3"; break;
785     case EOpConstructBMat2x4: out.debug << "Construct bmat2x4"; break;
786     case EOpConstructBMat3x2: out.debug << "Construct bmat3x2"; break;
787     case EOpConstructBMat3x3: out.debug << "Construct bmat3";   break;
788     case EOpConstructBMat3x4: out.debug << "Construct bmat3x4"; break;
789     case EOpConstructBMat4x2: out.debug << "Construct bmat4x2"; break;
790     case EOpConstructBMat4x3: out.debug << "Construct bmat4x3"; break;
791     case EOpConstructBMat4x4: out.debug << "Construct bmat4";   break;
792     case EOpConstructFloat16:   out.debug << "Construct float16_t"; break;
793     case EOpConstructF16Vec2:   out.debug << "Construct f16vec2";   break;
794     case EOpConstructF16Vec3:   out.debug << "Construct f16vec3";   break;
795     case EOpConstructF16Vec4:   out.debug << "Construct f16vec4";   break;
796     case EOpConstructF16Mat2x2: out.debug << "Construct f16mat2";   break;
797     case EOpConstructF16Mat2x3: out.debug << "Construct f16mat2x3"; break;
798     case EOpConstructF16Mat2x4: out.debug << "Construct f16mat2x4"; break;
799     case EOpConstructF16Mat3x2: out.debug << "Construct f16mat3x2"; break;
800     case EOpConstructF16Mat3x3: out.debug << "Construct f16mat3";   break;
801     case EOpConstructF16Mat3x4: out.debug << "Construct f16mat3x4"; break;
802     case EOpConstructF16Mat4x2: out.debug << "Construct f16mat4x2"; break;
803     case EOpConstructF16Mat4x3: out.debug << "Construct f16mat4x3"; break;
804     case EOpConstructF16Mat4x4: out.debug << "Construct f16mat4";   break;
805     case EOpConstructStruct:  out.debug << "Construct structure";  break;
806     case EOpConstructTextureSampler: out.debug << "Construct combined texture-sampler"; break;
807     case EOpConstructReference:  out.debug << "Construct reference";  break;
808     case EOpConstructCooperativeMatrixNV:  out.debug << "Construct cooperative matrix NV";  break;
809     case EOpConstructCooperativeMatrixKHR:  out.debug << "Construct cooperative matrix KHR";  break;
810     case EOpConstructAccStruct: out.debug << "Construct acceleration structure"; break;
811 
812     case EOpLessThan:         out.debug << "Compare Less Than";             break;
813     case EOpGreaterThan:      out.debug << "Compare Greater Than";          break;
814     case EOpLessThanEqual:    out.debug << "Compare Less Than or Equal";    break;
815     case EOpGreaterThanEqual: out.debug << "Compare Greater Than or Equal"; break;
816     case EOpVectorEqual:      out.debug << "Equal";                         break;
817     case EOpVectorNotEqual:   out.debug << "NotEqual";                      break;
818 
819     case EOpMod:           out.debug << "mod";         break;
820     case EOpModf:          out.debug << "modf";        break;
821     case EOpPow:           out.debug << "pow";         break;
822 
823     case EOpAtan:          out.debug << "arc tangent"; break;
824 
825     case EOpMin:           out.debug << "min";         break;
826     case EOpMax:           out.debug << "max";         break;
827     case EOpClamp:         out.debug << "clamp";       break;
828     case EOpMix:           out.debug << "mix";         break;
829     case EOpStep:          out.debug << "step";        break;
830     case EOpSmoothStep:    out.debug << "smoothstep";  break;
831 
832     case EOpDistance:      out.debug << "distance";                break;
833     case EOpDot:           out.debug << "dot-product";             break;
834     case EOpCross:         out.debug << "cross-product";           break;
835     case EOpFaceForward:   out.debug << "face-forward";            break;
836     case EOpReflect:       out.debug << "reflect";                 break;
837     case EOpRefract:       out.debug << "refract";                 break;
838     case EOpMul:           out.debug << "component-wise multiply"; break;
839     case EOpOuterProduct:  out.debug << "outer product";           break;
840 
841     case EOpEmitVertex:    out.debug << "EmitVertex";              break;
842     case EOpEndPrimitive:  out.debug << "EndPrimitive";            break;
843 
844     case EOpBarrier:                    out.debug << "Barrier";                    break;
845     case EOpMemoryBarrier:              out.debug << "MemoryBarrier";              break;
846     case EOpMemoryBarrierAtomicCounter: out.debug << "MemoryBarrierAtomicCounter"; break;
847     case EOpMemoryBarrierBuffer:        out.debug << "MemoryBarrierBuffer";        break;
848     case EOpMemoryBarrierImage:         out.debug << "MemoryBarrierImage";         break;
849     case EOpMemoryBarrierShared:        out.debug << "MemoryBarrierShared";        break;
850     case EOpGroupMemoryBarrier:         out.debug << "GroupMemoryBarrier";         break;
851 
852     case EOpReadInvocation:             out.debug << "readInvocation";        break;
853 
854     case EOpSwizzleInvocations:         out.debug << "swizzleInvocations";       break;
855     case EOpSwizzleInvocationsMasked:   out.debug << "swizzleInvocationsMasked"; break;
856     case EOpWriteInvocation:            out.debug << "writeInvocation";          break;
857 
858     case EOpMin3:                       out.debug << "min3";                  break;
859     case EOpMax3:                       out.debug << "max3";                  break;
860     case EOpMid3:                       out.debug << "mid3";                  break;
861     case EOpTime:                       out.debug << "time";                  break;
862 
863     case EOpAtomicAdd:                  out.debug << "AtomicAdd";             break;
864     case EOpAtomicSubtract:             out.debug << "AtomicSubtract";        break;
865     case EOpAtomicMin:                  out.debug << "AtomicMin";             break;
866     case EOpAtomicMax:                  out.debug << "AtomicMax";             break;
867     case EOpAtomicAnd:                  out.debug << "AtomicAnd";             break;
868     case EOpAtomicOr:                   out.debug << "AtomicOr";              break;
869     case EOpAtomicXor:                  out.debug << "AtomicXor";             break;
870     case EOpAtomicExchange:             out.debug << "AtomicExchange";        break;
871     case EOpAtomicCompSwap:             out.debug << "AtomicCompSwap";        break;
872     case EOpAtomicLoad:                 out.debug << "AtomicLoad";            break;
873     case EOpAtomicStore:                out.debug << "AtomicStore";           break;
874 
875     case EOpAtomicCounterAdd:           out.debug << "AtomicCounterAdd";      break;
876     case EOpAtomicCounterSubtract:      out.debug << "AtomicCounterSubtract"; break;
877     case EOpAtomicCounterMin:           out.debug << "AtomicCounterMin";      break;
878     case EOpAtomicCounterMax:           out.debug << "AtomicCounterMax";      break;
879     case EOpAtomicCounterAnd:           out.debug << "AtomicCounterAnd";      break;
880     case EOpAtomicCounterOr:            out.debug << "AtomicCounterOr";       break;
881     case EOpAtomicCounterXor:           out.debug << "AtomicCounterXor";      break;
882     case EOpAtomicCounterExchange:      out.debug << "AtomicCounterExchange"; break;
883     case EOpAtomicCounterCompSwap:      out.debug << "AtomicCounterCompSwap"; break;
884 
885     case EOpImageQuerySize:             out.debug << "imageQuerySize";        break;
886     case EOpImageQuerySamples:          out.debug << "imageQuerySamples";     break;
887     case EOpImageLoad:                  out.debug << "imageLoad";             break;
888     case EOpImageStore:                 out.debug << "imageStore";            break;
889     case EOpImageAtomicAdd:             out.debug << "imageAtomicAdd";        break;
890     case EOpImageAtomicMin:             out.debug << "imageAtomicMin";        break;
891     case EOpImageAtomicMax:             out.debug << "imageAtomicMax";        break;
892     case EOpImageAtomicAnd:             out.debug << "imageAtomicAnd";        break;
893     case EOpImageAtomicOr:              out.debug << "imageAtomicOr";         break;
894     case EOpImageAtomicXor:             out.debug << "imageAtomicXor";        break;
895     case EOpImageAtomicExchange:        out.debug << "imageAtomicExchange";   break;
896     case EOpImageAtomicCompSwap:        out.debug << "imageAtomicCompSwap";   break;
897     case EOpImageAtomicLoad:            out.debug << "imageAtomicLoad";       break;
898     case EOpImageAtomicStore:           out.debug << "imageAtomicStore";      break;
899     case EOpImageLoadLod:               out.debug << "imageLoadLod";          break;
900     case EOpImageStoreLod:              out.debug << "imageStoreLod";         break;
901 
902     case EOpTextureQuerySize:           out.debug << "textureSize";           break;
903     case EOpTextureQueryLod:            out.debug << "textureQueryLod";       break;
904     case EOpTextureQueryLevels:         out.debug << "textureQueryLevels";    break;
905     case EOpTextureQuerySamples:        out.debug << "textureSamples";        break;
906     case EOpTexture:                    out.debug << "texture";               break;
907     case EOpTextureProj:                out.debug << "textureProj";           break;
908     case EOpTextureLod:                 out.debug << "textureLod";            break;
909     case EOpTextureOffset:              out.debug << "textureOffset";         break;
910     case EOpTextureFetch:               out.debug << "textureFetch";          break;
911     case EOpTextureFetchOffset:         out.debug << "textureFetchOffset";    break;
912     case EOpTextureProjOffset:          out.debug << "textureProjOffset";     break;
913     case EOpTextureLodOffset:           out.debug << "textureLodOffset";      break;
914     case EOpTextureProjLod:             out.debug << "textureProjLod";        break;
915     case EOpTextureProjLodOffset:       out.debug << "textureProjLodOffset";  break;
916     case EOpTextureGrad:                out.debug << "textureGrad";           break;
917     case EOpTextureGradOffset:          out.debug << "textureGradOffset";     break;
918     case EOpTextureProjGrad:            out.debug << "textureProjGrad";       break;
919     case EOpTextureProjGradOffset:      out.debug << "textureProjGradOffset"; break;
920     case EOpTextureGather:              out.debug << "textureGather";         break;
921     case EOpTextureGatherOffset:        out.debug << "textureGatherOffset";   break;
922     case EOpTextureGatherOffsets:       out.debug << "textureGatherOffsets";  break;
923     case EOpTextureClamp:               out.debug << "textureClamp";          break;
924     case EOpTextureOffsetClamp:         out.debug << "textureOffsetClamp";    break;
925     case EOpTextureGradClamp:           out.debug << "textureGradClamp";      break;
926     case EOpTextureGradOffsetClamp:     out.debug << "textureGradOffsetClamp";  break;
927     case EOpTextureGatherLod:           out.debug << "textureGatherLod";        break;
928     case EOpTextureGatherLodOffset:     out.debug << "textureGatherLodOffset";  break;
929     case EOpTextureGatherLodOffsets:    out.debug << "textureGatherLodOffsets"; break;
930 
931     case EOpSparseTexture:                  out.debug << "sparseTexture";                   break;
932     case EOpSparseTextureOffset:            out.debug << "sparseTextureOffset";             break;
933     case EOpSparseTextureLod:               out.debug << "sparseTextureLod";                break;
934     case EOpSparseTextureLodOffset:         out.debug << "sparseTextureLodOffset";          break;
935     case EOpSparseTextureFetch:             out.debug << "sparseTexelFetch";                break;
936     case EOpSparseTextureFetchOffset:       out.debug << "sparseTexelFetchOffset";          break;
937     case EOpSparseTextureGrad:              out.debug << "sparseTextureGrad";               break;
938     case EOpSparseTextureGradOffset:        out.debug << "sparseTextureGradOffset";         break;
939     case EOpSparseTextureGather:            out.debug << "sparseTextureGather";             break;
940     case EOpSparseTextureGatherOffset:      out.debug << "sparseTextureGatherOffset";       break;
941     case EOpSparseTextureGatherOffsets:     out.debug << "sparseTextureGatherOffsets";      break;
942     case EOpSparseImageLoad:                out.debug << "sparseImageLoad";                 break;
943     case EOpSparseTextureClamp:             out.debug << "sparseTextureClamp";              break;
944     case EOpSparseTextureOffsetClamp:       out.debug << "sparseTextureOffsetClamp";        break;
945     case EOpSparseTextureGradClamp:         out.debug << "sparseTextureGradClamp";          break;
946     case EOpSparseTextureGradOffsetClamp:   out.debug << "sparseTextureGradOffsetClam";     break;
947     case EOpSparseTextureGatherLod:         out.debug << "sparseTextureGatherLod";          break;
948     case EOpSparseTextureGatherLodOffset:   out.debug << "sparseTextureGatherLodOffset";    break;
949     case EOpSparseTextureGatherLodOffsets:  out.debug << "sparseTextureGatherLodOffsets";   break;
950     case EOpSparseImageLoadLod:             out.debug << "sparseImageLoadLod";              break;
951     case EOpImageSampleFootprintNV:             out.debug << "imageSampleFootprintNV";          break;
952     case EOpImageSampleFootprintClampNV:        out.debug << "imageSampleFootprintClampNV";     break;
953     case EOpImageSampleFootprintLodNV:          out.debug << "imageSampleFootprintLodNV";       break;
954     case EOpImageSampleFootprintGradNV:         out.debug << "imageSampleFootprintGradNV";      break;
955     case EOpImageSampleFootprintGradClampNV:    out.debug << "mageSampleFootprintGradClampNV";  break;
956     case EOpAddCarry:                   out.debug << "addCarry";              break;
957     case EOpSubBorrow:                  out.debug << "subBorrow";             break;
958     case EOpUMulExtended:               out.debug << "uMulExtended";          break;
959     case EOpIMulExtended:               out.debug << "iMulExtended";          break;
960     case EOpBitfieldExtract:            out.debug << "bitfieldExtract";       break;
961     case EOpBitfieldInsert:             out.debug << "bitfieldInsert";        break;
962 
963     case EOpFma:                        out.debug << "fma";                   break;
964     case EOpFrexp:                      out.debug << "frexp";                 break;
965     case EOpLdexp:                      out.debug << "ldexp";                 break;
966 
967     case EOpInterpolateAtSample:   out.debug << "interpolateAtSample";    break;
968     case EOpInterpolateAtOffset:   out.debug << "interpolateAtOffset";    break;
969     case EOpInterpolateAtVertex:   out.debug << "interpolateAtVertex";    break;
970 
971     case EOpSinCos:                     out.debug << "sincos";                break;
972     case EOpGenMul:                     out.debug << "mul";                   break;
973 
974     case EOpAllMemoryBarrierWithGroupSync:    out.debug << "AllMemoryBarrierWithGroupSync";    break;
975     case EOpDeviceMemoryBarrier:              out.debug << "DeviceMemoryBarrier";              break;
976     case EOpDeviceMemoryBarrierWithGroupSync: out.debug << "DeviceMemoryBarrierWithGroupSync"; break;
977     case EOpWorkgroupMemoryBarrier:           out.debug << "WorkgroupMemoryBarrier";           break;
978     case EOpWorkgroupMemoryBarrierWithGroupSync: out.debug << "WorkgroupMemoryBarrierWithGroupSync"; break;
979 
980     case EOpSubgroupBarrier:                 out.debug << "subgroupBarrier"; break;
981     case EOpSubgroupMemoryBarrier:           out.debug << "subgroupMemoryBarrier"; break;
982     case EOpSubgroupMemoryBarrierBuffer:     out.debug << "subgroupMemoryBarrierBuffer"; break;
983     case EOpSubgroupMemoryBarrierImage:      out.debug << "subgroupMemoryBarrierImage";   break;
984     case EOpSubgroupMemoryBarrierShared:     out.debug << "subgroupMemoryBarrierShared"; break;
985     case EOpSubgroupElect:                   out.debug << "subgroupElect"; break;
986     case EOpSubgroupAll:                     out.debug << "subgroupAll"; break;
987     case EOpSubgroupAny:                     out.debug << "subgroupAny"; break;
988     case EOpSubgroupAllEqual:                out.debug << "subgroupAllEqual"; break;
989     case EOpSubgroupBroadcast:               out.debug << "subgroupBroadcast"; break;
990     case EOpSubgroupBroadcastFirst:          out.debug << "subgroupBroadcastFirst"; break;
991     case EOpSubgroupBallot:                  out.debug << "subgroupBallot"; break;
992     case EOpSubgroupInverseBallot:           out.debug << "subgroupInverseBallot"; break;
993     case EOpSubgroupBallotBitExtract:        out.debug << "subgroupBallotBitExtract"; break;
994     case EOpSubgroupBallotBitCount:          out.debug << "subgroupBallotBitCount"; break;
995     case EOpSubgroupBallotInclusiveBitCount: out.debug << "subgroupBallotInclusiveBitCount"; break;
996     case EOpSubgroupBallotExclusiveBitCount: out.debug << "subgroupBallotExclusiveBitCount"; break;
997     case EOpSubgroupBallotFindLSB:           out.debug << "subgroupBallotFindLSB"; break;
998     case EOpSubgroupBallotFindMSB:           out.debug << "subgroupBallotFindMSB"; break;
999     case EOpSubgroupShuffle:                 out.debug << "subgroupShuffle"; break;
1000     case EOpSubgroupShuffleXor:              out.debug << "subgroupShuffleXor"; break;
1001     case EOpSubgroupShuffleUp:               out.debug << "subgroupShuffleUp"; break;
1002     case EOpSubgroupShuffleDown:             out.debug << "subgroupShuffleDown"; break;
1003     case EOpSubgroupAdd:                     out.debug << "subgroupAdd"; break;
1004     case EOpSubgroupMul:                     out.debug << "subgroupMul"; break;
1005     case EOpSubgroupMin:                     out.debug << "subgroupMin"; break;
1006     case EOpSubgroupMax:                     out.debug << "subgroupMax"; break;
1007     case EOpSubgroupAnd:                     out.debug << "subgroupAnd"; break;
1008     case EOpSubgroupOr:                      out.debug << "subgroupOr"; break;
1009     case EOpSubgroupXor:                     out.debug << "subgroupXor"; break;
1010     case EOpSubgroupInclusiveAdd:            out.debug << "subgroupInclusiveAdd"; break;
1011     case EOpSubgroupInclusiveMul:            out.debug << "subgroupInclusiveMul"; break;
1012     case EOpSubgroupInclusiveMin:            out.debug << "subgroupInclusiveMin"; break;
1013     case EOpSubgroupInclusiveMax:            out.debug << "subgroupInclusiveMax"; break;
1014     case EOpSubgroupInclusiveAnd:            out.debug << "subgroupInclusiveAnd"; break;
1015     case EOpSubgroupInclusiveOr:             out.debug << "subgroupInclusiveOr"; break;
1016     case EOpSubgroupInclusiveXor:            out.debug << "subgroupInclusiveXor"; break;
1017     case EOpSubgroupExclusiveAdd:            out.debug << "subgroupExclusiveAdd"; break;
1018     case EOpSubgroupExclusiveMul:            out.debug << "subgroupExclusiveMul"; break;
1019     case EOpSubgroupExclusiveMin:            out.debug << "subgroupExclusiveMin"; break;
1020     case EOpSubgroupExclusiveMax:            out.debug << "subgroupExclusiveMax"; break;
1021     case EOpSubgroupExclusiveAnd:            out.debug << "subgroupExclusiveAnd"; break;
1022     case EOpSubgroupExclusiveOr:             out.debug << "subgroupExclusiveOr"; break;
1023     case EOpSubgroupExclusiveXor:            out.debug << "subgroupExclusiveXor"; break;
1024     case EOpSubgroupClusteredAdd:            out.debug << "subgroupClusteredAdd"; break;
1025     case EOpSubgroupClusteredMul:            out.debug << "subgroupClusteredMul"; break;
1026     case EOpSubgroupClusteredMin:            out.debug << "subgroupClusteredMin"; break;
1027     case EOpSubgroupClusteredMax:            out.debug << "subgroupClusteredMax"; break;
1028     case EOpSubgroupClusteredAnd:            out.debug << "subgroupClusteredAnd"; break;
1029     case EOpSubgroupClusteredOr:             out.debug << "subgroupClusteredOr"; break;
1030     case EOpSubgroupClusteredXor:            out.debug << "subgroupClusteredXor"; break;
1031     case EOpSubgroupQuadBroadcast:           out.debug << "subgroupQuadBroadcast"; break;
1032     case EOpSubgroupQuadSwapHorizontal:      out.debug << "subgroupQuadSwapHorizontal"; break;
1033     case EOpSubgroupQuadSwapVertical:        out.debug << "subgroupQuadSwapVertical"; break;
1034     case EOpSubgroupQuadSwapDiagonal:        out.debug << "subgroupQuadSwapDiagonal"; break;
1035 
1036     case EOpSubgroupPartition:                          out.debug << "subgroupPartitionNV";                          break;
1037     case EOpSubgroupPartitionedAdd:                     out.debug << "subgroupPartitionedAddNV";                     break;
1038     case EOpSubgroupPartitionedMul:                     out.debug << "subgroupPartitionedMulNV";                     break;
1039     case EOpSubgroupPartitionedMin:                     out.debug << "subgroupPartitionedMinNV";                     break;
1040     case EOpSubgroupPartitionedMax:                     out.debug << "subgroupPartitionedMaxNV";                     break;
1041     case EOpSubgroupPartitionedAnd:                     out.debug << "subgroupPartitionedAndNV";                     break;
1042     case EOpSubgroupPartitionedOr:                      out.debug << "subgroupPartitionedOrNV";                      break;
1043     case EOpSubgroupPartitionedXor:                     out.debug << "subgroupPartitionedXorNV";                     break;
1044     case EOpSubgroupPartitionedInclusiveAdd:            out.debug << "subgroupPartitionedInclusiveAddNV";            break;
1045     case EOpSubgroupPartitionedInclusiveMul:            out.debug << "subgroupPartitionedInclusiveMulNV";            break;
1046     case EOpSubgroupPartitionedInclusiveMin:            out.debug << "subgroupPartitionedInclusiveMinNV";            break;
1047     case EOpSubgroupPartitionedInclusiveMax:            out.debug << "subgroupPartitionedInclusiveMaxNV";            break;
1048     case EOpSubgroupPartitionedInclusiveAnd:            out.debug << "subgroupPartitionedInclusiveAndNV";            break;
1049     case EOpSubgroupPartitionedInclusiveOr:             out.debug << "subgroupPartitionedInclusiveOrNV";             break;
1050     case EOpSubgroupPartitionedInclusiveXor:            out.debug << "subgroupPartitionedInclusiveXorNV";            break;
1051     case EOpSubgroupPartitionedExclusiveAdd:            out.debug << "subgroupPartitionedExclusiveAddNV";            break;
1052     case EOpSubgroupPartitionedExclusiveMul:            out.debug << "subgroupPartitionedExclusiveMulNV";            break;
1053     case EOpSubgroupPartitionedExclusiveMin:            out.debug << "subgroupPartitionedExclusiveMinNV";            break;
1054     case EOpSubgroupPartitionedExclusiveMax:            out.debug << "subgroupPartitionedExclusiveMaxNV";            break;
1055     case EOpSubgroupPartitionedExclusiveAnd:            out.debug << "subgroupPartitionedExclusiveAndNV";            break;
1056     case EOpSubgroupPartitionedExclusiveOr:             out.debug << "subgroupPartitionedExclusiveOrNV";             break;
1057     case EOpSubgroupPartitionedExclusiveXor:            out.debug << "subgroupPartitionedExclusiveXorNV";            break;
1058 
1059     case EOpSubpassLoad:   out.debug << "subpassLoad";   break;
1060     case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break;
1061 
1062     case EOpColorAttachmentReadEXT:   out.debug << "colorAttachmentReadEXT";   break;
1063 
1064     case EOpTraceNV:                          out.debug << "traceNV"; break;
1065     case EOpTraceRayMotionNV:                 out.debug << "traceRayMotionNV"; break;
1066     case EOpTraceKHR:                         out.debug << "traceRayKHR"; break;
1067     case EOpReportIntersection:               out.debug << "reportIntersectionNV"; break;
1068     case EOpIgnoreIntersectionNV:             out.debug << "ignoreIntersectionNV"; break;
1069     case EOpIgnoreIntersectionKHR:            out.debug << "ignoreIntersectionKHR"; break;
1070     case EOpTerminateRayNV:                   out.debug << "terminateRayNV"; break;
1071     case EOpTerminateRayKHR:                  out.debug << "terminateRayKHR"; break;
1072     case EOpExecuteCallableNV:                out.debug << "executeCallableNV"; break;
1073     case EOpExecuteCallableKHR:               out.debug << "executeCallableKHR"; break;
1074     case EOpWritePackedPrimitiveIndices4x8NV: out.debug << "writePackedPrimitiveIndices4x8NV"; break;
1075     case EOpEmitMeshTasksEXT:                 out.debug << "EmitMeshTasksEXT"; break;
1076     case EOpSetMeshOutputsEXT:                out.debug << "SetMeshOutputsEXT"; break;
1077 
1078     case EOpRayQueryInitialize:                                            out.debug << "rayQueryInitializeEXT"; break;
1079     case EOpRayQueryTerminate:                                             out.debug << "rayQueryTerminateEXT"; break;
1080     case EOpRayQueryGenerateIntersection:                                  out.debug << "rayQueryGenerateIntersectionEXT"; break;
1081     case EOpRayQueryConfirmIntersection:                                   out.debug << "rayQueryConfirmIntersectionEXT"; break;
1082     case EOpRayQueryProceed:                                               out.debug << "rayQueryProceedEXT"; break;
1083     case EOpRayQueryGetIntersectionType:                                   out.debug << "rayQueryGetIntersectionTypeEXT"; break;
1084     case EOpRayQueryGetRayTMin:                                            out.debug << "rayQueryGetRayTMinEXT"; break;
1085     case EOpRayQueryGetRayFlags:                                           out.debug << "rayQueryGetRayFlagsEXT"; break;
1086     case EOpRayQueryGetIntersectionT:                                      out.debug << "rayQueryGetIntersectionTEXT"; break;
1087     case EOpRayQueryGetIntersectionInstanceCustomIndex:                    out.debug << "rayQueryGetIntersectionInstanceCustomIndexEXT"; break;
1088     case EOpRayQueryGetIntersectionInstanceId:                             out.debug << "rayQueryGetIntersectionInstanceIdEXT"; break;
1089     case EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset: out.debug << "rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT"; break;
1090     case EOpRayQueryGetIntersectionGeometryIndex:                          out.debug << "rayQueryGetIntersectionGeometryIndexEXT"; break;
1091     case EOpRayQueryGetIntersectionPrimitiveIndex:                         out.debug << "rayQueryGetIntersectionPrimitiveIndexEXT"; break;
1092     case EOpRayQueryGetIntersectionBarycentrics:                           out.debug << "rayQueryGetIntersectionBarycentricsEXT"; break;
1093     case EOpRayQueryGetIntersectionFrontFace:                              out.debug << "rayQueryGetIntersectionFrontFaceEXT"; break;
1094     case EOpRayQueryGetIntersectionCandidateAABBOpaque:                    out.debug << "rayQueryGetIntersectionCandidateAABBOpaqueEXT"; break;
1095     case EOpRayQueryGetIntersectionObjectRayDirection:                     out.debug << "rayQueryGetIntersectionObjectRayDirectionEXT"; break;
1096     case EOpRayQueryGetIntersectionObjectRayOrigin:                        out.debug << "rayQueryGetIntersectionObjectRayOriginEXT"; break;
1097     case EOpRayQueryGetWorldRayDirection:                                  out.debug << "rayQueryGetWorldRayDirectionEXT"; break;
1098     case EOpRayQueryGetWorldRayOrigin:                                     out.debug << "rayQueryGetWorldRayOriginEXT"; break;
1099     case EOpRayQueryGetIntersectionObjectToWorld:                          out.debug << "rayQueryGetIntersectionObjectToWorldEXT"; break;
1100     case EOpRayQueryGetIntersectionWorldToObject:                          out.debug << "rayQueryGetIntersectionWorldToObjectEXT"; break;
1101     case EOpRayQueryGetIntersectionTriangleVertexPositionsEXT:             out.debug << "rayQueryGetIntersectionTriangleVertexPositionsEXT"; break;
1102 
1103     case EOpCooperativeMatrixLoad:  out.debug << "Load cooperative matrix KHR"; break;
1104     case EOpCooperativeMatrixStore:  out.debug << "Store cooperative matrix KHR"; break;
1105     case EOpCooperativeMatrixMulAdd: out.debug << "MulAdd cooperative matrices KHR"; break;
1106     case EOpCooperativeMatrixLoadNV:  out.debug << "Load cooperative matrix NV"; break;
1107     case EOpCooperativeMatrixStoreNV:  out.debug << "Store cooperative matrix NV"; break;
1108     case EOpCooperativeMatrixMulAddNV: out.debug << "MulAdd cooperative matrices NV"; break;
1109 
1110     case EOpIsHelperInvocation: out.debug << "IsHelperInvocation"; break;
1111     case EOpDebugPrintf:  out.debug << "Debug printf";  break;
1112 
1113     case EOpHitObjectTraceRayNV: out.debug << "HitObjectTraceRayNV"; break;
1114     case EOpHitObjectTraceRayMotionNV: out.debug << "HitObjectTraceRayMotionNV"; break;
1115     case EOpHitObjectRecordHitNV: out.debug << "HitObjectRecordHitNV"; break;
1116     case EOpHitObjectRecordHitMotionNV: out.debug << "HitObjectRecordHitMotionNV"; break;
1117     case EOpHitObjectRecordHitWithIndexNV: out.debug << "HitObjectRecordHitWithIndexNV"; break;
1118     case EOpHitObjectRecordHitWithIndexMotionNV: out.debug << "HitObjectRecordHitWithIndexMotionNV"; break;
1119     case EOpHitObjectRecordMissNV: out.debug << "HitObjectRecordMissNV"; break;
1120     case EOpHitObjectRecordMissMotionNV: out.debug << "HitObjectRecordMissMotionNV"; break;
1121     case EOpHitObjectRecordEmptyNV: out.debug << "HitObjectRecordEmptyNV"; break;
1122     case EOpHitObjectExecuteShaderNV: out.debug << "HitObjectExecuteShaderNV"; break;
1123     case EOpHitObjectIsEmptyNV: out.debug << "HitObjectIsEmptyNV"; break;
1124     case EOpHitObjectIsMissNV: out.debug << "HitObjectIsMissNV"; break;
1125     case EOpHitObjectIsHitNV:  out.debug << "HitObjectIsHitNV"; break;
1126     case EOpHitObjectGetRayTMinNV: out.debug << "HitObjectGetRayTMinNV"; break;
1127     case EOpHitObjectGetRayTMaxNV: out.debug << "HitObjectGetRayTMaxNV"; break;
1128     case EOpHitObjectGetObjectRayOriginNV: out.debug << "HitObjectGetObjectRayOriginNV"; break;
1129     case EOpHitObjectGetObjectRayDirectionNV: out.debug << "HitObjectGetObjectRayDirectionNV"; break;
1130     case EOpHitObjectGetWorldRayOriginNV: out.debug << "HitObjectGetWorldRayOriginNV"; break;
1131     case EOpHitObjectGetWorldRayDirectionNV: out.debug << "HitObjectGetWorldRayDirectionNV"; break;
1132     case EOpHitObjectGetObjectToWorldNV: out.debug << "HitObjectGetObjectToWorldNV"; break;
1133     case EOpHitObjectGetWorldToObjectNV: out.debug << "HitObjectGetWorldToObjectNV"; break;
1134     case EOpHitObjectGetInstanceCustomIndexNV: out.debug<< "HitObjectGetInstanceCustomIndexNV"; break;
1135     case EOpHitObjectGetInstanceIdNV: out.debug << "HitObjectGetInstaneIdNV"; break;
1136     case EOpHitObjectGetGeometryIndexNV: out.debug << "HitObjectGetGeometryIndexNV"; break;
1137     case EOpHitObjectGetPrimitiveIndexNV: out.debug << "HitObjectGetPrimitiveIndexNV"; break;
1138     case EOpHitObjectGetHitKindNV: out.debug << "HitObjectGetHitKindNV"; break;
1139     case EOpHitObjectGetAttributesNV: out.debug << "HitObjectGetAttributesNV"; break;
1140     case EOpHitObjectGetCurrentTimeNV: out.debug << "HitObjectGetCurrentTimeNV"; break;
1141     case EOpHitObjectGetShaderBindingTableRecordIndexNV: out.debug << "HitObjectGetShaderBindingTableRecordIndexNV"; break;
1142     case EOpHitObjectGetShaderRecordBufferHandleNV: out.debug << "HitObjectReadShaderRecordBufferHandleNV"; break;
1143     case EOpReorderThreadNV: out.debug << "ReorderThreadNV"; break;
1144     case EOpFetchMicroTriangleVertexPositionNV: out.debug << "MicroTriangleVertexPositionNV"; break;
1145     case EOpFetchMicroTriangleVertexBarycentricNV: out.debug << "MicroTriangleVertexBarycentricNV"; break;
1146 
1147     case EOpSpirvInst: out.debug << "spirv_instruction"; break;
1148     case EOpStencilAttachmentReadEXT: out.debug << "stencilAttachmentReadEXT"; break;
1149     case EOpDepthAttachmentReadEXT: out.debug << "depthAttachmentReadEXT"; break;
1150 
1151     default: out.debug.message(EPrefixError, "Bad aggregation op");
1152     }
1153 
1154     if (node->getOp() != EOpSequence && node->getOp() != EOpScope && node->getOp() != EOpParameters)
1155         out.debug << " (" << node->getCompleteString() << ")";
1156 
1157     out.debug << "\n";
1158 
1159     return true;
1160 }
1161 
visitSelection(TVisit,TIntermSelection * node)1162 bool TOutputTraverser::visitSelection(TVisit /* visit */, TIntermSelection* node)
1163 {
1164     TInfoSink& out = infoSink;
1165 
1166     OutputTreeText(out, node, depth);
1167 
1168     out.debug << "Test condition and select";
1169     out.debug << " (" << node->getCompleteString() << ")";
1170 
1171     if (node->getShortCircuit() == false)
1172         out.debug << ": no shortcircuit";
1173     if (node->getFlatten())
1174         out.debug << ": Flatten";
1175     if (node->getDontFlatten())
1176         out.debug << ": DontFlatten";
1177     out.debug << "\n";
1178 
1179     ++depth;
1180 
1181     OutputTreeText(out, node, depth);
1182     out.debug << "Condition\n";
1183     node->getCondition()->traverse(this);
1184 
1185     OutputTreeText(out, node, depth);
1186     if (node->getTrueBlock()) {
1187         out.debug << "true case\n";
1188         node->getTrueBlock()->traverse(this);
1189     } else
1190         out.debug << "true case is null\n";
1191 
1192     if (node->getFalseBlock()) {
1193         OutputTreeText(out, node, depth);
1194         out.debug << "false case\n";
1195         node->getFalseBlock()->traverse(this);
1196     }
1197 
1198     --depth;
1199 
1200     return false;
1201 }
1202 
1203 // Print infinities and NaNs, and numbers in a portable way.
1204 // Goals:
1205 //   - portable (across IEEE 754 platforms)
1206 //   - shows all possible IEEE values
1207 //   - shows simple numbers in a simple way, e.g., no leading/trailing 0s
1208 //   - shows all digits, no premature rounding
OutputDouble(TInfoSink & out,double value,TOutputTraverser::EExtraOutput extra)1209 static void OutputDouble(TInfoSink& out, double value, TOutputTraverser::EExtraOutput extra)
1210 {
1211     if (std::isinf(value)) {
1212         if (value < 0)
1213             out.debug << "-1.#INF";
1214         else
1215             out.debug << "+1.#INF";
1216     } else if (std::isnan(value))
1217         out.debug << "1.#IND";
1218     else {
1219         const int maxSize = 340;
1220         char buf[maxSize];
1221         const char* format = "%f";
1222         if (fabs(value) > 0.0 && (fabs(value) < 1e-5 || fabs(value) > 1e12))
1223             format = "%-.13e";
1224         int len = snprintf(buf, maxSize, format, value);
1225         assert(len < maxSize);
1226 
1227         // remove a leading zero in the 100s slot in exponent; it is not portable
1228         // pattern:   XX...XXXe+0XX or XX...XXXe-0XX
1229         if (len > 5) {
1230             if (buf[len-5] == 'e' && (buf[len-4] == '+' || buf[len-4] == '-') && buf[len-3] == '0') {
1231                 buf[len-3] = buf[len-2];
1232                 buf[len-2] = buf[len-1];
1233                 buf[len-1] = '\0';
1234             }
1235         }
1236 
1237         out.debug << buf;
1238 
1239         switch (extra) {
1240         case TOutputTraverser::BinaryDoubleOutput:
1241         {
1242             uint64_t b;
1243             static_assert(sizeof(b) == sizeof(value), "sizeof(uint64_t) != sizeof(double)");
1244             memcpy(&b, &value, sizeof(b));
1245 
1246             out.debug << " : ";
1247             for (size_t i = 0; i < 8 * sizeof(value); ++i, ++b) {
1248                 out.debug << ((b & 0x8000000000000000) != 0 ? "1" : "0");
1249                 b <<= 1;
1250             }
1251             break;
1252         }
1253         default:
1254             break;
1255         }
1256     }
1257 }
1258 
OutputConstantUnion(TInfoSink & out,const TIntermTyped * node,const TConstUnionArray & constUnion,TOutputTraverser::EExtraOutput extra,int depth)1259 static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion,
1260     TOutputTraverser::EExtraOutput extra, int depth)
1261 {
1262     int size = node->getType().computeNumComponents();
1263 
1264     for (int i = 0; i < size; i++) {
1265         OutputTreeText(out, node, depth);
1266         switch (constUnion[i].getType()) {
1267         case EbtBool:
1268             if (constUnion[i].getBConst())
1269                 out.debug << "true";
1270             else
1271                 out.debug << "false";
1272 
1273             out.debug << " (" << "const bool" << ")";
1274 
1275             out.debug << "\n";
1276             break;
1277         case EbtFloat:
1278         case EbtDouble:
1279         case EbtFloat16:
1280             OutputDouble(out, constUnion[i].getDConst(), extra);
1281             out.debug << "\n";
1282             break;
1283         case EbtInt8:
1284             {
1285                 const int maxSize = 300;
1286                 char buf[maxSize];
1287                 snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI8Const(), "const int8_t");
1288 
1289                 out.debug << buf << "\n";
1290             }
1291             break;
1292         case EbtUint8:
1293             {
1294                 const int maxSize = 300;
1295                 char buf[maxSize];
1296                 snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU8Const(), "const uint8_t");
1297 
1298                 out.debug << buf << "\n";
1299             }
1300             break;
1301         case EbtInt16:
1302             {
1303                 const int maxSize = 300;
1304                 char buf[maxSize];
1305                 snprintf(buf, maxSize, "%d (%s)", constUnion[i].getI16Const(), "const int16_t");
1306 
1307                 out.debug << buf << "\n";
1308             }
1309             break;
1310         case EbtUint16:
1311             {
1312                 const int maxSize = 300;
1313                 char buf[maxSize];
1314                 snprintf(buf, maxSize, "%u (%s)", constUnion[i].getU16Const(), "const uint16_t");
1315 
1316                 out.debug << buf << "\n";
1317             }
1318             break;
1319         case EbtInt:
1320             {
1321                 const int maxSize = 300;
1322                 char buf[maxSize];
1323                 snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int");
1324 
1325                 out.debug << buf << "\n";
1326             }
1327             break;
1328         case EbtUint:
1329             {
1330                 const int maxSize = 300;
1331                 char buf[maxSize];
1332                 snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint");
1333 
1334                 out.debug << buf << "\n";
1335             }
1336             break;
1337         case EbtInt64:
1338             {
1339                 const int maxSize = 300;
1340                 char buf[maxSize];
1341                 snprintf(buf, maxSize, "%lld (%s)", constUnion[i].getI64Const(), "const int64_t");
1342 
1343                 out.debug << buf << "\n";
1344             }
1345             break;
1346         case EbtUint64:
1347             {
1348                 const int maxSize = 300;
1349                 char buf[maxSize];
1350                 snprintf(buf, maxSize, "%llu (%s)", constUnion[i].getU64Const(), "const uint64_t");
1351 
1352                 out.debug << buf << "\n";
1353             }
1354             break;
1355         case EbtString:
1356             out.debug << "\"" << constUnion[i].getSConst()->c_str() << "\"\n";
1357             break;
1358         default:
1359             out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc());
1360             break;
1361         }
1362     }
1363 }
1364 
visitConstantUnion(TIntermConstantUnion * node)1365 void TOutputTraverser::visitConstantUnion(TIntermConstantUnion* node)
1366 {
1367     OutputTreeText(infoSink, node, depth);
1368     infoSink.debug << "Constant:\n";
1369 
1370     OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);
1371 }
1372 
visitSymbol(TIntermSymbol * node)1373 void TOutputTraverser::visitSymbol(TIntermSymbol* node)
1374 {
1375     OutputTreeText(infoSink, node, depth);
1376 
1377     infoSink.debug << "'" << node->getName() << "' (" << node->getCompleteString() << ")\n";
1378 
1379     if (! node->getConstArray().empty())
1380         OutputConstantUnion(infoSink, node, node->getConstArray(), extraOutput, depth + 1);
1381     else if (node->getConstSubtree()) {
1382         incrementDepth(node);
1383         node->getConstSubtree()->traverse(this);
1384         decrementDepth();
1385     }
1386 }
1387 
visitLoop(TVisit,TIntermLoop * node)1388 bool TOutputTraverser::visitLoop(TVisit /* visit */, TIntermLoop* node)
1389 {
1390     TInfoSink& out = infoSink;
1391 
1392     OutputTreeText(out, node, depth);
1393 
1394     out.debug << "Loop with condition ";
1395     if (! node->testFirst())
1396         out.debug << "not ";
1397     out.debug << "tested first";
1398 
1399     if (node->getUnroll())
1400         out.debug << ": Unroll";
1401     if (node->getDontUnroll())
1402         out.debug << ": DontUnroll";
1403     if (node->getLoopDependency()) {
1404         out.debug << ": Dependency ";
1405         out.debug << node->getLoopDependency();
1406     }
1407     out.debug << "\n";
1408 
1409     ++depth;
1410 
1411     OutputTreeText(infoSink, node, depth);
1412     if (node->getTest()) {
1413         out.debug << "Loop Condition\n";
1414         node->getTest()->traverse(this);
1415     } else
1416         out.debug << "No loop condition\n";
1417 
1418     OutputTreeText(infoSink, node, depth);
1419     if (node->getBody()) {
1420         out.debug << "Loop Body\n";
1421         node->getBody()->traverse(this);
1422     } else
1423         out.debug << "No loop body\n";
1424 
1425     if (node->getTerminal()) {
1426         OutputTreeText(infoSink, node, depth);
1427         out.debug << "Loop Terminal Expression\n";
1428         node->getTerminal()->traverse(this);
1429     }
1430 
1431     --depth;
1432 
1433     return false;
1434 }
1435 
visitBranch(TVisit,TIntermBranch * node)1436 bool TOutputTraverser::visitBranch(TVisit /* visit*/, TIntermBranch* node)
1437 {
1438     TInfoSink& out = infoSink;
1439 
1440     OutputTreeText(out, node, depth);
1441 
1442     switch (node->getFlowOp()) {
1443     case EOpKill:                   out.debug << "Branch: Kill";                  break;
1444     case EOpTerminateInvocation:    out.debug << "Branch: TerminateInvocation";   break;
1445     case EOpIgnoreIntersectionKHR:  out.debug << "Branch: IgnoreIntersectionKHR"; break;
1446     case EOpTerminateRayKHR:        out.debug << "Branch: TerminateRayKHR";       break;
1447     case EOpBreak:                  out.debug << "Branch: Break";                 break;
1448     case EOpContinue:               out.debug << "Branch: Continue";              break;
1449     case EOpReturn:                 out.debug << "Branch: Return";                break;
1450     case EOpCase:                   out.debug << "case: ";                        break;
1451     case EOpDemote:                 out.debug << "Demote";                        break;
1452     case EOpDefault:                out.debug << "default: ";                     break;
1453     default:                        out.debug << "Branch: Unknown Branch";        break;
1454     }
1455 
1456     if (node->getExpression()) {
1457         out.debug << " with expression\n";
1458         ++depth;
1459         node->getExpression()->traverse(this);
1460         --depth;
1461     } else
1462         out.debug << "\n";
1463 
1464     return false;
1465 }
1466 
visitSwitch(TVisit,TIntermSwitch * node)1467 bool TOutputTraverser::visitSwitch(TVisit /* visit */, TIntermSwitch* node)
1468 {
1469     TInfoSink& out = infoSink;
1470 
1471     OutputTreeText(out, node, depth);
1472     out.debug << "switch";
1473 
1474     if (node->getFlatten())
1475         out.debug << ": Flatten";
1476     if (node->getDontFlatten())
1477         out.debug << ": DontFlatten";
1478     out.debug << "\n";
1479 
1480     OutputTreeText(out, node, depth);
1481     out.debug << "condition\n";
1482     ++depth;
1483     node->getCondition()->traverse(this);
1484 
1485     --depth;
1486     OutputTreeText(out, node, depth);
1487     out.debug << "body\n";
1488     ++depth;
1489     node->getBody()->traverse(this);
1490 
1491     --depth;
1492 
1493     return false;
1494 }
1495 
1496 //
1497 // This function is the one to call externally to start the traversal.
1498 // Individual functions can be initialized to 0 to skip processing of that
1499 // type of node.  It's children will still be processed.
1500 //
output(TInfoSink & infoSink,bool tree)1501 void TIntermediate::output(TInfoSink& infoSink, bool tree)
1502 {
1503     infoSink.debug << "Shader version: " << version << "\n";
1504     if (requestedExtensions.size() > 0) {
1505         for (auto extIt = requestedExtensions.begin(); extIt != requestedExtensions.end(); ++extIt)
1506             infoSink.debug << "Requested " << *extIt << "\n";
1507     }
1508 
1509     if (xfbMode)
1510         infoSink.debug << "in xfb mode\n";
1511 
1512     if (getSubgroupUniformControlFlow())
1513         infoSink.debug << "subgroup_uniform_control_flow\n";
1514 
1515     switch (language) {
1516     case EShLangVertex:
1517         break;
1518 
1519     case EShLangTessControl:
1520         infoSink.debug << "vertices = " << vertices << "\n";
1521 
1522         if (inputPrimitive != ElgNone)
1523             infoSink.debug << "input primitive = " << TQualifier::getGeometryString(inputPrimitive) << "\n";
1524         if (vertexSpacing != EvsNone)
1525             infoSink.debug << "vertex spacing = " << TQualifier::getVertexSpacingString(vertexSpacing) << "\n";
1526         if (vertexOrder != EvoNone)
1527             infoSink.debug << "triangle order = " << TQualifier::getVertexOrderString(vertexOrder) << "\n";
1528         break;
1529 
1530     case EShLangTessEvaluation:
1531         infoSink.debug << "input primitive = " << TQualifier::getGeometryString(inputPrimitive) << "\n";
1532         infoSink.debug << "vertex spacing = " << TQualifier::getVertexSpacingString(vertexSpacing) << "\n";
1533         infoSink.debug << "triangle order = " << TQualifier::getVertexOrderString(vertexOrder) << "\n";
1534         if (pointMode)
1535             infoSink.debug << "using point mode\n";
1536         break;
1537 
1538     case EShLangGeometry:
1539         infoSink.debug << "invocations = " << invocations << "\n";
1540         infoSink.debug << "max_vertices = " << vertices << "\n";
1541         infoSink.debug << "input primitive = " << TQualifier::getGeometryString(inputPrimitive) << "\n";
1542         infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
1543         break;
1544 
1545     case EShLangFragment:
1546         if (pixelCenterInteger)
1547             infoSink.debug << "gl_FragCoord pixel center is integer\n";
1548         if (originUpperLeft)
1549             infoSink.debug << "gl_FragCoord origin is upper left\n";
1550         if (earlyFragmentTests)
1551             infoSink.debug << "using early_fragment_tests\n";
1552         if (postDepthCoverage)
1553             infoSink.debug << "using post_depth_coverage\n";
1554         if (nonCoherentColorAttachmentReadEXT)
1555             infoSink.debug << "using non_coherent_color_attachment_readEXT\n";
1556         if (nonCoherentDepthAttachmentReadEXT)
1557             infoSink.debug << "using non_coherent_depth_attachment_readEXT\n";
1558         if (nonCoherentStencilAttachmentReadEXT)
1559             infoSink.debug << "using non_coherent_stencil_attachment_readEXT\n";
1560         if (depthLayout != EldNone)
1561             infoSink.debug << "using " << TQualifier::getLayoutDepthString(depthLayout) << "\n";
1562         if (blendEquations != 0) {
1563             infoSink.debug << "using";
1564             // blendEquations is a mask, decode it
1565             for (TBlendEquationShift be = (TBlendEquationShift)0; be < EBlendCount; be = (TBlendEquationShift)(be + 1)) {
1566                 if (blendEquations & (1 << be))
1567                     infoSink.debug << " " << TQualifier::getBlendEquationString(be);
1568             }
1569             infoSink.debug << "\n";
1570         }
1571         if (interlockOrdering != EioNone)
1572             infoSink.debug << "interlock ordering = " << TQualifier::getInterlockOrderingString(interlockOrdering) << "\n";
1573         break;
1574 
1575     case EShLangMesh:
1576         infoSink.debug << "max_vertices = " << vertices << "\n";
1577         infoSink.debug << "max_primitives = " << primitives << "\n";
1578         infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
1579         // Fall through
1580     case EShLangTask:
1581         // Fall through
1582     case EShLangCompute:
1583         infoSink.debug << "local_size = (" << localSize[0] << ", " << localSize[1] << ", " << localSize[2] << ")\n";
1584         {
1585             if (localSizeSpecId[0] != TQualifier::layoutNotSet ||
1586                 localSizeSpecId[1] != TQualifier::layoutNotSet ||
1587                 localSizeSpecId[2] != TQualifier::layoutNotSet) {
1588                 infoSink.debug << "local_size ids = (" <<
1589                     localSizeSpecId[0] << ", " <<
1590                     localSizeSpecId[1] << ", " <<
1591                     localSizeSpecId[2] << ")\n";
1592             }
1593         }
1594         break;
1595 
1596     default:
1597         break;
1598     }
1599 
1600     if (treeRoot == nullptr || ! tree)
1601         return;
1602 
1603     TOutputTraverser it(infoSink);
1604     if (getBinaryDoubleOutput())
1605         it.setDoubleOutput(TOutputTraverser::BinaryDoubleOutput);
1606     treeRoot->traverse(&it);
1607 }
1608 
1609 } // end namespace glslang
1610