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