glslang AST -> SPIR-V: Move to new auto-generated official headers, and for the disas...
authorJohn Kessenich <cepheus@frii.com>
Mon, 30 Mar 2015 17:41:16 +0000 (17:41 +0000)
committerJohn Kessenich <cepheus@frii.com>
Mon, 30 Mar 2015 17:41:16 +0000 (17:41 +0000)
git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@30434 e7fa87d3-cd2b-0410-9028-fcbf551c1848

SPIRV/GLSL450Lib.h
SPIRV/GlslangToSpv.cpp
SPIRV/SpvBuilder.cpp
SPIRV/SpvBuilder.h
SPIRV/disassemble.cpp
SPIRV/doc.cpp
SPIRV/doc.h
SPIRV/spirv.h
SPIRV/spvIR.h

index f32f143..aa92375 100644 (file)
@@ -124,7 +124,7 @@ enum Entrypoints {
 inline void GetDebugNames(const char** names)\r
 {\r
     for (int i = 0; i < Count; ++i)\r
-        names[i] = "unknown";\r
+        names[i] = "Unknown";\r
 \r
     names[Round]                   = "round";\r
     names[RoundEven]               = "roundEven";\r
index 332c5ec..8cba921 100644 (file)
@@ -134,15 +134,15 @@ protected:
 spv::ExecutionModel TranslateExecutionModel(EShLanguage stage)\r
 {\r
     switch (stage) {\r
-    case EShLangVertex:           return spv::ModelVertex;\r
-    case EShLangTessControl:      return spv::ModelTessellationControl;\r
-    case EShLangTessEvaluation:   return spv::ModelTessellationEvaluation;\r
-    case EShLangGeometry:         return spv::ModelGeometry;\r
-    case EShLangFragment:         return spv::ModelFragment;\r
-    case EShLangCompute:          return spv::ModelGLCompute;\r
+    case EShLangVertex:           return spv::ExecutionModelVertex;\r
+    case EShLangTessControl:      return spv::ExecutionModelTessellationControl;\r
+    case EShLangTessEvaluation:   return spv::ExecutionModelTessellationEvaluation;\r
+    case EShLangGeometry:         return spv::ExecutionModelGeometry;\r
+    case EShLangFragment:         return spv::ExecutionModelFragment;\r
+    case EShLangCompute:          return spv::ExecutionModelGLCompute;\r
     default:\r
         spv::MissingFunctionality("GLSL stage");\r
-        return spv::ModelFragment;\r
+        return spv::ExecutionModelFragment;\r
     }\r
 }\r
 \r
@@ -150,30 +150,30 @@ spv::ExecutionModel TranslateExecutionModel(EShLanguage stage)
 spv::StorageClass TranslateStorageClass(const glslang::TType& type)\r
 {\r
     if (type.getQualifier().isPipeInput())\r
-        return spv::StorageInput;\r
+        return spv::StorageClassInput;\r
     else if (type.getQualifier().isPipeOutput())\r
-        return spv::StorageOutput;\r
+        return spv::StorageClassOutput;\r
     else if (type.getQualifier().isUniformOrBuffer()) {\r
         if (type.getBasicType() == glslang::EbtBlock)\r
-            return spv::StorageUniform;\r
+            return spv::StorageClassUniform;\r
         else\r
-            return spv::StorageConstantUniform;\r
+            return spv::StorageClassUniformConstant;\r
         // TODO: how are we distuingishing between default and non-default non-writable uniforms?  Do default uniforms even exist?\r
     } else {\r
         switch (type.getQualifier().storage) {\r
-        case glslang::EvqShared:        return spv::StorageWorkgroupLocal;  break;\r
-        case glslang::EvqGlobal:        return spv::StoragePrivateGlobal;\r
-        case glslang::EvqConstReadOnly: return spv::StorageFunction;\r
-        case glslang::EvqTemporary:     return spv::StorageFunction;\r
+        case glslang::EvqShared:        return spv::StorageClassWorkgroupLocal;  break;\r
+        case glslang::EvqGlobal:        return spv::StorageClassPrivateGlobal;\r
+        case glslang::EvqConstReadOnly: return spv::StorageClassFunction;\r
+        case glslang::EvqTemporary:     return spv::StorageClassFunction;\r
         default: \r
             spv::MissingFunctionality("unknown glslang storage class");\r
-            return spv::StorageCount;\r
+            return spv::StorageClassFunction;\r
         }\r
     }\r
 }\r
 \r
 // Translate glslang sampler type to SPIR-V dimensionality.\r
-spv::Dimensionality TranslateDimensionality(const glslang::TSampler& sampler)\r
+spv::Dim TranslateDimensionality(const glslang::TSampler& sampler)\r
 {\r
     switch (sampler.dim) {\r
     case glslang::Esd1D:     return spv::Dim1D;\r
@@ -192,10 +192,11 @@ spv::Dimensionality TranslateDimensionality(const glslang::TSampler& sampler)
 spv::Decoration TranslatePrecisionDecoration(const glslang::TType& type)\r
 {\r
     switch (type.getQualifier().precision) {\r
-    case glslang::EpqLow:    return spv::DecPrecisionLow;\r
-    case glslang::EpqMedium: return spv::DecPrecisionMedium;\r
-    case glslang::EpqHigh:   return spv::DecPrecisionHigh;\r
-    default:                 return spv::DecCount;\r
+    case glslang::EpqLow:    return spv::DecorationPrecisionLow;\r
+    case glslang::EpqMedium: return spv::DecorationPrecisionMedium;\r
+    case glslang::EpqHigh:   return spv::DecorationPrecisionHigh;\r
+    default:\r
+        return spv::NoPrecision;\r
     }\r
 }\r
 \r
@@ -204,17 +205,17 @@ spv::Decoration TranslateBlockDecoration(const glslang::TType& type)
 {\r
     if (type.getBasicType() == glslang::EbtBlock) {\r
         switch (type.getQualifier().storage) {\r
-        case glslang::EvqUniform:      return spv::DecBlock;\r
-        case glslang::EvqBuffer:       return spv::DecBufferBlock;\r
-        case glslang::EvqVaryingIn:    return spv::DecBlock;\r
-        case glslang::EvqVaryingOut:   return spv::DecBlock;\r
+        case glslang::EvqUniform:      return spv::DecorationBlock;\r
+        case glslang::EvqBuffer:       return spv::DecorationBufferBlock;\r
+        case glslang::EvqVaryingIn:    return spv::DecorationBlock;\r
+        case glslang::EvqVaryingOut:   return spv::DecorationBlock;\r
         default:\r
             spv::MissingFunctionality("kind of block");\r
             break;\r
         }\r
     }\r
 \r
-    return spv::DecCount;\r
+    return (spv::Decoration)spv::BadValue;\r
 }\r
 \r
 // Translate glslang type to SPIR-V layout decorations.\r
@@ -223,36 +224,36 @@ spv::Decoration TranslateLayoutDecoration(const glslang::TType& type)
     if (type.isMatrix()) {\r
         switch (type.getQualifier().layoutMatrix) {\r
         case glslang::ElmRowMajor:\r
-            return spv::DecRowMajor;\r
+            return spv::DecorationRowMajor;\r
         default:\r
-            return spv::DecColMajor;\r
+            return spv::DecorationColMajor;\r
         }\r
     } else {\r
         switch (type.getBasicType()) {\r
         default:\r
-            return spv::DecCount;\r
+            return (spv::Decoration)spv::BadValue;\r
             break;\r
         case glslang::EbtBlock:\r
             switch (type.getQualifier().storage) {\r
             case glslang::EvqUniform:\r
             case glslang::EvqBuffer:\r
                 switch (type.getQualifier().layoutPacking) {\r
-                case glslang::ElpShared:  return spv::DecGLSLShared;\r
-                case glslang::ElpStd140:  return spv::DecGLSLStd140;\r
-                case glslang::ElpStd430:  return spv::DecGLSLStd430;\r
-                case glslang::ElpPacked:  return spv::DecGLSLPacked;\r
+                case glslang::ElpShared:  return spv::DecorationGLSLShared;\r
+                case glslang::ElpStd140:  return spv::DecorationGLSLStd140;\r
+                case glslang::ElpStd430:  return spv::DecorationGLSLStd430;\r
+                case glslang::ElpPacked:  return spv::DecorationGLSLPacked;\r
                 default:\r
                     spv::MissingFunctionality("uniform block layout");\r
-                    return spv::DecGLSLShared;\r
+                    return spv::DecorationGLSLShared;\r
                 }\r
             case glslang::EvqVaryingIn:\r
             case glslang::EvqVaryingOut:\r
                 if (type.getQualifier().layoutPacking != glslang::ElpNone)\r
                     spv::MissingFunctionality("in/out block layout");\r
-                return spv::DecCount;\r
+                return (spv::Decoration)spv::BadValue;\r
             default:\r
                 spv::MissingFunctionality("block storage qualification");\r
-                return spv::DecCount;\r
+                return (spv::Decoration)spv::BadValue;\r
             }\r
         }\r
     }\r
@@ -262,28 +263,28 @@ spv::Decoration TranslateLayoutDecoration(const glslang::TType& type)
 spv::Decoration TranslateInterpolationDecoration(const glslang::TType& type)\r
 {\r
     if (type.getQualifier().smooth)\r
-        return spv::DecSmooth;\r
+        return spv::DecorationSmooth;\r
     if (type.getQualifier().nopersp)\r
-        return spv::DecNoperspective;\r
+        return spv::DecorationNoperspective;\r
     else if (type.getQualifier().patch)\r
-        return spv::DecPatch;\r
+        return spv::DecorationPatch;\r
     else if (type.getQualifier().flat)\r
-        return spv::DecFlat;\r
+        return spv::DecorationFlat;\r
     else if (type.getQualifier().centroid)\r
-        return spv::DecCentroid;\r
+        return spv::DecorationCentroid;\r
     else if (type.getQualifier().sample)\r
-        return spv::DecSample;\r
+        return spv::DecorationSample;\r
     else\r
-        return spv::DecCount;\r
+        return (spv::Decoration)spv::BadValue;\r
 }\r
 \r
 // If glslang type is invaraiant, return SPIR-V invariant decoration.\r
 spv::Decoration TranslateInvariantDecoration(const glslang::TType& type)\r
 {\r
     if (type.getQualifier().invariant)\r
-        return spv::DecInvariant;\r
+        return spv::DecorationInvariant;\r
     else\r
-        return spv::DecCount;\r
+        return (spv::Decoration)spv::BadValue;\r
 }\r
 \r
 // Identify what SPIR-V built-in variable a symbol is.\r
@@ -312,7 +313,7 @@ spv::BuiltIn TranslateBuiltIn(const glslang::TIntermSymbol* node)
 {\r
     const glslang::TString& name = node->getName();\r
     if (name.compare(0, 3, "gl_") != 0)\r
-        return spv::BuiltInCount;\r
+        return (spv::BuiltIn)spv::BadValue;\r
 \r
     switch (node->getQualifier().storage) {\r
     case glslang::EvqPosition:   return spv::BuiltInPosition;\r
@@ -325,7 +326,7 @@ spv::BuiltIn TranslateBuiltIn(const glslang::TIntermSymbol* node)
     case glslang::EvqFace:       return spv::BuiltInFrontFacing;\r
     case glslang::EvqFragColor:  return spv::BuiltInFragColor;\r
     case glslang::EvqFragDepth:  return spv::BuiltInFragDepth;\r
-    default:                     return spv::BuiltInCount;\r
+    default:                     return (spv::BuiltIn)spv::BadValue;\r
         if (name == "gl_ClipDistance")\r
             return spv::BuiltInClipDistance;\r
         else if (name == "gl_PrimitiveID" || name == "gl_PrimitiveIDIn")\r
@@ -380,9 +381,9 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
     spv::ExecutionModel executionModel = TranslateExecutionModel(glslangIntermediate->getStage());\r
 \r
     builder.clearAccessChain();\r
-    builder.setSource(spv::LangGLSL, glslangIntermediate->getVersion());\r
+    builder.setSource(spv::SourceLanguageGLSL, glslangIntermediate->getVersion());\r
     stdBuiltins = builder.import("GLSL.std.450");\r
-    builder.setMemoryModel(spv::AddressingLogical, spv::MemoryGLSL450);\r
+    builder.setMemoryModel(spv::AddressingModelLogical, spv::MemoryModelGLSL450);\r
     shaderEntry = builder.makeMain();\r
     builder.addEntryPoint(executionModel, shaderEntry);\r
 \r
@@ -394,7 +395,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
     // Add the top-level modes for this shader.\r
 \r
     if (glslangIntermediate->getXfbMode())\r
-        builder.addExecutionMode(shaderEntry, spv::ExecutionXfb);\r
+        builder.addExecutionMode(shaderEntry, spv::ExecutionModeXfb);\r
 \r
     spv::ExecutionMode mode;\r
     switch (glslangIntermediate->getStage()) {\r
@@ -402,17 +403,17 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
         break;\r
 \r
     case EShLangTessControl:\r
-        builder.addExecutionMode(shaderEntry, spv::ExecutionOutputVertices, glslangIntermediate->getVertices());\r
+        builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices, glslangIntermediate->getVertices());\r
         break;\r
 \r
     case EShLangTessEvaluation:\r
         switch (glslangIntermediate->getInputPrimitive()) {\r
-        case glslang::ElgTriangles:           mode = spv::ExecutionInputTriangles;     break;\r
-        case glslang::ElgQuads:               mode = spv::ExecutionInputQuads;         break;\r
-        case glslang::ElgIsolines:            mode = spv::ExecutionInputIsolines;      break;\r
-        default:                              mode = spv::ExecutionModeCount;          break;\r
+        case glslang::ElgTriangles:           mode = spv::ExecutionModeInputTriangles;     break;\r
+        case glslang::ElgQuads:               mode = spv::ExecutionModeInputQuads;         break;\r
+        case glslang::ElgIsolines:            mode = spv::ExecutionModeInputIsolines;      break;\r
+        default:                              mode = (spv::ExecutionMode)spv::BadValue;    break;\r
         }\r
-        if (mode != spv::ExecutionModeCount)\r
+        if (mode != spv::BadValue)\r
             builder.addExecutionMode(shaderEntry, mode);\r
 \r
         // TODO\r
@@ -423,33 +424,33 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
 \r
     case EShLangGeometry:\r
         switch (glslangIntermediate->getInputPrimitive()) {\r
-        case glslang::ElgPoints:             mode = spv::ExecutionInputPoints;             break;\r
-        case glslang::ElgLines:              mode = spv::ExecutionInputLines;              break;\r
-        case glslang::ElgLinesAdjacency:     mode = spv::ExecutionInputLinesAdjacency;     break;\r
-        case glslang::ElgTriangles:          mode = spv::ExecutionInputTriangles;          break;\r
-        case glslang::ElgTrianglesAdjacency: mode = spv::ExecutionInputTrianglesAdjacency; break;\r
-        default:                             mode = spv::ExecutionModeCount;               break;\r
+        case glslang::ElgPoints:             mode = spv::ExecutionModeInputPoints;             break;\r
+        case glslang::ElgLines:              mode = spv::ExecutionModeInputLines;              break;\r
+        case glslang::ElgLinesAdjacency:     mode = spv::ExecutionModeInputLinesAdjacency;     break;\r
+        case glslang::ElgTriangles:          mode = spv::ExecutionModeInputTriangles;          break;\r
+        case glslang::ElgTrianglesAdjacency: mode = spv::ExecutionModeInputTrianglesAdjacency; break;\r
+        default:                             mode = (spv::ExecutionMode)spv::BadValue;         break;\r
         }\r
-        if (mode != spv::ExecutionModeCount)\r
+        if (mode != spv::BadValue)\r
             builder.addExecutionMode(shaderEntry, mode);\r
-        builder.addExecutionMode(shaderEntry, spv::ExecutionInvocations, glslangIntermediate->getInvocations());\r
+        builder.addExecutionMode(shaderEntry, spv::ExecutionModeInvocations, glslangIntermediate->getInvocations());\r
 \r
         switch (glslangIntermediate->getOutputPrimitive()) {\r
-        case glslang::ElgPoints:        mode = spv::ExecutionOutputPoints;                 break;\r
-        case glslang::ElgLineStrip:     mode = spv::ExecutionOutputLineStrip;              break;\r
-        case glslang::ElgTriangleStrip: mode = spv::ExecutionOutputTriangleStrip;          break;\r
-        default:                        mode = spv::ExecutionModeCount;                    break;\r
+        case glslang::ElgPoints:        mode = spv::ExecutionModeOutputPoints;                 break;\r
+        case glslang::ElgLineStrip:     mode = spv::ExecutionModeOutputLineStrip;              break;\r
+        case glslang::ElgTriangleStrip: mode = spv::ExecutionModeOutputTriangleStrip;          break;\r
+        default:                        mode = (spv::ExecutionMode)spv::BadValue;              break;\r
         }\r
-        if (mode != spv::ExecutionModeCount)\r
+        if (mode != spv::BadValue)\r
             builder.addExecutionMode(shaderEntry, mode);\r
-        builder.addExecutionMode(shaderEntry, spv::ExecutionOutputVertices, glslangIntermediate->getVertices());\r
+        builder.addExecutionMode(shaderEntry, spv::ExecutionModeOutputVertices, glslangIntermediate->getVertices());\r
         break;\r
 \r
     case EShLangFragment:\r
         if (glslangIntermediate->getPixelCenterInteger())\r
-            builder.addExecutionMode(shaderEntry, spv::ExecutionPixelCenterInteger);\r
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModePixelCenterInteger);\r
         if (glslangIntermediate->getOriginUpperLeft())\r
-            builder.addExecutionMode(shaderEntry, spv::ExecutionOriginUpperLeft);\r
+            builder.addExecutionMode(shaderEntry, spv::ExecutionModeOriginUpperLeft);\r
         break;\r
 \r
     case EShLangCompute:\r
@@ -1075,14 +1076,14 @@ bool TGlslangToSpvTraverser::visitSelection(glslang::TVisit /* visit */, glslang
     if (node->getBasicType() != glslang::EbtVoid) {\r
         // don't handle this as just on-the-fly temporaries, because there will be two names\r
         // and better to leave SSA to later passes\r
-        result = builder.createVariable(spv::StorageFunction, convertGlslangToSpvType(node->getType()));\r
+        result = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(node->getType()));\r
     }\r
 \r
     // emit the condition before doing anything with selection\r
     node->getCondition()->traverse(this);\r
 \r
     // make an "if" based on the value created by the condition\r
-    spv::Builder::If ifBuilder(builder.accessChainLoad(spv::DecCount), builder);\r
+    spv::Builder::If ifBuilder(builder.accessChainLoad(spv::NoPrecision), builder);\r
 \r
     if (node->getTrueBlock()) {\r
         // emit the "then" statement\r
@@ -1266,8 +1267,8 @@ spv::Id TGlslangToSpvTraverser::createSpvVariable(const glslang::TIntermSymbol*
     if (glslang::IsAnonymous(name))\r
         name = "";\r
 \r
-    if (storageClass == spv::StorageCount)\r
-        return builder.createVariable(spv::StorageFunction, spvType, name);\r
+    if (storageClass == spv::BadValue)\r
+        return builder.createVariable(spv::StorageClassFunction, spvType, name);\r
     else\r
         return builder.createVariable(storageClass, spvType, name);\r
 }\r
@@ -1366,11 +1367,11 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
                     addMemberDecoration(spvType, member, TranslateInterpolationDecoration(glslangType));\r
                     addMemberDecoration(spvType, member, TranslateInvariantDecoration(glslangType));\r
                     if (glslangType.getQualifier().hasLocation())\r
-                        builder.addMemberDecoration(spvType, member, spv::DecLocation, glslangType.getQualifier().layoutLocation);\r
+                        builder.addMemberDecoration(spvType, member, spv::DecorationLocation, glslangType.getQualifier().layoutLocation);\r
                     if (glslangType.getQualifier().hasComponent())\r
-                        builder.addMemberDecoration(spvType, member, spv::DecComponent, glslangType.getQualifier().layoutComponent);\r
+                        builder.addMemberDecoration(spvType, member, spv::DecorationComponent, glslangType.getQualifier().layoutComponent);\r
                     if (glslangType.getQualifier().hasXfbOffset())\r
-                        builder.addMemberDecoration(spvType, member, spv::DecOffset, glslangType.getQualifier().layoutXfbOffset);\r
+                        builder.addMemberDecoration(spvType, member, spv::DecorationOffset, glslangType.getQualifier().layoutXfbOffset);\r
                 }\r
             }\r
 \r
@@ -1378,12 +1379,12 @@ spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& ty
             addDecoration(spvType, TranslateLayoutDecoration(type));\r
             addDecoration(spvType, TranslateBlockDecoration(type));\r
             if (type.getQualifier().hasStream())\r
-                builder.addDecoration(spvType, spv::DecStream, type.getQualifier().layoutStream);\r
+                builder.addDecoration(spvType, spv::DecorationStream, type.getQualifier().layoutStream);\r
             if (glslangIntermediate->getXfbMode()) {\r
                 if (type.getQualifier().hasXfbStride())\r
-                    builder.addDecoration(spvType, spv::DecStride, type.getQualifier().layoutXfbStride);\r
+                    builder.addDecoration(spvType, spv::DecorationStride, type.getQualifier().layoutXfbStride);\r
                 if (type.getQualifier().hasXfbBuffer())\r
-                    builder.addDecoration(spvType, spv::DecXfbBuffer, type.getQualifier().layoutXfbBuffer);\r
+                    builder.addDecoration(spvType, spv::DecorationXfbBuffer, type.getQualifier().layoutXfbBuffer);\r
             }\r
         }\r
         break;\r
@@ -1448,7 +1449,7 @@ void TGlslangToSpvTraverser::makeFunctions(const glslang::TIntermSequence& glslF
             const glslang::TType& paramType = parameters[p]->getAsTyped()->getType();\r
             spv::Id typeId = convertGlslangToSpvType(paramType);\r
             if (paramType.getQualifier().storage != glslang::EvqConstReadOnly)\r
-                typeId = builder.makePointer(spv::StorageFunction, typeId);\r
+                typeId = builder.makePointer(spv::StorageClassFunction, typeId);\r
             else\r
                 constReadOnlyParameters.insert(parameters[p]->getAsSymbolNode()->getId());\r
             paramTypes.push_back(typeId);\r
@@ -1674,11 +1675,11 @@ spv::Id TGlslangToSpvTraverser::handleUserFunctionCall(const glslang::TIntermAgg
         if (qualifiers[a] != glslang::EvqConstReadOnly) {\r
             // need space to hold the copy\r
             const glslang::TType& paramType = glslangArgs[a]->getAsTyped()->getType();\r
-            arg = builder.createVariable(spv::StorageFunction, convertGlslangToSpvType(paramType), "param");\r
+            arg = builder.createVariable(spv::StorageClassFunction, convertGlslangToSpvType(paramType), "param");\r
             if (qualifiers[a] == glslang::EvqIn || qualifiers[a] == glslang::EvqInOut) {\r
                 // need to copy the input into output space\r
                 builder.setAccessChain(lValues[lValueCount]);\r
-                spv::Id copy = builder.accessChainLoad(spv::DecCount);  // TODO: get precision\r
+                spv::Id copy = builder.accessChainLoad(spv::NoPrecision);  // TODO: get precision\r
                 builder.createStore(copy, arg);\r
             }\r
             ++lValueCount;\r
@@ -1715,7 +1716,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
     bool isUnsigned = typeProxy == glslang::EbtUint;\r
     bool isFloat = typeProxy == glslang::EbtFloat || typeProxy == glslang::EbtDouble;\r
 \r
-    spv::OpCode binOp = spv::OpNop;\r
+    spv::Op binOp = spv::OpNop;\r
     bool needsPromotion = true;\r
     bool comparison = false;\r
 \r
@@ -1943,7 +1944,7 @@ spv::Id TGlslangToSpvTraverser::createBinaryOperation(glslang::TOperator op, spv
 \r
 spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, spv::Id operand, bool isFloat)\r
 {\r
-    spv::OpCode unaryOp = spv::OpNop;\r
+    spv::Op unaryOp = spv::OpNop;\r
     int libCall = -1;\r
 \r
     switch (op) {\r
@@ -2158,7 +2159,7 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, spv:
 \r
 spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destType, spv::Id operand)\r
 {\r
-    spv::OpCode convOp = spv::OpNop;\r
+    spv::Op convOp = spv::OpNop;\r
     spv::Id zero;\r
     spv::Id one;\r
 \r
@@ -2265,7 +2266,7 @@ spv::Id TGlslangToSpvTraverser::makeSmearedConstant(spv::Id constant, int vector
 \r
 spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, bool isUnsigned)\r
 {\r
-    spv::OpCode opCode = spv::OpNop;\r
+    spv::Op opCode = spv::OpNop;\r
     int libCall = -1;\r
 \r
     switch (op) {\r
@@ -2371,19 +2372,19 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op)
         builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsAllMemory);\r
         return 0;\r
     case glslang::EOpMemoryBarrierAtomicCounter:\r
-        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsAtomicCounter);\r
+        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsAtomicCounterMemoryMask);\r
         return 0;\r
     case glslang::EOpMemoryBarrierBuffer:\r
-        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsUniform);\r
+        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsUniformMemoryMask);\r
         return 0;\r
     case glslang::EOpMemoryBarrierImage:\r
-        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsImage);\r
+        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsImageMemoryMask);\r
         return 0;\r
     case glslang::EOpMemoryBarrierShared:\r
-        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsWorkgroupLocal);\r
+        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsWorkgroupLocalMemoryMask);\r
         return 0;\r
     case glslang::EOpGroupMemoryBarrier:\r
-        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsWorkgroupGlobal);\r
+        builder.createMemoryBarrier(spv::ExecutionScopeDevice, spv::MemorySemanticsWorkgroupGlobalMemoryMask);\r
         return 0;\r
     default:\r
         spv::MissingFunctionality("operation with no arguments");\r
@@ -2409,53 +2410,53 @@ spv::Id TGlslangToSpvTraverser::getSymbolId(const glslang::TIntermSymbol* symbol
         addDecoration(id, TranslatePrecisionDecoration(symbol->getType()));\r
         addDecoration(id, TranslateInterpolationDecoration(symbol->getType()));\r
         if (symbol->getQualifier().hasLocation())\r
-            builder.addDecoration(id, spv::DecLocation, symbol->getQualifier().layoutLocation);\r
+            builder.addDecoration(id, spv::DecorationLocation, symbol->getQualifier().layoutLocation);\r
         if (symbol->getQualifier().hasComponent())\r
-            builder.addDecoration(id, spv::DecComponent, symbol->getQualifier().layoutComponent);\r
+            builder.addDecoration(id, spv::DecorationComponent, symbol->getQualifier().layoutComponent);\r
         if (glslangIntermediate->getXfbMode()) {\r
             if (symbol->getQualifier().hasXfbStride())\r
-                builder.addDecoration(id, spv::DecStride, symbol->getQualifier().layoutXfbStride);\r
+                builder.addDecoration(id, spv::DecorationStride, symbol->getQualifier().layoutXfbStride);\r
             if (symbol->getQualifier().hasXfbBuffer())\r
-                builder.addDecoration(id, spv::DecXfbBuffer, symbol->getQualifier().layoutXfbBuffer);\r
+                builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);\r
             if (symbol->getQualifier().hasXfbOffset())\r
-                builder.addDecoration(id, spv::DecOffset, symbol->getQualifier().layoutXfbOffset);\r
+                builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);\r
         }\r
     }\r
 \r
     addDecoration(id, TranslateInvariantDecoration(symbol->getType()));\r
     if (symbol->getQualifier().hasStream())\r
-        builder.addDecoration(id, spv::DecStream, symbol->getQualifier().layoutStream);\r
+        builder.addDecoration(id, spv::DecorationStream, symbol->getQualifier().layoutStream);\r
     if (symbol->getQualifier().hasSet())\r
-        builder.addDecoration(id, spv::DecDescriptorSet, symbol->getQualifier().layoutSet);\r
+        builder.addDecoration(id, spv::DecorationDescriptorSet, symbol->getQualifier().layoutSet);\r
     if (symbol->getQualifier().hasBinding())\r
-        builder.addDecoration(id, spv::DecBinding, symbol->getQualifier().layoutBinding);\r
+        builder.addDecoration(id, spv::DecorationBinding, symbol->getQualifier().layoutBinding);\r
     if (glslangIntermediate->getXfbMode()) {\r
         if (symbol->getQualifier().hasXfbStride())\r
-            builder.addDecoration(id, spv::DecStride, symbol->getQualifier().layoutXfbStride);\r
+            builder.addDecoration(id, spv::DecorationStride, symbol->getQualifier().layoutXfbStride);\r
         if (symbol->getQualifier().hasXfbBuffer())\r
-            builder.addDecoration(id, spv::DecXfbBuffer, symbol->getQualifier().layoutXfbBuffer);\r
+            builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);\r
     }\r
 \r
     // built-in variable decorations\r
     int num = TranslateBuiltInDecoration(*symbol);\r
     if (num >= 0)\r
-        builder.addDecoration(id, spv::DecBuiltIn, num);\r
+        builder.addDecoration(id, spv::DecorationBuiltIn, num);\r
 \r
     if (linkageOnly)\r
-        builder.addDecoration(id, spv::DecNoStaticUse);\r
+        builder.addDecoration(id, spv::DecorationNoStaticUse);\r
 \r
     return id;\r
 }\r
 \r
 void TGlslangToSpvTraverser::addDecoration(spv::Id id, spv::Decoration dec)\r
 {\r
-    if (dec != spv::DecCount)\r
+    if (dec != spv::BadValue)\r
         builder.addDecoration(id, dec);\r
 }\r
 \r
 void TGlslangToSpvTraverser::addMemberDecoration(spv::Id id, int member, spv::Decoration dec)\r
 {\r
-    if (dec != spv::DecCount)\r
+    if (dec != spv::BadValue)\r
         builder.addMemberDecoration(id, (unsigned)member, dec);\r
 }\r
 \r
index 8e2b9bc..31df1d7 100644 (file)
@@ -56,10 +56,10 @@ namespace spv {
 const int SpvBuilderMagic = 0xBB;\r
 \r
 Builder::Builder(unsigned int userNumber) :\r
-    source(LangUnknown),\r
+    source(SourceLanguageUnknown),\r
     sourceVersion(0),\r
-    addressModel(AddressingLogical),\r
-    memoryModel(MemoryGLSL450),\r
+    addressModel(AddressingModelLogical),\r
+    memoryModel(MemoryModelGLSL450),\r
     builderNumber(userNumber << 16 | SpvBuilderMagic),\r
     buildPoint(0),\r
     uniqueId(0),\r
@@ -293,7 +293,7 @@ Id Builder::makeFunctionType(Id returnType, std::vector<Id>& paramTypes)
     return type->getResultId();\r
 }\r
 \r
-Id Builder::makeSampler(Id sampledType, Dimensionality dim, samplerContent content, bool arrayed, bool shadow, bool ms)\r
+Id Builder::makeSampler(Id sampledType, Dim dim, samplerContent content, bool arrayed, bool shadow, bool ms)\r
 {\r
     // try to find it\r
     Instruction* type;\r
@@ -332,11 +332,11 @@ Id Builder::getDerefTypeId(Id resultId) const
     return module.getInstruction(typeId)->getImmediateOperand(1);\r
 }\r
 \r
-OpCode Builder::getMostBasicTypeClass(Id typeId) const\r
+Op Builder::getMostBasicTypeClass(Id typeId) const\r
 {\r
     Instruction* instr = module.getInstruction(typeId);\r
 \r
-    OpCode typeClass = instr->getOpCode();\r
+    Op typeClass = instr->getOpCode();\r
     switch (typeClass)\r
     {\r
     case OpTypeVoid:\r
@@ -384,7 +384,7 @@ Id Builder::getScalarTypeId(Id typeId) const
 {\r
     Instruction* instr = module.getInstruction(typeId);\r
 \r
-    OpCode typeClass = instr->getOpCode();\r
+    Op typeClass = instr->getOpCode();\r
     switch (typeClass)\r
     {\r
     case OpTypeVoid:\r
@@ -410,7 +410,7 @@ Id Builder::getContainedTypeId(Id typeId, int member) const
 {\r
     Instruction* instr = module.getInstruction(typeId);\r
 \r
-    OpCode typeClass = instr->getOpCode();\r
+    Op typeClass = instr->getOpCode();\r
     switch (typeClass)\r
     {\r
     case OpTypeVector:\r
@@ -436,7 +436,7 @@ Id Builder::getContainedTypeId(Id typeId) const
 \r
 // See if a scalar constant of this type has already been created, so it\r
 // can be reused rather than duplicated.  (Required by the specification).\r
-Id Builder::findScalarConstant(OpCode typeClass, Id typeId, unsigned value) const\r
+Id Builder::findScalarConstant(Op typeClass, Id typeId, unsigned value) const\r
 {\r
     Instruction* constant;\r
     for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) {\r
@@ -515,7 +515,7 @@ Id Builder::makeDoubleConstant(double d)
     return NoResult;\r
 }\r
 \r
-Id Builder::findCompositeConstant(OpCode typeClass, std::vector<Id>& comps) const\r
+Id Builder::findCompositeConstant(Op typeClass, std::vector<Id>& comps) const\r
 {\r
     Instruction* constant;\r
     bool found = false;\r
@@ -547,7 +547,7 @@ Id Builder::findCompositeConstant(OpCode typeClass, std::vector<Id>& comps) cons
 Id Builder::makeCompositeConstant(Id typeId, std::vector<Id>& members)\r
 {\r
     assert(typeId);\r
-    OpCode typeClass = getTypeClass(typeId);\r
+    Op typeClass = getTypeClass(typeId);\r
 \r
     switch (typeClass) {\r
     case OpTypeVector:\r
@@ -735,7 +735,7 @@ void Builder::leaveFunction(bool main)
             if (function.getReturnType() == makeVoidType())\r
                 makeReturn(true);\r
             else {\r
-                Id retStorage = createVariable(StorageFunction, function.getReturnType(), "dummyReturn");\r
+                Id retStorage = createVariable(StorageClassFunction, function.getReturnType(), "dummyReturn");\r
                 Id retValue = createLoad(retStorage);\r
                 makeReturn(true, retValue);\r
             }\r
@@ -761,18 +761,18 @@ Id Builder::createVariable(StorageClass storageClass, Id type, const char* name)
     inst->addImmediateOperand(storageClass);\r
 \r
     switch (storageClass) {\r
-    case StorageConstantUniform:\r
-    case StorageUniform:\r
-    case StorageInput:\r
-    case StorageOutput:\r
-    case StorageWorkgroupLocal:\r
-    case StoragePrivateGlobal:\r
-    case StorageWorkgroupGlobal:\r
+    case StorageClassUniformConstant:\r
+    case StorageClassUniform:\r
+    case StorageClassInput:\r
+    case StorageClassOutput:\r
+    case StorageClassWorkgroupLocal:\r
+    case StorageClassPrivateGlobal:\r
+    case StorageClassWorkgroupGlobal:\r
         constantsTypesGlobals.push_back(inst);\r
         module.mapInstruction(inst);\r
         break;\r
 \r
-    case StorageFunction:\r
+    case StorageClassFunction:\r
         // Validation rules require the declaration in the entry block\r
         buildPoint->getParent().addLocalVariable(inst);\r
         break;\r
@@ -878,14 +878,14 @@ Id Builder::createCompositeInsert(Id object, Id composite, Id typeId, std::vecto
 }\r
 \r
 // An opcode that has no operands, no result id, and no type\r
-void Builder::createNoResultOp(OpCode opCode)\r
+void Builder::createNoResultOp(Op opCode)\r
 {\r
     Instruction* op = new Instruction(opCode);\r
     buildPoint->addInstruction(op);\r
 }\r
 \r
 // An opcode that has one operand, no result id, and no type\r
-void Builder::createNoResultOp(OpCode opCode, Id operand)\r
+void Builder::createNoResultOp(Op opCode, Id operand)\r
 {\r
     Instruction* op = new Instruction(opCode);\r
     op->addIdOperand(operand);\r
@@ -908,7 +908,7 @@ void Builder::createMemoryBarrier(unsigned executionScope, unsigned memorySemant
 }\r
 \r
 // An opcode that has one operands, a result id, and a type\r
-Id Builder::createUnaryOp(OpCode opCode, Id typeId, Id operand)\r
+Id Builder::createUnaryOp(Op opCode, Id typeId, Id operand)\r
 {\r
     Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\r
     op->addIdOperand(operand);\r
@@ -917,7 +917,7 @@ Id Builder::createUnaryOp(OpCode opCode, Id typeId, Id operand)
     return op->getResultId();\r
 }\r
 \r
-Id Builder::createBinOp(OpCode opCode, Id typeId, Id left, Id right)\r
+Id Builder::createBinOp(Op opCode, Id typeId, Id left, Id right)\r
 {\r
     Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\r
     op->addIdOperand(left);\r
@@ -927,7 +927,7 @@ Id Builder::createBinOp(OpCode opCode, Id typeId, Id left, Id right)
     return op->getResultId();\r
 }\r
 \r
-Id Builder::createTriOp(OpCode opCode, Id typeId, Id op1, Id op2, Id op3)\r
+Id Builder::createTriOp(Op opCode, Id typeId, Id op1, Id op2, Id op3)\r
 {\r
     Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\r
     op->addIdOperand(op1);\r
@@ -938,7 +938,7 @@ Id Builder::createTriOp(OpCode opCode, Id typeId, Id op1, Id op2, Id op3)
     return op->getResultId();\r
 }\r
 \r
-Id Builder::createTernaryOp(OpCode opCode, Id typeId, Id op1, Id op2, Id op3)\r
+Id Builder::createTernaryOp(Op opCode, Id typeId, Id op1, Id op2, Id op3)\r
 {\r
     Instruction* op = new Instruction(getUniqueId(), typeId, opCode);\r
     op->addIdOperand(op1);\r
@@ -1080,7 +1080,7 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool proj, co
     // Set up the instruction\r
     //\r
 \r
-    OpCode opCode;\r
+    Op opCode;\r
     if (proj && parameters.gradX && parameters.offset)\r
         opCode = OpTextureSampleProjGradOffset;\r
     else if (proj && parameters.lod && parameters.offset)\r
@@ -1118,7 +1118,7 @@ Id Builder::createTextureCall(Decoration precision, Id resultType, bool proj, co
 }\r
 \r
 // Comments in header\r
-Id Builder::createTextureQueryCall(OpCode opCode, const TextureParameters& parameters)\r
+Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameters)\r
 {\r
     // Figure out the result type\r
     Id resultType;\r
@@ -1190,7 +1190,7 @@ Id Builder::createTextureQueryCall(OpCode opCode, const TextureParameters& param
 // Comments in header\r
 //Id Builder::createBitFieldExtractCall(Decoration precision, Id id, Id offset, Id bits, bool isSigned)\r
 //{\r
-//    OpCode opCode = isSigned ? sBitFieldExtract\r
+//    Op opCode = isSigned ? sBitFieldExtract\r
 //                                               : uBitFieldExtract;\r
 //\r
 //    if (isScalar(offset) == false || isScalar(bits) == false)\r
@@ -1210,7 +1210,7 @@ Id Builder::createTextureQueryCall(OpCode opCode, const TextureParameters& param
 // Comments in header\r
 //Id Builder::createBitFieldInsertCall(Decoration precision, Id base, Id insert, Id offset, Id bits)\r
 //{\r
-//    OpCode opCode = bitFieldInsert;\r
+//    Op opCode = bitFieldInsert;\r
 //\r
 //    if (isScalar(offset) == false || isScalar(bits) == false)\r
 //        MissingFunctionality("bitFieldInsert operand types");\r
@@ -1230,7 +1230,7 @@ Id Builder::createTextureQueryCall(OpCode opCode, const TextureParameters& param
 Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal)\r
 {\r
     Instruction* compare = 0;\r
-    spv::OpCode binOp = spv::OpNop;\r
+    spv::Op binOp = spv::OpNop;\r
     Id boolType = makeBoolType();\r
     Id valueType = getTypeId(value1);\r
 \r
@@ -1242,7 +1242,7 @@ Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal
     if (isVectorType(valueType)) {\r
         Id boolVectorType = makeVectorType(boolType, getNumTypeComponents(valueType));\r
         Id boolVector;\r
-        OpCode op;\r
+        Op op;\r
         if (getMostBasicTypeClass(valueType) == OpTypeFloat)\r
             op = equal ? OpFOrdEqual : OpFOrdNotEqual;\r
         else\r
@@ -1307,9 +1307,9 @@ Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal
 }\r
 \r
 // Comments in header\r
-//Id Builder::createOperation(Decoration precision, OpCode opCode, Id operand)\r
+//Id Builder::createOperation(Decoration precision, Op opCode, Id operand)\r
 //{\r
-//    OpCode* opCode = 0;\r
+//    Op* opCode = 0;\r
 //\r
 //    // Handle special return types here.  Things that don't have same result type as parameter\r
 //    switch (opCode) {\r
@@ -1362,7 +1362,7 @@ Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal
 //}\r
 //\r
 //// Comments in header\r
-//Id Builder::createOperation(Decoration precision, OpCode opCode, Id operand0, Id operand1)\r
+//Id Builder::createOperation(Decoration precision, Op opCode, Id operand0, Id operand1)\r
 //{\r
 //    Function* opCode = 0;\r
 //\r
@@ -1393,7 +1393,7 @@ Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal
 //    return instr;\r
 //}\r
 //\r
-//Id Builder::createOperation(Decoration precision, OpCode opCode, Id operand0, Id operand1, Id operand2)\r
+//Id Builder::createOperation(Decoration precision, Op opCode, Id operand0, Id operand1, Id operand2)\r
 //{\r
 //    Function* opCode;\r
 //\r
@@ -1608,7 +1608,7 @@ void Builder::If::makeEndIf()
 \r
     // Go back to the headerBlock and make the flow control split\r
     builder.setBuildPoint(headerBlock);\r
-    builder.createMerge(OpSelectionMerge, mergeBlock, SelectControlNone);\r
+    builder.createMerge(OpSelectionMerge, mergeBlock, SelectionControlMaskNone);\r
     if (elseBlock)\r
         builder.createConditionalBranch(condition, thenBlock, elseBlock);\r
     else\r
@@ -1632,7 +1632,7 @@ void Builder::makeSwitch(Id selector, int numSegments, std::vector<int>& caseVal
     Block* mergeBlock = new Block(getUniqueId(), function);\r
 \r
     // make and insert the switch's selection-merge instruction\r
-    createMerge(OpSelectionMerge, mergeBlock, SelectControlNone);\r
+    createMerge(OpSelectionMerge, mergeBlock, SelectionControlMaskNone);\r
 \r
     // make the switch instruction\r
     Instruction* switchInst = new Instruction(NoResult, NoType, OpSwitch);\r
@@ -1706,7 +1706,7 @@ void Builder::createLoopHeaderBranch(Id condition)
     Loop loop = loops.top();\r
 \r
     Block* body = new Block(getUniqueId(), *loop.function);\r
-    createMerge(OpLoopMerge, loop.merge, LoopControlNone);\r
+    createMerge(OpLoopMerge, loop.merge, LoopControlMaskNone);\r
     createConditionalBranch(condition, body, loop.merge);\r
     loop.function->addBlock(body);\r
     setBuildPoint(body);\r
@@ -1831,7 +1831,7 @@ Id Builder::accessChainLoad(Decoration precision)
                 id = createCompositeExtract(accessChain.base, accessChain.resultType, indexes);\r
             else {\r
                 // make a new function variable for this r-value\r
-                Id lValue = createVariable(StorageFunction, getTypeId(accessChain.base), "indexable");\r
+                Id lValue = createVariable(StorageClassUniform, getTypeId(accessChain.base), "indexable");\r
 \r
                 // store into it\r
                 createStore(accessChain.base, lValue);\r
@@ -1887,7 +1887,7 @@ void Builder::dump(std::vector<unsigned int>& out) const
     out.push_back(0);\r
 \r
     // First instructions, some created on the spot here:\r
-    if (source != LangUnknown) {\r
+    if (source != SourceLanguageUnknown) {\r
         Instruction sourceInst(0, 0, OpSource);\r
         sourceInst.addImmediateOperand(source);\r
         sourceInst.addImmediateOperand(sourceVersion);\r
@@ -1979,7 +1979,7 @@ void Builder::createBranch(Block* block)
     block->addPredecessor(buildPoint);\r
 }\r
 \r
-void Builder::createMerge(OpCode mergeCode, Block* mergeBlock, unsigned int control)\r
+void Builder::createMerge(Op mergeCode, Block* mergeBlock, unsigned int control)\r
 {\r
     Instruction* merge = new Instruction(mergeCode);\r
     merge->addIdOperand(mergeBlock->getId());\r
index 787d852..be6abd9 100644 (file)
@@ -106,14 +106,14 @@ public:
         samplerContentImage,\r
         samplerContentTextureFilter\r
     };\r
-    Id makeSampler(Id sampledType, Dimensionality, samplerContent, bool arrayed, bool shadow, bool ms);\r
+    Id makeSampler(Id sampledType, Dim, samplerContent, bool arrayed, bool shadow, bool ms);\r
 \r
     // For querying about types.\r
     Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }\r
     Id getDerefTypeId(Id resultId) const;\r
-    OpCode getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); }\r
-    OpCode getTypeClass(Id typeId) const { return getOpCode(typeId); }\r
-    OpCode getMostBasicTypeClass(Id typeId) const;\r
+    Op getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); }\r
+    Op getTypeClass(Id typeId) const { return getOpCode(typeId); }\r
+    Op getMostBasicTypeClass(Id typeId) const;\r
     int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); }\r
     int getNumTypeComponents(Id typeId) const;\r
     Id getScalarTypeId(Id typeId) const;\r
@@ -151,10 +151,10 @@ public:
     }\r
     int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); }\r
 \r
-    Dimensionality getDimensionality(Id resultId) const\r
+    Dim getDimensionality(Id resultId) const\r
     {\r
         assert(isSamplerType(getTypeId(resultId)));\r
-        return (Dimensionality)module.getInstruction(getTypeId(resultId))->getImmediateOperand(1);\r
+        return (Dim)module.getInstruction(getTypeId(resultId))->getImmediateOperand(1);\r
     }\r
     bool isArrayedSampler(Id resultId) const\r
     {\r
@@ -228,14 +228,14 @@ public:
     Id createCompositeInsert(Id object, Id composite, Id typeId, unsigned index);\r
     Id createCompositeInsert(Id object, Id composite, Id typeId, std::vector<unsigned>& indexes);\r
 \r
-    void createNoResultOp(OpCode);\r
-    void createNoResultOp(OpCode, Id operand);\r
+    void createNoResultOp(Op);\r
+    void createNoResultOp(Op, Id operand);\r
     void createControlBarrier(unsigned executionScope);\r
     void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);\r
-    Id createUnaryOp(OpCode, Id typeId, Id operand);\r
-    Id createBinOp(OpCode, Id typeId, Id operand1, Id operand2);\r
-    Id createTriOp(OpCode, Id typeId, Id operand1, Id operand2, Id operand3);\r
-    Id createTernaryOp(OpCode, Id typeId, Id operand1, Id operand2, Id operand3);\r
+    Id createUnaryOp(Op, Id typeId, Id operand);\r
+    Id createBinOp(Op, Id typeId, Id operand1, Id operand2);\r
+    Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);\r
+    Id createTernaryOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);\r
     Id createFunctionCall(spv::Function*, std::vector<spv::Id>&);\r
 \r
     // Take an rvalue (source) and a set of channels to extract from it to\r
@@ -289,7 +289,7 @@ public:
 \r
     // Emit the OpTextureQuery* instruction that was passed in.\r
     // Figure out the right return value and type, and return it.\r
-    Id createTextureQueryCall(OpCode, const TextureParameters&);\r
+    Id createTextureQueryCall(Op, const TextureParameters&);\r
 \r
     Id createSamplePositionCall(Decoration precision, Id, Id);\r
 \r
@@ -461,13 +461,13 @@ public:
     void dump(std::vector<unsigned int>&) const;\r
 \r
 protected:\r
-    Id findScalarConstant(OpCode typeClass, Id typeId, unsigned value) const;\r
-    Id findCompositeConstant(OpCode typeClass, std::vector<Id>& comps) const;\r
+    Id findScalarConstant(Op typeClass, Id typeId, unsigned value) const;\r
+    Id findCompositeConstant(Op typeClass, std::vector<Id>& comps) const;\r
     Id collapseAccessChain();\r
     void simplifyAccessChainSwizzle();\r
     void createAndSetNoPredecessorBlock(const char*);\r
     void createBranch(Block* block);\r
-    void createMerge(OpCode, Block*, unsigned int control);\r
+    void createMerge(Op, Block*, unsigned int control);\r
     void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);\r
     void dumpInstructions(std::vector<unsigned int>&, const std::vector<Instruction*>&) const;\r
 \r
index 35591b7..3daff74 100644 (file)
 // Disassembler for SPIR-V.\r
 //\r
 \r
+#include <stdlib.h>\r
+#include <assert.h>\r
 #include <iomanip>\r
 #include <stack>\r
 #include <sstream>\r
-#include "stdlib.h"\r
 \r
 #include "GLSL450Lib.h"\r
 extern const char* GlslStd450DebugNames[GLSL_STD_450::Count];\r
@@ -69,7 +70,7 @@ public:
     void processInstructions();\r
 \r
 protected:\r
-    OpCode getOpCode(int id) const { return idInstruction[id] ? (OpCode)(stream[idInstruction[id]] & OpCodeMask) : OpNop; }\r
+    Op getOpCode(int id) const { return idInstruction[id] ? (Op)(stream[idInstruction[id]] & OpCodeMask) : OpNop; }\r
 \r
     // Output methods\r
     void outputIndent();\r
@@ -80,7 +81,7 @@ protected:
     void disassembleImmediates(int numOperands);\r
     void disassembleIds(int numOperands);\r
     void disassembleString();\r
-    void disassembleInstruction(Id resultId, Id typeId, OpCode opCode, int numOperands);\r
+    void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);\r
 \r
     // Data\r
     std::ostream& out;                       // where to write the disassembly\r
@@ -144,7 +145,7 @@ void SpirvStream::processInstructions()
         // Instruction wordCount and opcode\r
         unsigned int firstWord = stream[word];\r
         unsigned wordCount = firstWord >> WordCountShift;\r
-        OpCode opCode = (OpCode)(firstWord & OpCodeMask);\r
+        Op opCode = (Op)(firstWord & OpCodeMask);\r
         int nextInst = word + wordCount;\r
         ++word;\r
 \r
@@ -176,7 +177,7 @@ void SpirvStream::processInstructions()
         outputTypeId(typeId);\r
         outputIndent();\r
 \r
-        // Hand off the OpCode and all its operands\r
+        // Hand off the Op and all its operands\r
         disassembleInstruction(resultId, typeId, opCode, numOperands);\r
         if (word != nextInst) {\r
             out << " ERROR, incorrect number of operands consumed.  At " << word << " instead of " << nextInst << " instruction start was " << instructionStart;\r
@@ -277,14 +278,11 @@ void SpirvStream::disassembleString()
     out << "\"";\r
 }\r
 \r
-void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode, int numOperands)\r
+void SpirvStream::disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands)\r
 {\r
     // Process the opcode\r
 \r
-    if (opCode < 0 || opCode >= OpCount)\r
-        Kill(out, "Bad opcode");\r
-    else\r
-        out << InstructionDesc[opCode].opName + 2; // Skip the "Op"\r
+    out << (OpcodeString(opCode) + 2);  // leave out the "Op"\r
 \r
     if (opCode == OpLoopMerge || opCode == OpSelectionMerge)\r
         nextNestedControl = stream[word];\r
@@ -339,7 +337,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode,
     // Handle textures specially, so can put out helpful strings.\r
     if (opCode == OpTypeSampler) {\r
         disassembleIds(1);\r
-        out << " " << DimensionString((Dimensionality)stream[word++]);\r
+        out << " " << DimensionString((Dim)stream[word++]);\r
         switch (stream[word++]) {\r
         case 0: out << " texture";        break;\r
         case 1: out << " image";          break;\r
@@ -354,7 +352,8 @@ void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode,
     // Handle all the parameterized operands\r
     for (int op = 0; op < InstructionDesc[opCode].operands.getNum(); ++op) {\r
         out << " ";\r
-        switch (InstructionDesc[opCode].operands.getClass(op)) {\r
+        OperandClass operandClass = InstructionDesc[opCode].operands.getClass(op);\r
+        switch (operandClass) {\r
         case OperandId:\r
             disassembleIds(1);\r
             // Get names for printing "(XXX)" for readability, *after* this id\r
@@ -366,7 +365,7 @@ void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode,
             disassembleIds(numOperands);\r
             return;\r
         case OperandVariableLiterals:\r
-            if (opCode == OpDecorate && stream[word - 1] == DecBuiltIn) {\r
+            if (opCode == OpDecorate && stream[word - 1] == DecorationBuiltIn) {\r
                 out << BuiltInString(stream[word++]);\r
                 --numOperands;\r
                 ++op;\r
@@ -376,8 +375,8 @@ void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode,
         case OperandVariableLiteralId:\r
             while (numOperands > 0) {\r
                 out << std::endl;\r
-                outputResultId(NoResult);\r
-                outputTypeId(NoType);\r
+                outputResultId(0);\r
+                outputTypeId(0);\r
                 outputIndent();\r
                 out << "     case ";\r
                 disassembleImmediates(1);\r
@@ -397,76 +396,23 @@ void SpirvStream::disassembleInstruction(Id resultId, Id typeId, OpCode opCode,
         case OperandLiteralString:\r
             disassembleString();\r
             return;\r
-        case OperandSource:\r
-            out << SourceString((SourceLanguage)stream[word++]);\r
-            break;\r
-        case OperandExecutionModel:\r
-            out << ExecutionModelString((ExecutionModel)stream[word++]);\r
-            break;\r
-        case OperandAddressing:\r
-            out << AddressingString((AddressingModel)stream[word++]);\r
-            break;\r
-        case OperandMemory:\r
-            out << MemoryString((MemoryModel)stream[word++]);\r
-            break;\r
-        case OperandExecutionMode:\r
-            out << ExecutionModeString((ExecutionMode)stream[word++]);\r
-            break;\r
-        case OperandStorage:\r
-            out << StorageClassString((StorageClass)stream[word++]);\r
-            break;\r
-        case OperandDimensionality:\r
-            out << DimensionString((Dimensionality)stream[word++]);\r
-            break;\r
-        case OperandDecoration:\r
-            out << DecorationString((Decoration)stream[word++]);\r
-            break;\r
-        case OperandBuiltIn:\r
-            out << BuiltInString((BuiltIn)stream[word++]);\r
-            break;\r
-        case OperandSelect:\r
-            out << SelectControlString((SelectControl)stream[word++]);\r
-            break;\r
-        case OperandLoop:\r
-            out << LoopControlString((LoopControl)stream[word++]);\r
-            break;\r
-        case OperandFunction:\r
-        {\r
-            unsigned int control = stream[word++];\r
-            if (control == 0)\r
-                out << FunctionControlString(control);\r
-            else {\r
-                for (int m = 0; m < FunctionControlCount; ++m) {\r
-                    if (control & (1 << m))\r
-                        out << FunctionControlString(m);\r
-                }\r
-            }\r
-            break;\r
-        }\r
-        case OperandMemorySemantics:\r
-            for (int shift = 0; shift < MemorySemanticsCount; ++shift) {\r
-                unsigned lit = (stream[word] & (1 << shift));\r
-                if (lit)\r
-                    out << MemorySemanticsString(lit) << " ";\r
-            }\r
-            word++;\r
-            break;\r
-        case OperandMemoryAccess:\r
-            out << MemoryAccessString(stream[word++]);\r
-            break;\r
-        case OperandExecutionScope:\r
-            out << ExecutionScopeString(stream[word++]);\r
-            break;\r
-        case OperandGroupOperation:\r
-            out << GroupOperationString(stream[word++]);\r
-            break;\r
-        case OperandKernelEnqueueFlags:\r
-            out << KernelEnqueueFlagsString(stream[word++]);\r
-            break;\r
-        case OperandKernelProfilingInfo:\r
-            out << KernelProfilingInfoString(stream[word++]);\r
-            break;\r
         default:\r
+            assert(operandClass >= OperandSource && operandClass < OperandOpcode);\r
+\r
+            if (OperandClassParams[operandClass].bitmask) {\r
+                unsigned int mask = stream[word++];\r
+                if (mask == 0)\r
+                    out << "None";\r
+                else {\r
+                    for (int m = 0; m < OperandClassParams[operandClass].ceiling; ++m) {\r
+                        if (mask & (1 << m))\r
+                            out << OperandClassParams[operandClass].getName(m) << " ";\r
+                    }\r
+                }\r
+                break;\r
+            } else\r
+                out << OperandClassParams[operandClass].getName(stream[word++]);\r
+\r
             break;\r
         }\r
         --numOperands;\r
index d6fe37b..4281bfa 100644 (file)
 //\r
 \r
 //\r
-// Programmatically fill in instruction/operand information.\r
+// 1) Programatically fill in instruction/operand information.\r
+//    This can be used for disassembly, printing documentation, etc.\r
+//\r
+// 2) Print documentation from this parameterization.\r
 //\r
-\r
-#include "spirv.h"\r
 \r
 #include "doc.h"\r
 \r
 #include <string.h>\r
 #include <algorithm>\r
 \r
-#define LINE_BREAK " +\n"\r
-#define GAP " +\n +\n"\r
-#define NOTE GAP "*Note:* "\r
-\r
 namespace spv {\r
 \r
-// The set of objects that hold all the instruction/operand\r
-// parameterization information.\r
-InstructionParameters InstructionDesc[spv::OpCount];\r
-\r
-// Set up all the parameterizing descriptions of the opcodes, operands, etc.\r
-void Parameterize()\r
-{\r
-    // Exceptions to having a result <id> and a resulting type <id>.\r
-    // (Everything is initialized to have both).\r
-\r
-    InstructionDesc[OpNop]            .setResultAndType(false, false);\r
-    InstructionDesc[OpSource]         .setResultAndType(false, false);\r
-    InstructionDesc[OpSourceExtension].setResultAndType(false, false);\r
-    InstructionDesc[OpExtension]      .setResultAndType(false, false);\r
-    InstructionDesc[OpExtInstImport]  .setResultAndType(true,  false);\r
-    InstructionDesc[OpMemoryModel]    .setResultAndType(false, false);\r
-    InstructionDesc[OpEntryPoint]     .setResultAndType(false, false);\r
-    InstructionDesc[OpExecutionMode]  .setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpTypeVoid]        .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeBool]        .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeInt]         .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeFloat]       .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeVector]      .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeMatrix]      .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeSampler]     .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeFilter]      .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeArray]       .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeRuntimeArray].setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeStruct]      .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeOpaque]      .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypePointer]     .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeFunction]    .setResultAndType(true,  false);\r
-\r
-    InstructionDesc[OpTypeEvent]       .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeDeviceEvent] .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeReserveId]   .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypeQueue]       .setResultAndType(true,  false);\r
-    InstructionDesc[OpTypePipe]        .setResultAndType(true,  false);\r
-    InstructionDesc[OpFunctionEnd]        .setResultAndType(false, false);\r
-    InstructionDesc[OpStore]              .setResultAndType(false, false);\r
-    InstructionDesc[OpDecorationGroup]    .setResultAndType(true,  false);\r
-    InstructionDesc[OpDecorate]           .setResultAndType(false, false);\r
-    InstructionDesc[OpMemberDecorate]     .setResultAndType(false, false);\r
-    InstructionDesc[OpGroupDecorate]      .setResultAndType(false, false);\r
-    InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false);\r
-    InstructionDesc[OpName]               .setResultAndType(false, false);\r
-    InstructionDesc[OpMemberName]         .setResultAndType(false, false);\r
-    InstructionDesc[OpString]             .setResultAndType(true,  false);\r
-    InstructionDesc[OpLine]               .setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpCopyMemory]     .setResultAndType(false, false);\r
-    InstructionDesc[OpCopyMemorySized].setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpEmitVertex]        .setResultAndType(false, false);\r
-    InstructionDesc[OpEndPrimitive]      .setResultAndType(false, false);\r
-    InstructionDesc[OpEmitStreamVertex]  .setResultAndType(false, false);\r
-    InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpControlBarrier].setResultAndType(false, false);\r
-    InstructionDesc[OpMemoryBarrier] .setResultAndType(false, false);\r
-    \r
-    InstructionDesc[OpAtomicInit].setResultAndType(false, false);\r
-    InstructionDesc[OpAtomicStore].setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpLoopMerge]        .setResultAndType(false, false);\r
-    InstructionDesc[OpSelectionMerge]   .setResultAndType(false, false);\r
-    InstructionDesc[OpLabel]            .setResultAndType(true,  false);\r
-    InstructionDesc[OpBranch]           .setResultAndType(false, false);\r
-    InstructionDesc[OpBranchConditional].setResultAndType(false, false);\r
-    InstructionDesc[OpSwitch]           .setResultAndType(false, false);\r
-    InstructionDesc[OpKill]             .setResultAndType(false, false);\r
-    InstructionDesc[OpReturn]           .setResultAndType(false, false);\r
-    InstructionDesc[OpReturnValue]      .setResultAndType(false, false);\r
-    InstructionDesc[OpUnreachable]      .setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpLifetimeStart]    .setResultAndType(false, false);\r
-    InstructionDesc[OpLifetimeStop]     .setResultAndType(false, false);\r
-\r
-    InstructionDesc[OpCompileFlag]      .setResultAndType(false, false);\r
-    InstructionDesc[OpCommitReadPipe]   .setResultAndType(false, false);\r
-    InstructionDesc[OpCommitWritePipe].setResultAndType(false, false);\r
-    InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false);\r
-    InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false);\r
-    InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false);\r
-    InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false);\r
-    InstructionDesc[OpRetainEvent].setResultAndType(false, false);\r
-    InstructionDesc[OpReleaseEvent].setResultAndType(false, false);\r
-\r
-    // set name of operator, an initial set of <id> style operands, and the description\r
-\r
-    #define SET_OPNAME(index) InstructionDesc[index].opName = #index;\r
-\r
-    SET_OPNAME(OpNop);\r
-    SET_OPNAME(OpSource);\r
-    SET_OPNAME(OpSourceExtension);\r
-    SET_OPNAME(OpExtension);\r
-    SET_OPNAME(OpExtInstImport);\r
-    SET_OPNAME(OpMemoryModel);\r
-    SET_OPNAME(OpEntryPoint);\r
-    SET_OPNAME(OpExecutionMode);\r
-\r
-    SET_OPNAME(OpTypeVoid);\r
-    SET_OPNAME(OpTypeInt);\r
-    SET_OPNAME(OpTypeBool);\r
-    SET_OPNAME(OpTypeFloat);\r
-    SET_OPNAME(OpTypeVector);\r
-    SET_OPNAME(OpTypeMatrix);\r
-    SET_OPNAME(OpTypeSampler);\r
-    SET_OPNAME(OpTypeFilter);\r
-    SET_OPNAME(OpTypeArray);\r
-    SET_OPNAME(OpTypeRuntimeArray);\r
-    SET_OPNAME(OpTypeStruct);\r
-    SET_OPNAME(OpTypeOpaque);\r
-    SET_OPNAME(OpTypePointer);\r
-    SET_OPNAME(OpTypeFunction);\r
-\r
-    SET_OPNAME(OpTypeEvent);\r
-    SET_OPNAME(OpTypeDeviceEvent);\r
-    SET_OPNAME(OpTypeReserveId);\r
-    SET_OPNAME(OpTypeQueue);\r
-    SET_OPNAME(OpTypePipe);\r
-\r
-    SET_OPNAME(OpConstantTrue);\r
-    SET_OPNAME(OpConstantFalse);\r
-    SET_OPNAME(OpConstant);\r
-    SET_OPNAME(OpConstantComposite);\r
-    SET_OPNAME(OpConstantNullPointer);\r
-    SET_OPNAME(OpConstantNullObject);\r
-    SET_OPNAME(OpConstantSampler);\r
-\r
-    SET_OPNAME(OpSpecConstantTrue);\r
-    SET_OPNAME(OpSpecConstantFalse);\r
-    SET_OPNAME(OpSpecConstant);\r
-    SET_OPNAME(OpSpecConstantComposite);\r
-\r
-    SET_OPNAME(OpVariable);\r
-    SET_OPNAME(OpVariableArray);\r
-\r
-    SET_OPNAME(OpFunction);\r
-    SET_OPNAME(OpFunctionParameter);\r
-    SET_OPNAME(OpFunctionEnd);\r
-    SET_OPNAME(OpFunctionCall);\r
-\r
-    SET_OPNAME(OpExtInst);\r
-\r
-    SET_OPNAME(OpUndef);\r
-    SET_OPNAME(OpLoad);\r
-    SET_OPNAME(OpStore);\r
-    SET_OPNAME(OpPhi);\r
-\r
-    SET_OPNAME(OpDecorationGroup);\r
-    SET_OPNAME(OpDecorate);\r
-    SET_OPNAME(OpMemberDecorate);\r
-    SET_OPNAME(OpGroupDecorate);\r
-    SET_OPNAME(OpGroupMemberDecorate);\r
-    SET_OPNAME(OpName);\r
-    SET_OPNAME(OpMemberName);\r
-    SET_OPNAME(OpString);\r
-    SET_OPNAME(OpLine);\r
-\r
-    SET_OPNAME(OpVectorExtractDynamic);\r
-    SET_OPNAME(OpVectorInsertDynamic);\r
-    SET_OPNAME(OpVectorShuffle);\r
-\r
-    SET_OPNAME(OpCompositeConstruct);\r
-    SET_OPNAME(OpCompositeExtract);\r
-    SET_OPNAME(OpCompositeInsert);\r
-\r
-    SET_OPNAME(OpCopyObject);\r
-    SET_OPNAME(OpCopyMemory);\r
-    SET_OPNAME(OpCopyMemorySized);\r
-\r
-    SET_OPNAME(OpSampler);\r
-\r
-    SET_OPNAME(OpTextureSample);\r
-    SET_OPNAME(OpTextureSampleDref);\r
-    SET_OPNAME(OpTextureSampleLod);\r
-    SET_OPNAME(OpTextureSampleProj);\r
-    SET_OPNAME(OpTextureSampleGrad);\r
-    SET_OPNAME(OpTextureSampleOffset);\r
-    SET_OPNAME(OpTextureSampleProjLod);\r
-    SET_OPNAME(OpTextureSampleProjGrad);\r
-    SET_OPNAME(OpTextureSampleLodOffset);\r
-    SET_OPNAME(OpTextureSampleProjOffset);\r
-    SET_OPNAME(OpTextureSampleGradOffset);\r
-    SET_OPNAME(OpTextureSampleProjLodOffset);\r
-    SET_OPNAME(OpTextureSampleProjGradOffset);\r
-    SET_OPNAME(OpTextureFetchTexel);\r
-    SET_OPNAME(OpTextureFetchTexelOffset);\r
-    SET_OPNAME(OpTextureFetchSample);\r
-    SET_OPNAME(OpTextureFetchBuffer);\r
-    SET_OPNAME(OpTextureGather);\r
-    SET_OPNAME(OpTextureGatherOffset);\r
-    SET_OPNAME(OpTextureGatherOffsets);\r
-    SET_OPNAME(OpTextureQuerySizeLod);\r
-    SET_OPNAME(OpTextureQuerySize);\r
-    SET_OPNAME(OpTextureQueryLod);\r
-    SET_OPNAME(OpTextureQueryLevels);\r
-    SET_OPNAME(OpTextureQuerySamples);\r
-\r
-    SET_OPNAME(OpAccessChain);\r
-    SET_OPNAME(OpInBoundsAccessChain);\r
-\r
-    SET_OPNAME(OpSNegate);\r
-    SET_OPNAME(OpFNegate);\r
-    SET_OPNAME(OpNot);\r
-    SET_OPNAME(OpAny);\r
-    SET_OPNAME(OpAll);\r
-\r
-    SET_OPNAME(OpConvertFToU);\r
-    SET_OPNAME(OpConvertFToS);\r
-    SET_OPNAME(OpConvertSToF);\r
-    SET_OPNAME(OpConvertUToF);\r
-    SET_OPNAME(OpFConvert);\r
-    SET_OPNAME(OpSConvert);\r
-    SET_OPNAME(OpUConvert);\r
-    SET_OPNAME(OpConvertPtrToU);\r
-    SET_OPNAME(OpConvertUToPtr);\r
-    SET_OPNAME(OpPtrCastToGeneric);\r
-    SET_OPNAME(OpGenericCastToPtr);\r
-    SET_OPNAME(OpGenericCastToPtrExplicit);\r
-    SET_OPNAME(OpGenericPtrMemSemantics);\r
-    SET_OPNAME(OpBitcast);\r
-    SET_OPNAME(OpTranspose);\r
-\r
-    SET_OPNAME(OpIsNan);\r
-    SET_OPNAME(OpIsInf);\r
-    SET_OPNAME(OpIsFinite);\r
-    SET_OPNAME(OpIsNormal);\r
-    SET_OPNAME(OpSignBitSet);\r
-    SET_OPNAME(OpLessOrGreater);\r
-    SET_OPNAME(OpOrdered);\r
-    SET_OPNAME(OpUnordered);\r
-\r
-    SET_OPNAME(OpArrayLength);\r
-    \r
-    SET_OPNAME(OpIAdd);\r
-    SET_OPNAME(OpFAdd);\r
-    SET_OPNAME(OpISub);\r
-    SET_OPNAME(OpFSub);\r
-    SET_OPNAME(OpIMul);\r
-    SET_OPNAME(OpFMul);\r
-    SET_OPNAME(OpUDiv);\r
-    SET_OPNAME(OpSDiv);\r
-    SET_OPNAME(OpFDiv);\r
-    SET_OPNAME(OpUMod);\r
-    SET_OPNAME(OpSRem);\r
-    SET_OPNAME(OpSMod);\r
-    SET_OPNAME(OpFRem);\r
-    SET_OPNAME(OpFMod);\r
-    \r
-    SET_OPNAME(OpVectorTimesScalar);\r
-    SET_OPNAME(OpMatrixTimesScalar);\r
-    SET_OPNAME(OpVectorTimesMatrix);\r
-    SET_OPNAME(OpMatrixTimesVector);\r
-    SET_OPNAME(OpMatrixTimesMatrix);\r
-    SET_OPNAME(OpOuterProduct);\r
-    SET_OPNAME(OpDot);\r
-\r
-    SET_OPNAME(OpShiftRightLogical);\r
-    SET_OPNAME(OpShiftRightArithmetic);\r
-    SET_OPNAME(OpShiftLeftLogical);\r
-    SET_OPNAME(OpLogicalOr);\r
-    SET_OPNAME(OpLogicalXor);\r
-    SET_OPNAME(OpLogicalAnd);\r
-\r
-    SET_OPNAME(OpBitwiseOr);\r
-    SET_OPNAME(OpBitwiseXor);\r
-    SET_OPNAME(OpBitwiseAnd);\r
-\r
-    SET_OPNAME(OpSelect);\r
-\r
-    SET_OPNAME(OpIEqual);\r
-    SET_OPNAME(OpFOrdEqual);\r
-    SET_OPNAME(OpFUnordEqual);\r
-    SET_OPNAME(OpINotEqual);\r
-    SET_OPNAME(OpFOrdNotEqual);\r
-    SET_OPNAME(OpFUnordNotEqual);\r
-    SET_OPNAME(OpULessThan);\r
-    SET_OPNAME(OpSLessThan);\r
-    SET_OPNAME(OpFOrdLessThan);\r
-    SET_OPNAME(OpFUnordLessThan);\r
-    SET_OPNAME(OpUGreaterThan);\r
-    SET_OPNAME(OpSGreaterThan);\r
-    SET_OPNAME(OpFOrdGreaterThan);\r
-    SET_OPNAME(OpFUnordGreaterThan);\r
-    SET_OPNAME(OpULessThanEqual);\r
-    SET_OPNAME(OpSLessThanEqual);\r
-    SET_OPNAME(OpFOrdLessThanEqual);\r
-    SET_OPNAME(OpFUnordLessThanEqual);\r
-    SET_OPNAME(OpUGreaterThanEqual);\r
-    SET_OPNAME(OpSGreaterThanEqual);\r
-    SET_OPNAME(OpFOrdGreaterThanEqual);\r
-    SET_OPNAME(OpFUnordGreaterThanEqual);\r
-\r
-    SET_OPNAME(OpDPdx);\r
-    SET_OPNAME(OpDPdy);\r
-    SET_OPNAME(OpFwidth);\r
-    SET_OPNAME(OpDPdxFine);\r
-    SET_OPNAME(OpDPdyFine);\r
-    SET_OPNAME(OpFwidthFine);\r
-    SET_OPNAME(OpDPdxCoarse);\r
-    SET_OPNAME(OpDPdyCoarse);\r
-    SET_OPNAME(OpFwidthCoarse);\r
-    SET_OPNAME(OpEmitVertex);\r
-    SET_OPNAME(OpEndPrimitive);\r
-    SET_OPNAME(OpEmitStreamVertex);\r
-    SET_OPNAME(OpEndStreamPrimitive);\r
-    SET_OPNAME(OpControlBarrier);\r
-    SET_OPNAME(OpMemoryBarrier);\r
-\r
-    SET_OPNAME(OpImagePointer);\r
-\r
-    SET_OPNAME(OpAtomicInit);\r
-    SET_OPNAME(OpAtomicLoad);\r
-    SET_OPNAME(OpAtomicStore);\r
-    SET_OPNAME(OpAtomicExchange);\r
-    SET_OPNAME(OpAtomicCompareExchange);\r
-    SET_OPNAME(OpAtomicCompareExchangeWeak);\r
-    SET_OPNAME(OpAtomicIIncrement);\r
-    SET_OPNAME(OpAtomicIDecrement);\r
-    SET_OPNAME(OpAtomicIAdd);\r
-    SET_OPNAME(OpAtomicISub);\r
-    SET_OPNAME(OpAtomicUMin);\r
-    SET_OPNAME(OpAtomicUMax);\r
-    SET_OPNAME(OpAtomicAnd);\r
-    SET_OPNAME(OpAtomicOr);\r
-    SET_OPNAME(OpAtomicXor);\r
-\r
-    SET_OPNAME(OpLoopMerge);\r
-    SET_OPNAME(OpSelectionMerge);\r
-    SET_OPNAME(OpLabel);\r
-    SET_OPNAME(OpBranch);\r
-    SET_OPNAME(OpBranchConditional);\r
-    SET_OPNAME(OpSwitch);\r
-    SET_OPNAME(OpKill);\r
-    SET_OPNAME(OpReturn);\r
-    SET_OPNAME(OpReturnValue);\r
-    SET_OPNAME(OpUnreachable);    \r
-\r
-    SET_OPNAME(OpLifetimeStart);\r
-    SET_OPNAME(OpLifetimeStop);    \r
-    SET_OPNAME(OpCompileFlag);\r
-    \r
-    SET_OPNAME(OpAsyncGroupCopy);\r
-    SET_OPNAME(OpWaitGroupEvents);\r
-\r
-    SET_OPNAME(OpGroupAll);\r
-    SET_OPNAME(OpGroupAny);\r
-    SET_OPNAME(OpGroupBroadcast);\r
-    SET_OPNAME(OpGroupIAdd);\r
-    SET_OPNAME(OpGroupFAdd);\r
-    SET_OPNAME(OpGroupFMin);\r
-    SET_OPNAME(OpGroupUMin);\r
-    SET_OPNAME(OpGroupSMin);\r
-    SET_OPNAME(OpGroupFMax);\r
-    SET_OPNAME(OpGroupUMax);\r
-    SET_OPNAME(OpGroupSMax);\r
-\r
-    SET_OPNAME(OpReadPipe);\r
-    SET_OPNAME(OpWritePipe);\r
-    SET_OPNAME(OpReservedReadPipe);\r
-    SET_OPNAME(OpReservedWritePipe);\r
-    SET_OPNAME(OpReserveReadPipePackets);\r
-    SET_OPNAME(OpReserveWritePipePackets);\r
-    SET_OPNAME(OpCommitReadPipe);\r
-    SET_OPNAME(OpCommitWritePipe);\r
-    SET_OPNAME(OpIsValidReserveId);\r
-    SET_OPNAME(OpGetNumPipePackets);\r
-    SET_OPNAME(OpGetMaxPipePackets);\r
-    SET_OPNAME(OpGroupReserveReadPipePackets);\r
-    SET_OPNAME(OpGroupReserveWritePipePackets);\r
-    SET_OPNAME(OpGroupCommitReadPipe);\r
-    SET_OPNAME(OpGroupCommitWritePipe);\r
-\r
-    // Device-side enqueueing of kernels \r
-    SET_OPNAME(OpBuildNDRange);\r
-    SET_OPNAME(OpGetDefaultQueue);\r
-    SET_OPNAME(OpCaptureEventProfilingInfo);\r
-    SET_OPNAME(OpSetUserEventStatus);\r
-    SET_OPNAME(OpIsValidEvent);\r
-    SET_OPNAME(OpCreateUserEvent);\r
-    SET_OPNAME(OpRetainEvent);\r
-    SET_OPNAME(OpReleaseEvent);\r
-    SET_OPNAME(OpGetKernelWorkGroupSize);\r
-    SET_OPNAME(OpGetKernelPreferredWorkGroupSizeMultiple);\r
-    SET_OPNAME(OpGetKernelNDrangeMaxSubGroupSize);\r
-    SET_OPNAME(OpGetKernelNDrangeSubGroupCount);\r
-    SET_OPNAME(OpEnqueueKernel);\r
-    SET_OPNAME(OpEnqueueMarker);\r
-\r
-    InstructionDesc[OpSource].operands.push(OperandSource);
-    InstructionDesc[OpSource].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString);
-    InstructionDesc[OpName].operands.push(OperandId);
-    InstructionDesc[OpName].operands.push(OperandLiteralString);
-    InstructionDesc[OpMemberName].operands.push(OperandId);
-    InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpMemberName].operands.push(OperandLiteralString);
-    InstructionDesc[OpString].operands.push(OperandLiteralString);
-    InstructionDesc[OpLine].operands.push(OperandId);
-    InstructionDesc[OpLine].operands.push(OperandId);
-    InstructionDesc[OpLine].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpLine].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpExtension].operands.push(OperandLiteralString);
-    InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString);
-    InstructionDesc[OpMemoryModel].operands.push(OperandAddressing);
-    InstructionDesc[OpMemoryModel].operands.push(OperandMemory);
-    InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel);
-    InstructionDesc[OpEntryPoint].operands.push(OperandId);
-    InstructionDesc[OpExecutionMode].operands.push(OperandId);
-    InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode);
-    InstructionDesc[OpExecutionMode].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeVector].operands.push(OperandId);
-    InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeMatrix].operands.push(OperandId);
-    InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeSampler].operands.push(OperandId);
-    InstructionDesc[OpTypeSampler].operands.push(OperandDimensionality);
-    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpTypeSampler].operands.push(OperandOptionalId);
-    InstructionDesc[OpTypeArray].operands.push(OperandId);
-    InstructionDesc[OpTypeArray].operands.push(OperandId);
-    InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId);
-    InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds);
-    InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString);
-    InstructionDesc[OpTypePointer].operands.push(OperandStorage);
-    InstructionDesc[OpTypePointer].operands.push(OperandId);
-    InstructionDesc[OpTypePipe].operands.push(OperandId);
-    InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier);
-    InstructionDesc[OpTypeFunction].operands.push(OperandId);
-    InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds);
-    InstructionDesc[OpConstant].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds);
-    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds);
-    InstructionDesc[OpVariable].operands.push(OperandStorage);
-    InstructionDesc[OpVariable].operands.push(OperandOptionalId);
-    InstructionDesc[OpVariableArray].operands.push(OperandStorage);
-    InstructionDesc[OpVariableArray].operands.push(OperandId);
-    InstructionDesc[OpFunction].operands.push(OperandFunction);
-    InstructionDesc[OpFunction].operands.push(OperandId);
-    InstructionDesc[OpFunctionCall].operands.push(OperandId);
-    InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds);
-    InstructionDesc[OpExtInst].operands.push(OperandId);
-    InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpExtInst].operands.push(OperandVariableIds);
-    InstructionDesc[OpLoad].operands.push(OperandId);
-    InstructionDesc[OpLoad].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpStore].operands.push(OperandId);
-    InstructionDesc[OpStore].operands.push(OperandId);
-    InstructionDesc[OpStore].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpPhi].operands.push(OperandVariableIds);
-    InstructionDesc[OpDecorate].operands.push(OperandId);
-    InstructionDesc[OpDecorate].operands.push(OperandDecoration);
-    InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpMemberDecorate].operands.push(OperandId);
-    InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration);
-    InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpGroupDecorate].operands.push(OperandId);
-    InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds);
-    InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId);
-    InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIds);
-    InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId);
-    InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId);
-    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId);
-    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId);
-    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId);
-    InstructionDesc[OpVectorShuffle].operands.push(OperandId);
-    InstructionDesc[OpVectorShuffle].operands.push(OperandId);
-    InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds);
-    InstructionDesc[OpCompositeExtract].operands.push(OperandId);
-    InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpCompositeInsert].operands.push(OperandId);
-    InstructionDesc[OpCompositeInsert].operands.push(OperandId);
-    InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpCopyObject].operands.push(OperandId);
-    InstructionDesc[OpCopyMemory].operands.push(OperandId);
-    InstructionDesc[OpCopyMemory].operands.push(OperandId);
-    InstructionDesc[OpCopyMemory].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpCopyMemorySized].operands.push(OperandId);
-    InstructionDesc[OpCopyMemorySized].operands.push(OperandId);
-    InstructionDesc[OpCopyMemorySized].operands.push(OperandId);
-    InstructionDesc[OpCopyMemorySized].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpSampler].operands.push(OperandId);
-    InstructionDesc[OpSampler].operands.push(OperandId);
-    InstructionDesc[OpTextureSample].operands.push(OperandId);
-    InstructionDesc[OpTextureSample].operands.push(OperandId);
-    InstructionDesc[OpTextureSample].operands.push(OperandOptionalId);
-    InstructionDesc[OpTextureSampleDref].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleDref].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleDref].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProj].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProj].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProj].operands.push(OperandOptionalId);
-    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleOffset].operands.push(OperandOptionalId);
-    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandOptionalId);
-    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexel].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexel].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexel].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchSample].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchSample].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchSample].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchBuffer].operands.push(OperandId);
-    InstructionDesc[OpTextureFetchBuffer].operands.push(OperandId);
-    InstructionDesc[OpTextureGather].operands.push(OperandId);
-    InstructionDesc[OpTextureGather].operands.push(OperandId);
-    InstructionDesc[OpTextureGather].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId);
-    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId);
-    InstructionDesc[OpTextureQuerySizeLod].operands.push(OperandId);
-    InstructionDesc[OpTextureQuerySizeLod].operands.push(OperandId);
-    InstructionDesc[OpTextureQuerySize].operands.push(OperandId);
-    InstructionDesc[OpTextureQueryLod].operands.push(OperandId);
-    InstructionDesc[OpTextureQueryLod].operands.push(OperandId);
-    InstructionDesc[OpTextureQueryLevels].operands.push(OperandId);
-    InstructionDesc[OpTextureQuerySamples].operands.push(OperandId);
-    InstructionDesc[OpAccessChain].operands.push(OperandId);
-    InstructionDesc[OpAccessChain].operands.push(OperandVariableIds);
-    InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId);
-    InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds);
-    InstructionDesc[OpSNegate].operands.push(OperandId);
-    InstructionDesc[OpFNegate].operands.push(OperandId);
-    InstructionDesc[OpNot].operands.push(OperandId);
-    InstructionDesc[OpAny].operands.push(OperandId);
-    InstructionDesc[OpAll].operands.push(OperandId);
-    InstructionDesc[OpConvertFToU].operands.push(OperandId);
-    InstructionDesc[OpConvertFToS].operands.push(OperandId);
-    InstructionDesc[OpConvertSToF].operands.push(OperandId);
-    InstructionDesc[OpConvertUToF].operands.push(OperandId);
-    InstructionDesc[OpUConvert].operands.push(OperandId);
-    InstructionDesc[OpSConvert].operands.push(OperandId);
-    InstructionDesc[OpFConvert].operands.push(OperandId);
-    InstructionDesc[OpConvertPtrToU].operands.push(OperandId);
-    InstructionDesc[OpConvertUToPtr].operands.push(OperandId);
-    InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId);
-    InstructionDesc[OpGenericCastToPtr].operands.push(OperandId);
-    InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId);
-    InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage);
-    InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId);
-    InstructionDesc[OpBitcast].operands.push(OperandId);
-    InstructionDesc[OpTranspose].operands.push(OperandId);
-    InstructionDesc[OpIsNan].operands.push(OperandId);
-    InstructionDesc[OpIsInf].operands.push(OperandId);
-    InstructionDesc[OpIsFinite].operands.push(OperandId);
-    InstructionDesc[OpIsNormal].operands.push(OperandId);
-    InstructionDesc[OpSignBitSet].operands.push(OperandId);
-    InstructionDesc[OpLessOrGreater].operands.push(OperandId);
-    InstructionDesc[OpLessOrGreater].operands.push(OperandId);
-    InstructionDesc[OpOrdered].operands.push(OperandId);
-    InstructionDesc[OpOrdered].operands.push(OperandId);
-    InstructionDesc[OpUnordered].operands.push(OperandId);
-    InstructionDesc[OpUnordered].operands.push(OperandId);
-    InstructionDesc[OpArrayLength].operands.push(OperandId);
-    InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpIAdd].operands.push(OperandId);
-    InstructionDesc[OpIAdd].operands.push(OperandId);
-    InstructionDesc[OpFAdd].operands.push(OperandId);
-    InstructionDesc[OpFAdd].operands.push(OperandId);
-    InstructionDesc[OpISub].operands.push(OperandId);
-    InstructionDesc[OpISub].operands.push(OperandId);
-    InstructionDesc[OpFSub].operands.push(OperandId);
-    InstructionDesc[OpFSub].operands.push(OperandId);
-    InstructionDesc[OpIMul].operands.push(OperandId);
-    InstructionDesc[OpIMul].operands.push(OperandId);
-    InstructionDesc[OpFMul].operands.push(OperandId);
-    InstructionDesc[OpFMul].operands.push(OperandId);
-    InstructionDesc[OpUDiv].operands.push(OperandId);
-    InstructionDesc[OpUDiv].operands.push(OperandId);
-    InstructionDesc[OpSDiv].operands.push(OperandId);
-    InstructionDesc[OpSDiv].operands.push(OperandId);
-    InstructionDesc[OpFDiv].operands.push(OperandId);
-    InstructionDesc[OpFDiv].operands.push(OperandId);
-    InstructionDesc[OpUMod].operands.push(OperandId);
-    InstructionDesc[OpUMod].operands.push(OperandId);
-    InstructionDesc[OpSRem].operands.push(OperandId);
-    InstructionDesc[OpSRem].operands.push(OperandId);
-    InstructionDesc[OpSMod].operands.push(OperandId);
-    InstructionDesc[OpSMod].operands.push(OperandId);
-    InstructionDesc[OpFRem].operands.push(OperandId);
-    InstructionDesc[OpFRem].operands.push(OperandId);
-    InstructionDesc[OpFMod].operands.push(OperandId);
-    InstructionDesc[OpFMod].operands.push(OperandId);
-    InstructionDesc[OpVectorTimesScalar].operands.push(OperandId);
-    InstructionDesc[OpVectorTimesScalar].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId);
-    InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId);
-    InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesVector].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesVector].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId);
-    InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId);
-    InstructionDesc[OpOuterProduct].operands.push(OperandId);
-    InstructionDesc[OpOuterProduct].operands.push(OperandId);
-    InstructionDesc[OpDot].operands.push(OperandId);
-    InstructionDesc[OpDot].operands.push(OperandId);
-    InstructionDesc[OpShiftRightLogical].operands.push(OperandId);
-    InstructionDesc[OpShiftRightLogical].operands.push(OperandId);
-    InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId);
-    InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId);
-    InstructionDesc[OpShiftLeftLogical].operands.push(OperandId);
-    InstructionDesc[OpShiftLeftLogical].operands.push(OperandId);
-    InstructionDesc[OpLogicalOr].operands.push(OperandId);
-    InstructionDesc[OpLogicalOr].operands.push(OperandId);
-    InstructionDesc[OpLogicalXor].operands.push(OperandId);
-    InstructionDesc[OpLogicalXor].operands.push(OperandId);
-    InstructionDesc[OpLogicalAnd].operands.push(OperandId);
-    InstructionDesc[OpLogicalAnd].operands.push(OperandId);
-    InstructionDesc[OpBitwiseOr].operands.push(OperandId);
-    InstructionDesc[OpBitwiseOr].operands.push(OperandId);
-    InstructionDesc[OpBitwiseXor].operands.push(OperandId);
-    InstructionDesc[OpBitwiseXor].operands.push(OperandId);
-    InstructionDesc[OpBitwiseAnd].operands.push(OperandId);
-    InstructionDesc[OpBitwiseAnd].operands.push(OperandId);
-    InstructionDesc[OpSelect].operands.push(OperandId);
-    InstructionDesc[OpSelect].operands.push(OperandId);
-    InstructionDesc[OpSelect].operands.push(OperandId);
-    InstructionDesc[OpIEqual].operands.push(OperandId);
-    InstructionDesc[OpIEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordEqual].operands.push(OperandId);
-    InstructionDesc[OpINotEqual].operands.push(OperandId);
-    InstructionDesc[OpINotEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdNotEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdNotEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordNotEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordNotEqual].operands.push(OperandId);
-    InstructionDesc[OpULessThan].operands.push(OperandId);
-    InstructionDesc[OpULessThan].operands.push(OperandId);
-    InstructionDesc[OpSLessThan].operands.push(OperandId);
-    InstructionDesc[OpSLessThan].operands.push(OperandId);
-    InstructionDesc[OpFOrdLessThan].operands.push(OperandId);
-    InstructionDesc[OpFOrdLessThan].operands.push(OperandId);
-    InstructionDesc[OpFUnordLessThan].operands.push(OperandId);
-    InstructionDesc[OpFUnordLessThan].operands.push(OperandId);
-    InstructionDesc[OpUGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpUGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpSGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpSGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId);
-    InstructionDesc[OpULessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpULessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpSLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpSLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId);
-    InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId);
-    InstructionDesc[OpDPdx].operands.push(OperandId);
-    InstructionDesc[OpDPdy].operands.push(OperandId);
-    InstructionDesc[OpFwidth].operands.push(OperandId);
-    InstructionDesc[OpDPdxFine].operands.push(OperandId);
-    InstructionDesc[OpDPdyFine].operands.push(OperandId);
-    InstructionDesc[OpFwidthFine].operands.push(OperandId);
-    InstructionDesc[OpDPdxCoarse].operands.push(OperandId);
-    InstructionDesc[OpDPdyCoarse].operands.push(OperandId);
-    InstructionDesc[OpFwidthCoarse].operands.push(OperandId);
-    InstructionDesc[OpEmitStreamVertex].operands.push(OperandId);
-    InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId);
-    InstructionDesc[OpControlBarrier].operands.push(OperandExecutionScope);
-    InstructionDesc[OpMemoryBarrier].operands.push(OperandExecutionScope);
-    InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpImagePointer].operands.push(OperandId);
-    InstructionDesc[OpImagePointer].operands.push(OperandId);
-    InstructionDesc[OpImagePointer].operands.push(OperandId);
-    InstructionDesc[OpAtomicInit].operands.push(OperandId);
-    InstructionDesc[OpAtomicInit].operands.push(OperandId);
-    InstructionDesc[OpAtomicLoad].operands.push(OperandId);
-    InstructionDesc[OpAtomicLoad].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicStore].operands.push(OperandId);
-    InstructionDesc[OpAtomicStore].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicStore].operands.push(OperandId);
-    InstructionDesc[OpAtomicExchange].operands.push(OperandId);
-    InstructionDesc[OpAtomicExchange].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicExchange].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId);
-    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId);
-    InstructionDesc[OpAtomicIIncrement].operands.push(OperandId);
-    InstructionDesc[OpAtomicIIncrement].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicIDecrement].operands.push(OperandId);
-    InstructionDesc[OpAtomicIDecrement].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicIAdd].operands.push(OperandId);
-    InstructionDesc[OpAtomicIAdd].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicIAdd].operands.push(OperandId);
-    InstructionDesc[OpAtomicISub].operands.push(OperandId);
-    InstructionDesc[OpAtomicISub].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicISub].operands.push(OperandId);
-    InstructionDesc[OpAtomicUMin].operands.push(OperandId);
-    InstructionDesc[OpAtomicUMin].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicUMin].operands.push(OperandId);
-    InstructionDesc[OpAtomicUMax].operands.push(OperandId);
-    InstructionDesc[OpAtomicUMax].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicUMax].operands.push(OperandId);
-    InstructionDesc[OpAtomicAnd].operands.push(OperandId);
-    InstructionDesc[OpAtomicAnd].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicAnd].operands.push(OperandId);
-    InstructionDesc[OpAtomicOr].operands.push(OperandId);
-    InstructionDesc[OpAtomicOr].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicOr].operands.push(OperandId);
-    InstructionDesc[OpAtomicXor].operands.push(OperandId);
-    InstructionDesc[OpAtomicXor].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics);
-    InstructionDesc[OpAtomicXor].operands.push(OperandId);
-    InstructionDesc[OpLoopMerge].operands.push(OperandId);
-    InstructionDesc[OpLoopMerge].operands.push(OperandLoop);
-    InstructionDesc[OpSelectionMerge].operands.push(OperandId);
-    InstructionDesc[OpSelectionMerge].operands.push(OperandSelect);
-    InstructionDesc[OpBranch].operands.push(OperandId);
-    InstructionDesc[OpBranchConditional].operands.push(OperandId);
-    InstructionDesc[OpBranchConditional].operands.push(OperandId);
-    InstructionDesc[OpBranchConditional].operands.push(OperandId);
-    InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals);
-    InstructionDesc[OpSwitch].operands.push(OperandId);
-    InstructionDesc[OpSwitch].operands.push(OperandId);
-    InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId);
-    InstructionDesc[OpReturnValue].operands.push(OperandId);
-    InstructionDesc[OpLifetimeStart].operands.push(OperandId);
-    InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpLifetimeStop].operands.push(OperandId);
-    InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber);
-    InstructionDesc[OpCompileFlag].operands.push(OperandLiteralString);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandExecutionScope);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId);
-    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId);
-    InstructionDesc[OpWaitGroupEvents].operands.push(OperandExecutionScope);
-    InstructionDesc[OpWaitGroupEvents].operands.push(OperandId);
-    InstructionDesc[OpWaitGroupEvents].operands.push(OperandId);
-    InstructionDesc[OpGroupAll].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupAll].operands.push(OperandId);
-    InstructionDesc[OpGroupAny].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupAny].operands.push(OperandId);
-    InstructionDesc[OpGroupBroadcast].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupBroadcast].operands.push(OperandId);
-    InstructionDesc[OpGroupBroadcast].operands.push(OperandId);
-    InstructionDesc[OpGroupIAdd].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupIAdd].operands.push(OperandId);
-    InstructionDesc[OpGroupFAdd].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupFAdd].operands.push(OperandId);
-    InstructionDesc[OpGroupUMin].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupUMin].operands.push(OperandId);
-    InstructionDesc[OpGroupSMin].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupSMin].operands.push(OperandId);
-    InstructionDesc[OpGroupFMin].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupFMin].operands.push(OperandId);
-    InstructionDesc[OpGroupUMax].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupUMax].operands.push(OperandId);
-    InstructionDesc[OpGroupSMax].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupSMax].operands.push(OperandId);
-    InstructionDesc[OpGroupFMax].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation);
-    InstructionDesc[OpGroupFMax].operands.push(OperandId);
-    InstructionDesc[OpReadPipe].operands.push(OperandId);
-    InstructionDesc[OpReadPipe].operands.push(OperandId);
-    InstructionDesc[OpWritePipe].operands.push(OperandId);
-    InstructionDesc[OpWritePipe].operands.push(OperandId);
-    InstructionDesc[OpReservedReadPipe].operands.push(OperandId);
-    InstructionDesc[OpReservedReadPipe].operands.push(OperandId);
-    InstructionDesc[OpReservedReadPipe].operands.push(OperandId);
-    InstructionDesc[OpReservedReadPipe].operands.push(OperandId);
-    InstructionDesc[OpReservedWritePipe].operands.push(OperandId);
-    InstructionDesc[OpReservedWritePipe].operands.push(OperandId);
-    InstructionDesc[OpReservedWritePipe].operands.push(OperandId);
-    InstructionDesc[OpReservedWritePipe].operands.push(OperandId);
-    InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId);
-    InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId);
-    InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId);
-    InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId);
-    InstructionDesc[OpCommitReadPipe].operands.push(OperandId);
-    InstructionDesc[OpCommitReadPipe].operands.push(OperandId);
-    InstructionDesc[OpCommitWritePipe].operands.push(OperandId);
-    InstructionDesc[OpCommitWritePipe].operands.push(OperandId);
-    InstructionDesc[OpIsValidReserveId].operands.push(OperandId);
-    InstructionDesc[OpGetNumPipePackets].operands.push(OperandId);
-    InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId);
-    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId);
-    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId);
-    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId);
-    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId);
-    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId);
-    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId);
-    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandExecutionScope);
-    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId);
-    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId);
-    InstructionDesc[OpBuildNDRange].operands.push(OperandId);
-    InstructionDesc[OpBuildNDRange].operands.push(OperandId);
-    InstructionDesc[OpBuildNDRange].operands.push(OperandId);
-    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId);
-    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandKernelProfilingInfo);
-    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId);
-    InstructionDesc[OpSetUserEventStatus].operands.push(OperandId);
-    InstructionDesc[OpSetUserEventStatus].operands.push(OperandId);
-    InstructionDesc[OpIsValidEvent].operands.push(OperandId);
-    InstructionDesc[OpRetainEvent].operands.push(OperandId);
-    InstructionDesc[OpReleaseEvent].operands.push(OperandId);
-    InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId);
-    InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId);
-    InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId);
-    InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId);
-    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId);
-    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandKernelEnqueueFlags);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandId);
-    InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds);
-    InstructionDesc[OpEnqueueMarker].operands.push(OperandId);
-    InstructionDesc[OpEnqueueMarker].operands.push(OperandId);
-    InstructionDesc[OpEnqueueMarker].operands.push(OperandId);
-    InstructionDesc[OpEnqueueMarker].operands.push(OperandId);
-}\r
-\r
 //\r
-// A whole set of functions that translate enums to English.\r
+// Whole set of functions that translate enumerants to their text strings for\r
+// the specification (or their sanitized versions for auto-generating the\r
+// spirv.h header.\r
+//\r
+// Also, the ceilings are declared next to these, to help keep them in sync.\r
+// Ceilings should be\r
+//  - one more than the maximum value an enumerant takes on, for non-mask enumerants\r
+//    (for non-sparse enums, this is the number of enumurants)\r
+//  - the number of bits consumed by the set of masks\r
+//    (for non-sparse mask enums, this is the number of enumurants)\r
 //\r
 \r
-const char* CapabilityString(int cap)\r
-{\r
-    switch (cap) {\r
-    case CapMatrix: return "Matrix";\r
-    case CapShader: return "Shader";\r
-    case CapGeom:   return "Geom";\r
-    case CapTess:   return "Tess";\r
-    case CapAddr:   return "Addr";\r
-    case CapLink:   return "Link";\r
-    case CapKernel: return "Kernel";\r
-\r
-    default:        return "unknown";\r
-\r
-    }\r
-}\r
+const int SourceLanguageCeiling = 4;\r
 \r
 const char* SourceString(int source)\r
 {\r
     switch (source) {\r
-    case LangESSL:    return "ESSL";\r
-    case LangGLSL:    return "GLSL";\r
-    case LangOpenCL:  return "OpenCL";\r
+    case 0:  return "Unknown";\r
+    case 1:  return "ESSL";\r
+    case 2:  return "GLSL";\r
+    case 3:  return "OpenCL";\r
 \r
-    default:          return "unknown";\r
+    case SourceLanguageCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int ExecutionModelCeiling = 7;\r
+\r
 const char* ExecutionModelString(int model)\r
 {\r
     switch (model) {\r
-    case ModelVertex:                  return "Vertex";\r
-    case ModelTessellationControl:     return "TessellationControl";\r
-    case ModelTessellationEvaluation:  return "TessellationEvaluation";\r
-    case ModelGeometry:                return "Geometry";\r
-    case ModelFragment:                return "Fragment";\r
-    case ModelGLCompute:               return "GLCompute";\r
-    case ModelKernel:                  return "Kernel";\r
-\r
-    default:                           return "BadModel";\r
+    case 0:  return "Vertex";\r
+    case 1:  return "TessellationControl";\r
+    case 2:  return "TessellationEvaluation";\r
+    case 3:  return "Geometry";\r
+    case 4:  return "Fragment";\r
+    case 5:  return "GLCompute";\r
+    case 6:  return "Kernel";\r
+\r
+    case ExecutionModelCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int AddressingModelCeiling = 3;\r
+\r
 const char* AddressingString(int addr)\r
 {\r
     switch (addr) {\r
-    case AddressingLogical:    return "Logical";\r
-    case AddressingPhysical32: return "Physical32";\r
-    case AddressingPhysical64: return "Physical64";\r
+    case 0:  return "Logical";\r
+    case 1:  return "Physical32";\r
+    case 2:  return "Physical64";\r
 \r
-    default:                   return "BadAddressModel";\r
+    case AddressingModelCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
-const char* AddressingDesc(int addr)\r
-{\r
-    switch (addr) {\r
-    case AddressingLogical:    return "No variables that are pointers or other physical pointers.  No arithmetic or casting on pointers.";\r
-    case AddressingPhysical32: return "";\r
-    case AddressingPhysical64: return "";\r
-\r
-    default:                   return "BadAddressModel";\r
-    }\r
-}\r
+const int MemoryModelCeiling = 5;\r
 \r
 const char* MemoryString(int mem)\r
 {\r
     switch (mem) {\r
-    case MemorySimple:   return "Simple";\r
-    case MemoryGLSL450:  return "GLSL450";\r
-    case MemoryOCL12:    return "OpenCL1.2";\r
-    case MemoryOCL20:    return "OpenCL2.0";\r
-    case MemoryOCL21:    return "OpenCL2.1";\r
-    default:             return "BadMemoryModel";\r
+    case 0:  return "Simple";\r
+    case 1:  return "GLSL450";\r
+    case 2:  return "OpenCL1.2";\r
+    case 3:  return "OpenCL2.0";\r
+    case 4:  return "OpenCL2.1";\r
+\r
+    case MemoryModelCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int ExecutionModeCeiling = 31;\r
+\r
 const char* ExecutionModeString(int mode)\r
 {\r
     switch (mode) {\r
-    case ExecutionInvocations:           return "Invocations";\r
-    case ExecutionSpacingEqual:          return "SpacingEqual";\r
-    case ExecutionSpacingFractionalEven: return "SpacingFractionalEven";\r
-    case ExecutionSpacingFractionalOdd:  return "SpacingFractionalOdd";\r
-    case ExecutionVertexOrderCw:         return "VertexOrderCw";\r
-    case ExecutionVertexOrderCcw:        return "VertexOrderCcw";\r
-    case ExecutionPixelCenterInteger:    return "PixelCenterInteger";\r
-    case ExecutionOriginUpperLeft:       return "OriginUpperLeft";\r
-    case ExecutionEarlyFragmentTests:    return "EarlyFragmentTests";\r
-    case ExecutionPointMode:             return "PointMode";\r
-    case ExecutionLocalSize:             return "LocalSize";\r
-    case ExecutionLocalSizeHint:         return "LocalSizeHint";\r
-    case ExecutionVecTypeHint:           return "VecTypeHint";\r
-    case ExecutionContractionOff:        return "ContractionOff";\r
-    case ExecutionXfb:                   return "Xfb";\r
-    case ExecutionDepthReplacing:        return "DepthReplacing";\r
-    case ExecutionDepthAny:              return "DepthAny";\r
-    case ExecutionDepthGreater:          return "DepthGreater";\r
-    case ExecutionDepthLess:             return "DepthLess";\r
-    case ExecutionDepthUnchanged:        return "DepthUnchanged";\r
-\r
-    case ExecutionInputPoints:              return "InputPoints";\r
-    case ExecutionInputLines:               return "InputLines";\r
-    case ExecutionInputLinesAdjacency:      return "InputLinesAdjacency";\r
-    case ExecutionInputTriangles:           return "InputTriangles";\r
-    case ExecutionInputTrianglesAdjacency:  return "InputTrianglesAdjacency";\r
-    case ExecutionInputQuads:               return "InputQuads";\r
-    case ExecutionInputIsolines:            return "InputIsolines";\r
-\r
-    case ExecutionOutputVertices:      return "OutputVertices";\r
-    case ExecutionOutputPoints:        return "OutputPoints";\r
-    case ExecutionOutputLineStrip:     return "OutputLineStrip";\r
-    case ExecutionOutputTriangleStrip: return "OutputTriangleStrip";\r
-\r
-    default:                    return "BadMode";\r
+    case 0:  return "Invocations";\r
+    case 1:  return "SpacingEqual";\r
+    case 2:  return "SpacingFractionalEven";\r
+    case 3:  return "SpacingFractionalOdd";\r
+    case 4:  return "VertexOrderCw";\r
+    case 5:  return "VertexOrderCcw";\r
+    case 6:  return "PixelCenterInteger";\r
+    case 7:  return "OriginUpperLeft";\r
+    case 8:  return "EarlyFragmentTests";\r
+    case 9:  return "PointMode";\r
+    case 10: return "Xfb";\r
+    case 11: return "DepthReplacing";\r
+    case 12: return "DepthAny";\r
+    case 13: return "DepthGreater";\r
+    case 14: return "DepthLess";\r
+    case 15: return "DepthUnchanged";\r
+    case 16: return "LocalSize";\r
+    case 17: return "LocalSizeHint";\r
+    case 18: return "InputPoints";\r
+    case 19: return "InputLines";\r
+    case 20: return "InputLinesAdjacency";\r
+    case 21: return "InputTriangles";\r
+    case 22: return "InputTrianglesAdjacency";\r
+    case 23: return "InputQuads";\r
+    case 24: return "InputIsolines";\r
+    case 25: return "OutputVertices";\r
+    case 26: return "OutputPoints";\r
+    case 27: return "OutputLineStrip";\r
+    case 28: return "OutputTriangleStrip";\r
+    case 29: return "VecTypeHint";\r
+    case 30: return "ContractionOff";\r
+\r
+    case ExecutionModeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int StorageClassCeiling = 11;\r
+\r
 const char* StorageClassString(int StorageClass)\r
 {\r
     switch (StorageClass) {\r
-    //case StorageLowertime:       return "Lowertime";      // TODO: finish removing when sure they are gone.\r
-    case StorageConstantUniform: return "UniformConstant";\r
-    case StorageUniform:         return "Uniform";\r
-    case StorageInput:           return "Input";\r
-    case StorageOutput:          return "Output";\r
-    case StorageWorkgroupLocal:  return "WorkgroupLocal";\r
-    case StoragePrivateGlobal:   return "PrivateGlobal";\r
-    case StorageWorkgroupGlobal: return "WorkgroupGlobal";\r
-    case StorageFunction:        return "Function";\r
-    case StoragePrivate:         return "Private";\r
-    case StorageAtomicCounter:   return "AtomicCounter";\r
-    case StorageGeneric:         return "Generic";        \r
-        \r
-    default:                     return 0;\r
+    case 0:  return "UniformConstant";\r
+    case 1:  return "Input";\r
+    case 2:  return "Uniform";\r
+    case 3:  return "Output";\r
+    case 4:  return "WorkgroupLocal";\r
+    case 5:  return "WorkgroupGlobal";\r
+    case 6:  return "PrivateGlobal";\r
+    case 7:  return "Function";\r
+    case 8:  return "Generic";\r
+    case 9:  return "Private";\r
+    case 10: return "AtomicCounter";\r
+\r
+    case StorageClassCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int DecorationCeiling = 45;\r
+\r
 const char* DecorationString(int decoration)\r
 {\r
     switch (decoration) {\r
-    case DecPrecisionLow:      return "PrecisionLow";\r
-    case DecPrecisionMedium:   return "PrecisionMedium";\r
-    case DecPrecisionHigh:     return "PrecisionHigh";\r
-    case DecBlock:             return "Block";\r
-    case DecBufferBlock:       return "BufferBlock";\r
-    case DecRowMajor:          return "RowMajor";\r
-    case DecColMajor:          return "ColMajor";\r
-    case DecGLSLShared:        return "GLSLShared";\r
-    case DecGLSLStd140:        return "GLSLStd140";\r
-    case DecGLSLStd430:        return "GLSLStd430";\r
-    case DecGLSLPacked:        return "GLSLPacked";\r
-    case DecSmooth:            return "Smooth";\r
-    case DecNoperspective:     return "Noperspective";\r
-    case DecFlat:              return "Flat";\r
-    case DecPatch:             return "Patch";\r
-    case DecCentroid:          return "Centroid";\r
-    case DecSample:            return "Sample";\r
-    case DecInvariant:         return "Invariant";\r
-    case DecRestrict:          return "Restrict";\r
-    case DecAliased:           return "Aliased";\r
-    case DecVolatile:          return "Volatile";\r
-    case DecConstant:          return "Constant";\r
-    case DecCoherent:          return "Coherent";\r
-    case DecNonwritable:       return "Nonwritable";\r
-    case DecNonreadable:       return "Nonreadable";\r
-    case DecUniform:           return "Uniform";\r
-    case DecNoStaticUse:       return "NoStaticUse";\r
-    case DecCPacked:           return "CPacked";\r
-    case DecFuncParamAttr:     return "FuncParamAttr";\r
-    case DecFPSaturatedConv:   return "FPSaturatedConversion";\r
-    case DecFPRoundingMode:    return "FP Rounding Mode";\r
-    case DecFPFastMathMode:    return "FP Fast Math Mode";\r
-    case DecLinkageType:       return "Linkage Type";\r
-    case DecStream:            return "Stream";\r
-    case DecLocation:          return "Location";\r
-    case DecComponent:         return "Component";\r
-    case DecIndex:             return "Index";\r
-    case DecBinding:           return "Binding";\r
-    case DecDescriptorSet:     return "DescriptorSet";\r
-    case DecOffset:            return "Offset";\r
-    case DecAlignment:         return "Alignment";\r
-    case DecXfbBuffer:         return "XfbBuffer";\r
-    case DecStride:            return "Stride";\r
-    case DecBuiltIn:           return "Built-In";\r
-    case DecSpecId:            return "SpecId";\r
-\r
-    default:                   return "BadDecoration";\r
+    case 0:  return "PrecisionLow";\r
+    case 1:  return "PrecisionMedium";\r
+    case 2:  return "PrecisionHigh";\r
+    case 3:  return "Block";\r
+    case 4:  return "BufferBlock";\r
+    case 5:  return "RowMajor";\r
+    case 6:  return "ColMajor";\r
+    case 7:  return "GLSLShared";\r
+    case 8:  return "GLSLStd140";\r
+    case 9:  return "GLSLStd430";\r
+    case 10: return "GLSLPacked";\r
+    case 11: return "Smooth";\r
+    case 12: return "Noperspective";\r
+    case 13: return "Flat";\r
+    case 14: return "Patch";\r
+    case 15: return "Centroid";\r
+    case 16: return "Sample";\r
+    case 17: return "Invariant";\r
+    case 18: return "Restrict";\r
+    case 19: return "Aliased";\r
+    case 20: return "Volatile";\r
+    case 21: return "Constant";\r
+    case 22: return "Coherent";\r
+    case 23: return "Nonwritable";\r
+    case 24: return "Nonreadable";\r
+    case 25: return "Uniform";\r
+    case 26: return "NoStaticUse";\r
+    case 27: return "CPacked";\r
+    case 28: return "SaturatedConversion";\r
+    case 29: return "Stream";\r
+    case 30: return "Location";\r
+    case 31: return "Component";\r
+    case 32: return "Index";\r
+    case 33: return "Binding";\r
+    case 34: return "DescriptorSet";\r
+    case 35: return "Offset";\r
+    case 36: return "Alignment";\r
+    case 37: return "XfbBuffer";\r
+    case 38: return "Stride";\r
+    case 39: return "BuiltIn";\r
+    case 40: return "FuncParamAttr";\r
+    case 41: return "FP Rounding Mode";\r
+    case 42: return "FP Fast Math Mode";\r
+    case 43: return "Linkage Attributes";\r
+    case 44: return "SpecId";\r
+\r
+    case DecorationCeiling:\r
+    default:  return "Bad";\r
     }\r
 }\r
 \r
+const int BuiltInCeiling = 42;\r
+\r
 const char* BuiltInString(int builtIn)\r
 {\r
     switch (builtIn) {\r
-    case BuiltInPosition:                  return "Position";\r
-    case BuiltInPointSize:                 return "PointSize";\r
-    case BuiltInClipVertex:                return "ClipVertex";\r
-    case BuiltInClipDistance:              return "ClipDistance";\r
-    case BuiltInCullDistance:              return "CullDistance";\r
-    case BuiltInVertexId:                  return "VertexId";\r
-    case BuiltInInstanceId:                return "InstanceId";\r
-    case BuiltInPrimitiveId:               return "PrimitiveId";\r
-    case BuiltInInvocationId:              return "InvocationId";\r
-    case BuiltInLayer:                     return "Layer";\r
-    case BuiltInViewportIndex:             return "ViewportIndex";\r
-    case BuiltInTessLevelOuter:            return "TessLevelOuter";\r
-    case BuiltInTessLevelInner:            return "TessLevelInner";\r
-    case BuiltInTessCoord:                 return "TessCoord";\r
-    case BuiltInPatchVertices:             return "PatchVertices";\r
-    case BuiltInFragCoord:                 return "FragCoord";\r
-    case BuiltInPointCoord:                return "PointCoord";\r
-    case BuiltInFrontFacing:               return "FrontFacing";\r
-    case BuiltInSampleId:                  return "SampleId";\r
-    case BuiltInSamplePosition:            return "SamplePosition";\r
-    case BuiltInSampleMask:                return "SampleMask";\r
-    case BuiltInFragColor:                 return "FragColor";\r
-    case BuiltInFragDepth:                 return "FragDepth";\r
-    case BuiltInHelperInvocation:          return "HelperInvocation";\r
-    case BuiltInNumWorkgroups:             return "NumWorkgroups";\r
-    case BuiltInWorkgroupSize:             return "WorkgroupSize";\r
-    case BuiltInWorkgroupId:               return "WorkgroupId";\r
-    case BuiltInLocalInvocationId:         return "LocalInvocationId";\r
-    case BuiltInGlobalInvocationId:        return "GlobalInvocationId";\r
-    case BuiltInLocalInvocationIndex:      return "LocalInvocationIndex";    \r
-    case BuiltInWorkDim:                   return "WorkDim";\r
-    case BuiltInGlobalSize:                return "GlobalSize";\r
-    case BuiltInEnqueuedWorkgroupSize:     return "EnqueuedWorkgroupSize";\r
-    case BuiltInGlobalOffset:              return "GlobalOffset";\r
-    case BuiltInGlobalLinearId:            return "GlobalLinearId";\r
-    case BuiltInWorkgroupLinearId:         return "WorkgroupLinearId";\r
-    case BuiltInSubgroupSize:              return "SubgroupSize";\r
-    case BuiltInSubgroupMaxSize:           return "SubgroupMaxSize";\r
-    case BuiltInNumSubgroups:              return "NumSubgroups";\r
-    case BuiltInNumEnqueuedSubgroups:      return "NumEnqueuedSubgroups";\r
-    case BuiltInSubgroupId:                return "SubgroupId";\r
-    case BuiltInSubgroupLocalInvocationId: return "SubgroupLocalInvocationId";\r
-    default:                               return "BadBuiltIn";\r
+    case 0:  return "Position";\r
+    case 1:  return "PointSize";\r
+    case 2:  return "ClipVertex";\r
+    case 3:  return "ClipDistance";\r
+    case 4:  return "CullDistance";\r
+    case 5:  return "VertexId";\r
+    case 6:  return "InstanceId";\r
+    case 7:  return "PrimitiveId";\r
+    case 8:  return "InvocationId";\r
+    case 9:  return "Layer";\r
+    case 10: return "ViewportIndex";\r
+    case 11: return "TessLevelOuter";\r
+    case 12: return "TessLevelInner";\r
+    case 13: return "TessCoord";\r
+    case 14: return "PatchVertices";\r
+    case 15: return "FragCoord";\r
+    case 16: return "PointCoord";\r
+    case 17: return "FrontFacing";\r
+    case 18: return "SampleId";\r
+    case 19: return "SamplePosition";\r
+    case 20: return "SampleMask";\r
+    case 21: return "FragColor";\r
+    case 22: return "FragDepth";\r
+    case 23: return "HelperInvocation";\r
+    case 24: return "NumWorkgroups";\r
+    case 25: return "WorkgroupSize";\r
+    case 26: return "WorkgroupId";\r
+    case 27: return "LocalInvocationId";\r
+    case 28: return "GlobalInvocationId";\r
+    case 29: return "LocalInvocationIndex";\r
+    case 30: return "WorkDim";\r
+    case 31: return "GlobalSize";\r
+    case 32: return "EnqueuedWorkgroupSize";\r
+    case 33: return "GlobalOffset";\r
+    case 34: return "GlobalLinearId";\r
+    case 35: return "WorkgroupLinearId";\r
+    case 36: return "SubgroupSize";\r
+    case 37: return "SubgroupMaxSize";\r
+    case 38: return "NumSubgroups";\r
+    case 39: return "NumEnqueuedSubgroups";\r
+    case 40: return "SubgroupId";\r
+    case 41: return "SubgroupLocalInvocationId";\r
+\r
+    case BuiltInCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int DimensionCeiling = 6;\r
+\r
 const char* DimensionString(int dim)\r
 {\r
     switch (dim) {\r
-    case Dim1D:     return "1D";\r
-    case Dim2D:     return "2D";\r
-    case Dim3D:     return "3D";\r
-    case DimCube:   return "Cube";\r
-    case DimRect:   return "Rect";\r
-    case DimBuffer: return "Buffer";\r
-\r
-    default:        return "BadDimensionality";\r
+    case 0:  return "1D";\r
+    case 1:  return "2D";\r
+    case 2:  return "3D";\r
+    case 3:  return "Cube";\r
+    case 4:  return "Rect";\r
+    case 5:  return "Buffer";\r
+\r
+    case DimensionCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int SamplerAddressingModeCeiling = 9;\r
+\r
 const char* SamplerAddressingModeString(int mode)\r
 {\r
     switch (mode) {\r
-    case SamplerAddressingNone:           return "None";\r
-    case SamplerAddressingClampToEdge:    return "ClampEdge";\r
-    case SamplerAddressingClamp:          return "Clamp";\r
-    case SamplerAddressingRepeat:         return "Repeat";\r
-    case SamplerAddressingRepeatMirrored: return "RepeatMirrored";\r
-\r
-    default:                              return "BadSamplerAddrMode";\r
+    case 0:  return "None";\r
+    case 2:  return "ClampToEdge";\r
+    case 4:  return "Clamp";\r
+    case 6:  return "Repeat";\r
+    case 8:  return "RepeatMirrored";\r
+\r
+    case SamplerAddressingModeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int SamplerFilterModeCeiling = 0x21;\r
+\r
 const char* SamplerFilterModeString(int mode)\r
 {\r
     switch (mode) {\r
-    case SamplerFilterNearest:   return "Nearest";\r
-    case SamplerFilterLinear:    return "Linear";\r
+    case 0x10: return "Nearest";\r
+    case 0x20: return "Linear";\r
 \r
-    default:        return "BadSamplerFilterMode";\r
+    case SamplerFilterModeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int FPFastMathCeiling = 5;\r
+\r
 const char* FPFastMathString(int mode)\r
 {\r
     switch (mode) {\r
-    case FPFastMathNNan:   return "NotNaN";\r
-    case FPFastMathNInf:   return "NotInf";\r
-    case FPFastMathNSZ:    return "NSZ";\r
-    case FPFastMathARcp:   return "AllowRecip";\r
-    case FPFastMathFast:   return "Fast";\r
-\r
-    default:               return "BadFastMathMode";\r
+    case 0: return "NotNaN";\r
+    case 1: return "NotInf";\r
+    case 2: return "NSZ";\r
+    case 3: return "AllowRecip";\r
+    case 4: return "Fast";\r
+\r
+    case FPFastMathCeiling:\r
+    default:     return "Bad";\r
     }\r
 }\r
 \r
+const int FPRoundingModeCeiling = 4;\r
+\r
 const char* FPRoundingModeString(int mode)\r
 {\r
     switch (mode) {\r
-    case FPRoundRTE:   return "RTE";\r
-    case FPRoundRTZ:   return "RTZ";\r
-    case FPRoundRTP:   return "RTP";\r
-    case FPRoundRTN:   return "RTN";\r
+    case 0:  return "RTE";\r
+    case 1:  return "RTZ";\r
+    case 2:  return "RTP";\r
+    case 3:  return "RTN";\r
 \r
-    default:           return "BadFPRoundingMode";\r
+    case FPRoundingModeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int LinkageTypeCeiling = 2;\r
 \r
 const char* LinkageTypeString(int type)\r
 {\r
     switch (type) {\r
-    case LinkageExport:   return "Export";\r
-    case LinkageImport:    return "Import";\r
+    case 0:  return "Export";\r
+    case 1:  return "Import";\r
 \r
-    default:        return "BadLinkageType";\r
+    case LinkageTypeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int FuncParamAttrCeiling = 9;\r
+\r
 const char* FuncParamAttrString(int attr)\r
 {\r
     switch (attr) {\r
-    case FuncParamAttrZext:         return "Zext";\r
-    case FuncParamAttrSext:         return "Sext";\r
-    case FuncParamAttrByval:        return "ByVal";\r
-    case FuncParamAttrSret:         return "Sret";\r
-    case FuncParamAttrNoAlias:      return "NoAlias";\r
-    case FuncParamAttrNoCapture:    return "NoCapture";\r
-    case FuncParamAttrSVM:          return "SVM";\r
-    case FuncParamAttrNoWrite:      return "NoWrite";\r
-    case FuncParamAttrNoReadWrite:  return "NoReadWrite";\r
-\r
-    default:                     return "BadFunctionParameterAttribute";\r
+    case 0:  return "Zext";\r
+    case 1:  return "Sext";\r
+    case 2:  return "ByVal";\r
+    case 3:  return "Sret";\r
+    case 4:  return "NoAlias";\r
+    case 5:  return "NoCapture";\r
+    case 6:  return "SVM";\r
+    case 7:  return "NoWrite";\r
+    case 8:  return "NoReadWrite";\r
+\r
+    case FuncParamAttrCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int AccessQualifierCeiling = 3;\r
+\r
 const char* AccessQualifierString(int attr)\r
 {\r
     switch (attr) {\r
-    case AccessQualReadOnly:   return "ReadOnly";\r
-    case AccessQualWriteOnly:  return "WriteOnly";\r
-    case AccessQualReadWrite:  return "ReadWrite";\r
+    case 0:  return "ReadOnly";\r
+    case 1:  return "WriteOnly";\r
+    case 2:  return "ReadWrite";\r
 \r
-    default:                   return "BadAccessQualifier";\r
+    case AccessQualifierCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int SelectControlCeiling = 2;\r
+\r
 const char* SelectControlString(int cont)\r
 {\r
     switch (cont) {\r
-    case SelectControlNone:        return "NoControl";\r
-    case SelectControlFlatten:     return "Flatten";\r
-    case SelectControlDontFlatten: return "DontFlatten";\r
+    case 0:  return "Flatten";\r
+    case 1:  return "DontFlatten";\r
 \r
-    default:                       return "BadSelectControl";\r
+    case SelectControlCeiling:\r
+    default:                       return "Bad";\r
     }\r
 }\r
 \r
-const char* FunctionControlString(int cont)\r
+const int LoopControlCeiling = 2;\r
+\r
+const char* LoopControlString(int cont)\r
 {\r
     switch (cont) {\r
-    case FunctionControlNone:        return "NoControl";\r
-    case FunctionControlInline:      return "InLine";\r
-    case FunctionControlDontInline:  return "DontInline";\r
-    case FunctionControlPure:        return "Pure";\r
-    case FunctionControlConst:       return "Const";\r
+    case 0: return "Unroll";\r
+    case 1: return "DontUnroll";\r
 \r
-    default:                         return "Bad-select-control";\r
+    case LoopControlCeiling:\r
+    default:     return "Bad";\r
     }\r
 }\r
 \r
-const char* LoopControlString(int cont)\r
+const int FunctionControlCeiling = 4;\r
+\r
+const char* FunctionControlString(int cont)\r
 {\r
     switch (cont) {\r
-    case LoopControlNone:       return "NoControl";\r
-    case LoopControlUnroll:     return "Unroll";\r
-    case LoopControlDontUnroll: return "DontUnroll";\r
+    case 0:  return "Inline";\r
+    case 1:  return "DontInline";\r
+    case 2:  return "Pure";\r
+    case 3:  return "Const";\r
 \r
-    default:                    return "Bad-loop-control";\r
+    case FunctionControlCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int MemorySemanticsCeiling = 10;\r
+\r
 const char* MemorySemanticsString(int mem)\r
 {\r
     switch (mem) {\r
-    case MemorySemanticsRelaxed:                return "Relaxed";\r
-    case MemorySemanticsSequentiallyConsistent: return "Sequentially-Consistent";\r
-    case MemorySemanticsAcquire:                return "Acquire";\r
-    case MemorySemanticsRelease:                return "Release";\r
-\r
-    case MemorySemanticsUniform:                return "Uniform-memory";\r
-    case MemorySemanticsSubgroup:               return "Subgroup-memory";\r
-    case MemorySemanticsWorkgroupLocal:         return "Workgroup-local-memory";\r
-    case MemorySemanticsWorkgroupGlobal:        return "Workgroup-global-memory";\r
-    case MemorySemanticsAtomicCounter:          return "Atomic-counter-memory";\r
-    case MemorySemanticsImage:                  return "Image-memory";\r
-\r
-    default:                                    return "Bad-memory-semantic";\r
+    case 0: return "Relaxed";\r
+    case 1: return "SequentiallyConsistent";\r
+    case 2: return "Acquire";\r
+    case 3: return "Release";\r
+\r
+    case 4: return "UniformMemory";\r
+    case 5: return "SubgroupMemory";\r
+    case 6: return "WorkgroupLocalMemory";\r
+    case 7: return "WorkgroupGlobalMemory";\r
+    case 8: return "AtomicCounterMemory";\r
+    case 9: return "ImageMemory";\r
+\r
+    case MemorySemanticsCeiling:\r
+    default:     return "Bad";\r
     }\r
 }\r
 \r
+const int MemoryAccessCeiling = 2;\r
+\r
 const char* MemoryAccessString(int mem)\r
 {\r
     switch (mem) {\r
-    case MemoryAccessVolatile:               return "Volatile";\r
-    case MemoryAccessAligned:                return "Aligned";\r
+    case 0:  return "Volatile";\r
+    case 1:  return "Aligned";\r
 \r
-    default:                                 return "Bad-memory-access";\r
+    case MemoryAccessCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
+const int ExecutionScopeCeiling = 4;\r
+\r
 const char* ExecutionScopeString(int mem)\r
 {\r
     switch (mem) {\r
-    case ExecutionScopeCrossDevice:             return "CrossDevice";\r
-    case ExecutionScopeDevice:                  return "Device";\r
-    case ExecutionScopeWorkgroup:               return "Workgroup";\r
-    case ExecutionScopeSubgroup:                return "Subgroup";\r
+    case 0:  return "CrossDevice";\r
+    case 1:  return "Device";\r
+    case 2:  return "Workgroup";\r
+    case 3:  return "Subgroup";\r
 \r
-    default:                                    return "Bad-execution-scope";\r
+    case ExecutionScopeCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
-const char* GroupOperationString(int gop) {\r
+const int GroupOperationCeiling = 3;\r
+\r
+const char* GroupOperationString(int gop)\r
+{\r
 \r
     switch (gop)\r
     {\r
-    case GroupOpReduce:             return "Reduce";\r
-    case GroupOpInclusiveScan:      return "InclusiveScan";\r
-    case GroupOpExclusiveScan:      return "ExclusiveScan";\r
+    case 0:  return "Reduce";\r
+    case 1:  return "InclusiveScan";\r
+    case 2:  return "ExclusiveScan";\r
 \r
-    default:                        return "Bad-execution-scope";\r
+    case GroupOperationCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
-const char* KernelEnqueueFlagsString(int flag) {\r
+const int KernelEnqueueFlagsCeiling = 3;\r
+\r
+const char* KernelEnqueueFlagsString(int flag)\r
+{\r
     switch (flag)\r
     {\r
-    case spv::EnqFlagNoWait:            return "NoWait";\r
-    case spv::EnqFlagWaitKernel:        return "WaitKernel";\r
-    case spv::EnqFlagWaitWaitWorgGroup: return "WaitWorkGroup";\r
+    case 0:  return "NoWait";\r
+    case 1:  return "WaitKernel";\r
+    case 2:  return "WaitWorkGroup";\r
 \r
-    default:                              return "Bad-enqueue-flag";\r
+    case KernelEnqueueFlagsCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
-const char* KernelProfilingInfoString(int info) {\r
+const int KernelProfilingInfoCeiling = 1;\r
+\r
+const char* KernelProfilingInfoString(int info)\r
+{\r
     switch (info)\r
     {\r
-    case spv::ProfInfoCmdExecTime: return "CmdExecTime";\r
-    default:                         return "Bad-profiling-info";\r
+    case 0:  return "CmdExecTime";\r
+\r
+    case KernelProfilingInfoCeiling:\r
+    default: return "Bad";\r
     }\r
 }\r
 \r
-const char* GetOperandDesc(OperandClass operand)\r
+const char* OpcodeString(int op)\r
 {\r
-    switch (operand) {\r
-    case OperandId:                    return "<id>";\r
-    case OperandOptionalId:            return "Optional <id>";\r
-    case OperandVariableIds:           return "<id>, <id>, ...";\r
-    case OperandVariableLiterals:      return "literal, literal, ...";\r
-    case OperandVariableLiteralId:     return "literal, label <id>, +\nliteral, label <id>, +\n...";\r
-    case OperandLiteralNumber:         return "Literal Number";\r
-    case OperandLiteralString:         return "Literal String";\r
-    case OperandSource:                return "Source Language";\r
-    case OperandExecutionModel:        return "Execution Model";\r
-    case OperandAddressing:            return "Addressing Model";\r
-    case OperandMemory:                return "Memory Model";\r
-    case OperandExecutionMode:         return "Execution Mode";\r
-    case OperandStorage:               return "Storage Class";\r
-    case OperandDimensionality:        return "Dim";\r
-    case OperandDecoration:            return "Decoration";\r
-    case OperandBuiltIn:               return "Built-In";\r
-    case OperandSelect:                return "Selection Control";\r
-    case OperandLoop:                  return "Loop Control";\r
-    case OperandFunction:              return "Function Control Mask";\r
-    case OperandSamplerAddressingMode: return "Sampler Addressing Mode";\r
-    case OperandSamplerFilterMode:     return "Sampler Filter Mode";\r
-    case OperandFPFastMath:            return "FP Fast Math Mode";\r
-    case OperandFPRoundingMode:        return "FP Rounding Mode";\r
-    case OperandLinkageType:           return "Linkage Type";\r
-    case OperandFuncParamAttr:         return "Function Parameter Attribute";\r
-    case OperandAccessQualifier:       return "Access Qualifier";\r
-    case OperandMemorySemantics:       return "Memory Semantics";\r
-    case OperandMemoryAccess:          return "Memory Access";\r
-    case OperandExecutionScope:        return "Execution Scope";\r
-    case OperandGroupOperation:        return "Group Operation";\r
-    case OperandKernelEnqueueFlags:    return "Kernel Enqueue Flags";\r
-    case OperandKernelProfilingInfo:   return "Kernel Profiling Info";\r
-    default:                           return "Unknown";\r
+    switch (op) {\r
+    case 0:   return "OpNop";\r
+    case 1:   return "OpSource";\r
+    case 2:   return "OpSourceExtension";\r
+    case 3:   return "OpExtension";\r
+    case 4:   return "OpExtInstImport";\r
+    case 5:   return "OpMemoryModel";\r
+    case 6:   return "OpEntryPoint";\r
+    case 7:   return "OpExecutionMode";\r
+    case 8:   return "OpTypeVoid";\r
+    case 9:   return "OpTypeBool";\r
+    case 10:  return "OpTypeInt";\r
+    case 11:  return "OpTypeFloat";\r
+    case 12:  return "OpTypeVector";\r
+    case 13:  return "OpTypeMatrix";\r
+    case 14:  return "OpTypeSampler";\r
+    case 15:  return "OpTypeFilter";\r
+    case 16:  return "OpTypeArray";\r
+    case 17:  return "OpTypeRuntimeArray";\r
+    case 18:  return "OpTypeStruct";\r
+    case 19:  return "OpTypeOpaque";\r
+    case 20:  return "OpTypePointer";\r
+    case 21:  return "OpTypeFunction";\r
+    case 22:  return "OpTypeEvent";\r
+    case 23:  return "OpTypeDeviceEvent";\r
+    case 24:  return "OpTypeReserveId";\r
+    case 25:  return "OpTypeQueue";\r
+    case 26:  return "OpTypePipe";\r
+    case 27:  return "OpConstantTrue";\r
+    case 28:  return "OpConstantFalse";\r
+    case 29:  return "OpConstant";\r
+    case 30:  return "OpConstantComposite";\r
+    case 31:  return "OpConstantSampler";\r
+    case 32:  return "OpConstantNullPointer";\r
+    case 33:  return "OpConstantNullObject";\r
+    case 34:  return "OpSpecConstantTrue";\r
+    case 35:  return "OpSpecConstantFalse";\r
+    case 36:  return "OpSpecConstant";\r
+    case 37:  return "OpSpecConstantComposite";\r
+    case 38:  return "OpVariable";\r
+    case 39:  return "OpVariableArray";\r
+    case 40:  return "OpFunction";\r
+    case 41:  return "OpFunctionParameter";\r
+    case 42:  return "OpFunctionEnd";\r
+    case 43:  return "OpFunctionCall";\r
+    case 44:  return "OpExtInst";\r
+    case 45:  return "OpUndef";\r
+    case 46:  return "OpLoad";\r
+    case 47:  return "OpStore";\r
+    case 48:  return "OpPhi";\r
+    case 49:  return "OpDecorationGroup";\r
+    case 50:  return "OpDecorate";\r
+    case 51:  return "OpMemberDecorate";\r
+    case 52:  return "OpGroupDecorate";\r
+    case 53:  return "OpGroupMemberDecorate";\r
+    case 54:  return "OpName";\r
+    case 55:  return "OpMemberName";\r
+    case 56:  return "OpString";\r
+    case 57:  return "OpLine";\r
+    case 58:  return "OpVectorExtractDynamic";\r
+    case 59:  return "OpVectorInsertDynamic";\r
+    case 60:  return "OpVectorShuffle";\r
+    case 61:  return "OpCompositeConstruct";\r
+    case 62:  return "OpCompositeExtract";\r
+    case 63:  return "OpCompositeInsert";\r
+    case 64:  return "OpCopyObject";\r
+    case 65:  return "OpCopyMemory";\r
+    case 66:  return "OpCopyMemorySized";\r
+    case 67:  return "OpSampler";\r
+    case 68:  return "OpTextureSample";\r
+    case 69:  return "OpTextureSampleDref";\r
+    case 70:  return "OpTextureSampleLod";\r
+    case 71:  return "OpTextureSampleProj";\r
+    case 72:  return "OpTextureSampleGrad";\r
+    case 73:  return "OpTextureSampleOffset";\r
+    case 74:  return "OpTextureSampleProjLod";\r
+    case 75:  return "OpTextureSampleProjGrad";\r
+    case 76:  return "OpTextureSampleLodOffset";\r
+    case 77:  return "OpTextureSampleProjOffset";\r
+    case 78:  return "OpTextureSampleGradOffset";\r
+    case 79:  return "OpTextureSampleProjLodOffset";\r
+    case 80:  return "OpTextureSampleProjGradOffset";\r
+    case 81:  return "OpTextureFetchTexelLod";\r
+    case 82:  return "OpTextureFetchTexelOffset";\r
+    case 83:  return "OpTextureFetchSample";\r
+    case 84:  return "OpTextureFetchTexel";\r
+    case 85:  return "OpTextureGather";\r
+    case 86:  return "OpTextureGatherOffset";\r
+    case 87:  return "OpTextureGatherOffsets";\r
+    case 88:  return "OpTextureQuerySizeLod";\r
+    case 89:  return "OpTextureQuerySize";\r
+    case 90:  return "OpTextureQueryLod";\r
+    case 91:  return "OpTextureQueryLevels";\r
+    case 92:  return "OpTextureQuerySamples";\r
+    case 93:  return "OpAccessChain";\r
+    case 94:  return "OpInBoundsAccessChain";\r
+    case 95:  return "OpSNegate";\r
+    case 96:  return "OpFNegate";\r
+    case 97:  return "OpNot";\r
+    case 98:  return "OpAny";\r
+    case 99:  return "OpAll";\r
+    case 100: return "OpConvertFToU";\r
+    case 101: return "OpConvertFToS";\r
+    case 102: return "OpConvertSToF";\r
+    case 103: return "OpConvertUToF";\r
+    case 104: return "OpUConvert";\r
+    case 105: return "OpSConvert";\r
+    case 106: return "OpFConvert";\r
+    case 107: return "OpConvertPtrToU";\r
+    case 108: return "OpConvertUToPtr";\r
+    case 109: return "OpPtrCastToGeneric";\r
+    case 110: return "OpGenericCastToPtr";\r
+    case 111: return "OpBitcast";\r
+    case 112: return "OpTranspose";\r
+    case 113: return "OpIsNan";\r
+    case 114: return "OpIsInf";\r
+    case 115: return "OpIsFinite";\r
+    case 116: return "OpIsNormal";\r
+    case 117: return "OpSignBitSet";\r
+    case 118: return "OpLessOrGreater";\r
+    case 119: return "OpOrdered";\r
+    case 120: return "OpUnordered";\r
+    case 121: return "OpArrayLength";\r
+    case 122: return "OpIAdd";\r
+    case 123: return "OpFAdd";\r
+    case 124: return "OpISub";\r
+    case 125: return "OpFSub";\r
+    case 126: return "OpIMul";\r
+    case 127: return "OpFMul";\r
+    case 128: return "OpUDiv";\r
+    case 129: return "OpSDiv";\r
+    case 130: return "OpFDiv";\r
+    case 131: return "OpUMod";\r
+    case 132: return "OpSRem";\r
+    case 133: return "OpSMod";\r
+    case 134: return "OpFRem";\r
+    case 135: return "OpFMod";\r
+    case 136: return "OpVectorTimesScalar";\r
+    case 137: return "OpMatrixTimesScalar";\r
+    case 138: return "OpVectorTimesMatrix";\r
+    case 139: return "OpMatrixTimesVector";\r
+    case 140: return "OpMatrixTimesMatrix";\r
+    case 141: return "OpOuterProduct";\r
+    case 142: return "OpDot";\r
+    case 143: return "OpShiftRightLogical";\r
+    case 144: return "OpShiftRightArithmetic";\r
+    case 145: return "OpShiftLeftLogical";\r
+    case 146: return "OpLogicalOr";\r
+    case 147: return "OpLogicalXor";\r
+    case 148: return "OpLogicalAnd";\r
+    case 149: return "OpBitwiseOr";\r
+    case 150: return "OpBitwiseXor";\r
+    case 151: return "OpBitwiseAnd";\r
+    case 152: return "OpSelect";\r
+    case 153: return "OpIEqual";\r
+    case 154: return "OpFOrdEqual";\r
+    case 155: return "OpFUnordEqual";\r
+    case 156: return "OpINotEqual";\r
+    case 157: return "OpFOrdNotEqual";\r
+    case 158: return "OpFUnordNotEqual";\r
+    case 159: return "OpULessThan";\r
+    case 160: return "OpSLessThan";\r
+    case 161: return "OpFOrdLessThan";\r
+    case 162: return "OpFUnordLessThan";\r
+    case 163: return "OpUGreaterThan";\r
+    case 164: return "OpSGreaterThan";\r
+    case 165: return "OpFOrdGreaterThan";\r
+    case 166: return "OpFUnordGreaterThan";\r
+    case 167: return "OpULessThanEqual";\r
+    case 168: return "OpSLessThanEqual";\r
+    case 169: return "OpFOrdLessThanEqual";\r
+    case 170: return "OpFUnordLessThanEqual";\r
+    case 171: return "OpUGreaterThanEqual";\r
+    case 172: return "OpSGreaterThanEqual";\r
+    case 173: return "OpFOrdGreaterThanEqual";\r
+    case 174: return "OpFUnordGreaterThanEqual";\r
+    case 175: return "OpDPdx";\r
+    case 176: return "OpDPdy";\r
+    case 177: return "OpFwidth";\r
+    case 178: return "OpDPdxFine";\r
+    case 179: return "OpDPdyFine";\r
+    case 180: return "OpFwidthFine";\r
+    case 181: return "OpDPdxCoarse";\r
+    case 182: return "OpDPdyCoarse";\r
+    case 183: return "OpFwidthCoarse";\r
+    case 184: return "OpEmitVertex";\r
+    case 185: return "OpEndPrimitive";\r
+    case 186: return "OpEmitStreamVertex";\r
+    case 187: return "OpEndStreamPrimitive";\r
+    case 188: return "OpControlBarrier";\r
+    case 189: return "OpMemoryBarrier";\r
+    case 190: return "OpImagePointer";\r
+    case 191: return "OpAtomicInit";\r
+    case 192: return "OpAtomicLoad";\r
+    case 193: return "OpAtomicStore";\r
+    case 194: return "OpAtomicExchange";\r
+    case 195: return "OpAtomicCompareExchange";\r
+    case 196: return "OpAtomicCompareExchangeWeak";\r
+    case 197: return "OpAtomicIIncrement";\r
+    case 198: return "OpAtomicIDecrement";\r
+    case 199: return "OpAtomicIAdd";\r
+    case 200: return "OpAtomicISub";\r
+    case 201: return "OpAtomicUMin";\r
+    case 202: return "OpAtomicUMax";\r
+    case 203: return "OpAtomicAnd";\r
+    case 204: return "OpAtomicOr";\r
+    case 205: return "OpAtomicXor";\r
+    case 206: return "OpLoopMerge";\r
+    case 207: return "OpSelectionMerge";\r
+    case 208: return "OpLabel";\r
+    case 209: return "OpBranch";\r
+    case 210: return "OpBranchConditional";\r
+    case 211: return "OpSwitch";\r
+    case 212: return "OpKill";\r
+    case 213: return "OpReturn";\r
+    case 214: return "OpReturnValue";\r
+    case 215: return "OpUnreachable";\r
+    case 216: return "OpLifetimeStart";\r
+    case 217: return "OpLifetimeStop";\r
+    case 218: return "OpCompileFlag";\r
+    case 219: return "OpAsyncGroupCopy";\r
+    case 220: return "OpWaitGroupEvents";\r
+    case 221: return "OpGroupAll";\r
+    case 222: return "OpGroupAny";\r
+    case 223: return "OpGroupBroadcast";\r
+    case 224: return "OpGroupIAdd";\r
+    case 225: return "OpGroupFAdd";\r
+    case 226: return "OpGroupFMin";\r
+    case 227: return "OpGroupUMin";\r
+    case 228: return "OpGroupSMin";\r
+    case 229: return "OpGroupFMax";\r
+    case 230: return "OpGroupUMax";\r
+    case 231: return "OpGroupSMax";\r
+    case 232: return "OpGenericCastToPtrExplicit";\r
+    case 233: return "OpGenericPtrMemSemantics";\r
+    case 234: return "OpReadPipe";\r
+    case 235: return "OpWritePipe";\r
+    case 236: return "OpReservedReadPipe";\r
+    case 237: return "OpReservedWritePipe";\r
+    case 238: return "OpReserveReadPipePackets";\r
+    case 239: return "OpReserveWritePipePackets";\r
+    case 240: return "OpCommitReadPipe";\r
+    case 241: return "OpCommitWritePipe";\r
+    case 242: return "OpIsValidReserveId";\r
+    case 243: return "OpGetNumPipePackets";\r
+    case 244: return "OpGetMaxPipePackets";\r
+    case 245: return "OpGroupReserveReadPipePackets";\r
+    case 246: return "OpGroupReserveWritePipePackets";\r
+    case 247: return "OpGroupCommitReadPipe";\r
+    case 248: return "OpGroupCommitWritePipe";\r
+    case 249: return "OpEnqueueMarker";\r
+    case 250: return "OpEnqueueKernel";\r
+    case 251: return "OpGetKernelNDrangeSubGroupCount";\r
+    case 252: return "OpGetKernelNDrangeMaxSubGroupSize";\r
+    case 253: return "OpGetKernelWorkGroupSize";\r
+    case 254: return "OpGetKernelPreferredWorkGroupSizeMultiple";\r
+    case 255: return "OpRetainEvent";\r
+    case 256: return "OpReleaseEvent";\r
+    case 257: return "OpCreateUserEvent";\r
+    case 258: return "OpIsValidEvent";\r
+    case 259: return "OpSetUserEventStatus";\r
+    case 260: return "OpCaptureEventProfilingInfo";\r
+    case 261: return "OpGetDefaultQueue";\r
+    case 262: return "OpBuildNDRange";\r
+    case 263: return "OpSatConvertSToU";\r
+    case 264: return "OpSatConvertUToS";\r
+    case 265: return "OpAtomicIMin";\r
+    case 266: return "OpAtomicIMax";\r
+\r
+    case OpcodeCeiling:\r
+    default:\r
+        return "Bad";\r
     }\r
 }\r
 \r
+// The set of objects that hold all the instruction/operand\r
+// parameterization information.\r
+InstructionParameters InstructionDesc[OpcodeCeiling];\r
+OperandParameters ExecutionModeOperands[ExecutionModeCeiling];\r
+OperandParameters DecorationOperands[DecorationCeiling];\r
+\r
+EnumDefinition OperandClassParams[OperandCount];\r
+EnumParameters ExecutionModelParams[ExecutionModelCeiling];\r
+EnumParameters AddressingParams[AddressingModelCeiling];\r
+EnumParameters MemoryParams[MemoryModelCeiling];\r
+EnumParameters ExecutionModeParams[ExecutionModeCeiling];\r
+EnumParameters StorageParams[StorageClassCeiling];\r
+EnumParameters SamplerAddressingModeParams[SamplerAddressingModeCeiling];\r
+EnumParameters SamplerFilterModeParams[SamplerFilterModeCeiling];\r
+EnumParameters FPFastMathParams[FPFastMathCeiling];\r
+EnumParameters FPRoundingModeParams[FPRoundingModeCeiling];\r
+EnumParameters LinkageTypeParams[LinkageTypeCeiling];\r
+EnumParameters DecorationParams[DecorationCeiling];\r
+EnumParameters BuiltInParams[BuiltInCeiling];\r
+EnumParameters DimensionalityParams[DimensionCeiling];\r
+EnumParameters FuncParamAttrParams[FuncParamAttrCeiling];\r
+EnumParameters AccessQualifierParams[AccessQualifierCeiling];\r
+EnumParameters GroupOperationParams[GroupOperationCeiling];\r
+EnumParameters LoopControlParams[FunctionControlCeiling];\r
+EnumParameters SelectionControlParams[SelectControlCeiling];\r
+EnumParameters FunctionControlParams[FunctionControlCeiling];\r
+EnumParameters MemorySemanticsParams[MemorySemanticsCeiling];\r
+EnumParameters MemoryAccessParams[MemoryAccessCeiling];\r
+EnumParameters ExecutionScopeParams[ExecutionScopeCeiling];\r
+EnumParameters KernelEnqueueFlagsParams[KernelEnqueueFlagsCeiling];\r
+EnumParameters KernelProfilingInfoParams[KernelProfilingInfoCeiling];\r
+\r
+// Set up all the parameterizing descriptions of the opcodes, operands, etc.\r
+void Parameterize()\r
+{\r
+    // Exceptions to having a result <id> and a resulting type <id>.\r
+    // (Everything is initialized to have both).\r
+\r
+    InstructionDesc[OpNop].setResultAndType(false, false);\r
+    InstructionDesc[OpSource].setResultAndType(false, false);\r
+    InstructionDesc[OpSourceExtension].setResultAndType(false, false);\r
+    InstructionDesc[OpExtension].setResultAndType(false, false);\r
+    InstructionDesc[OpExtInstImport].setResultAndType(true, false);\r
+    InstructionDesc[OpMemoryModel].setResultAndType(false, false);\r
+    InstructionDesc[OpEntryPoint].setResultAndType(false, false);\r
+    InstructionDesc[OpExecutionMode].setResultAndType(false, false);\r
+    InstructionDesc[OpTypeVoid].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeBool].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeInt].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeFloat].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeVector].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeMatrix].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeSampler].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeFilter].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeArray].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeRuntimeArray].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeStruct].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeOpaque].setResultAndType(true, false);\r
+    InstructionDesc[OpTypePointer].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeFunction].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeEvent].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeDeviceEvent].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeReserveId].setResultAndType(true, false);\r
+    InstructionDesc[OpTypeQueue].setResultAndType(true, false);\r
+    InstructionDesc[OpTypePipe].setResultAndType(true, false);\r
+    InstructionDesc[OpFunctionEnd].setResultAndType(false, false);\r
+    InstructionDesc[OpStore].setResultAndType(false, false);\r
+    InstructionDesc[OpDecorationGroup].setResultAndType(true, false);\r
+    InstructionDesc[OpDecorate].setResultAndType(false, false);\r
+    InstructionDesc[OpMemberDecorate].setResultAndType(false, false);\r
+    InstructionDesc[OpGroupDecorate].setResultAndType(false, false);\r
+    InstructionDesc[OpGroupMemberDecorate].setResultAndType(false, false);\r
+    InstructionDesc[OpName].setResultAndType(false, false);\r
+    InstructionDesc[OpMemberName].setResultAndType(false, false);\r
+    InstructionDesc[OpString].setResultAndType(true, false);\r
+    InstructionDesc[OpLine].setResultAndType(false, false);\r
+    InstructionDesc[OpCopyMemory].setResultAndType(false, false);\r
+    InstructionDesc[OpCopyMemorySized].setResultAndType(false, false);\r
+    InstructionDesc[OpEmitVertex].setResultAndType(false, false);\r
+    InstructionDesc[OpEndPrimitive].setResultAndType(false, false);\r
+    InstructionDesc[OpEmitStreamVertex].setResultAndType(false, false);\r
+    InstructionDesc[OpEndStreamPrimitive].setResultAndType(false, false);\r
+    InstructionDesc[OpControlBarrier].setResultAndType(false, false);\r
+    InstructionDesc[OpMemoryBarrier].setResultAndType(false, false);\r
+    InstructionDesc[OpAtomicInit].setResultAndType(false, false);\r
+    InstructionDesc[OpAtomicStore].setResultAndType(false, false);\r
+    InstructionDesc[OpLoopMerge].setResultAndType(false, false);\r
+    InstructionDesc[OpSelectionMerge].setResultAndType(false, false);\r
+    InstructionDesc[OpLabel].setResultAndType(true, false);\r
+    InstructionDesc[OpBranch].setResultAndType(false, false);\r
+    InstructionDesc[OpBranchConditional].setResultAndType(false, false);\r
+    InstructionDesc[OpSwitch].setResultAndType(false, false);\r
+    InstructionDesc[OpKill].setResultAndType(false, false);\r
+    InstructionDesc[OpReturn].setResultAndType(false, false);\r
+    InstructionDesc[OpReturnValue].setResultAndType(false, false);\r
+    InstructionDesc[OpUnreachable].setResultAndType(false, false);\r
+    InstructionDesc[OpLifetimeStart].setResultAndType(false, false);\r
+    InstructionDesc[OpLifetimeStop].setResultAndType(false, false);\r
+    InstructionDesc[OpCompileFlag].setResultAndType(false, false);\r
+    InstructionDesc[OpCommitReadPipe].setResultAndType(false, false);\r
+    InstructionDesc[OpCommitWritePipe].setResultAndType(false, false);\r
+    InstructionDesc[OpGroupCommitWritePipe].setResultAndType(false, false);\r
+    InstructionDesc[OpGroupCommitReadPipe].setResultAndType(false, false);\r
+    InstructionDesc[OpCaptureEventProfilingInfo].setResultAndType(false, false);\r
+    InstructionDesc[OpSetUserEventStatus].setResultAndType(false, false);\r
+    InstructionDesc[OpRetainEvent].setResultAndType(false, false);\r
+    InstructionDesc[OpReleaseEvent].setResultAndType(false, false);\r
+\r
+    // Specific additional context-dependent operands\r
+\r
+    ExecutionModeOperands[ExecutionModeInvocations].push(OperandLiteralNumber, "Number of invocations");\r
+\r
+    ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'x size'");\r
+    ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'y size'");\r
+    ExecutionModeOperands[ExecutionModeLocalSize].push(OperandLiteralNumber, "'z size'");\r
+\r
+    ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'x size'");\r
+    ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'y size'");\r
+    ExecutionModeOperands[ExecutionModeLocalSizeHint].push(OperandLiteralNumber, "'z size'");\r
+\r
+    ExecutionModeOperands[ExecutionModeOutputVertices].push(OperandLiteralNumber, "Vertex count");\r
+    ExecutionModeOperands[ExecutionModeVecTypeHint].push(OperandId, "Vector type");\r
+\r
+    DecorationOperands[DecorationStream].push(OperandLiteralNumber, "Stream number");\r
+    DecorationOperands[DecorationLocation].push(OperandLiteralNumber, "Location");\r
+    DecorationOperands[DecorationComponent].push(OperandLiteralNumber, "Component within a vector");\r
+    DecorationOperands[DecorationIndex].push(OperandLiteralNumber, "Index");\r
+    DecorationOperands[DecorationBinding].push(OperandLiteralNumber, "Binding point");\r
+    DecorationOperands[DecorationDescriptorSet].push(OperandLiteralNumber, "Descriptor set");\r
+    DecorationOperands[DecorationOffset].push(OperandLiteralNumber, "Byte offset");\r
+    DecorationOperands[DecorationAlignment].push(OperandLiteralNumber, "Declared alignment");\r
+    DecorationOperands[DecorationXfbBuffer].push(OperandLiteralNumber, "XFB Buffer number");\r
+    DecorationOperands[DecorationStride].push(OperandLiteralNumber, "Stride");\r
+    DecorationOperands[DecorationBuiltIn].push(OperandLiteralNumber, "See <<BuiltIn,*BuiltIn*>>");\r
+    DecorationOperands[DecorationFPRoundingMode].push(OperandFPRoundingMode, "floating-point rounding mode");\r
+    DecorationOperands[DecorationFPFastMathMode].push(OperandFPFastMath, "fast-math mode");\r
+    DecorationOperands[DecorationLinkageAttributes].push(OperandLiteralString, "name");\r
+    DecorationOperands[DecorationLinkageAttributes].push(OperandLinkageType, "linkage type");\r
+    DecorationOperands[DecorationFuncParamAttr].push(OperandFuncParamAttr, "function parameter attribute");\r
+    DecorationOperands[DecorationSpecId].push(OperandLiteralNumber, "Specialization Constant ID");\r
+\r
+    OperandClassParams[OperandSource].set(SourceLanguageCeiling, SourceString, 0);\r
+    OperandClassParams[OperandExecutionModel].set(ExecutionModelCeiling, ExecutionModelString, ExecutionModelParams);\r
+    OperandClassParams[OperandAddressing].set(AddressingModelCeiling, AddressingString, AddressingParams);\r
+    OperandClassParams[OperandMemory].set(MemoryModelCeiling, MemoryString, MemoryParams);\r
+    OperandClassParams[OperandExecutionMode].set(ExecutionModeCeiling, ExecutionModeString, ExecutionModeParams);\r
+    OperandClassParams[OperandExecutionMode].setOperands(ExecutionModeOperands);\r
+    OperandClassParams[OperandStorage].set(StorageClassCeiling, StorageClassString, StorageParams);\r
+    OperandClassParams[OperandDimensionality].set(DimensionCeiling, DimensionString, DimensionalityParams);\r
+    OperandClassParams[OperandSamplerAddressingMode].set(SamplerAddressingModeCeiling, SamplerAddressingModeString, SamplerAddressingModeParams);\r
+    OperandClassParams[OperandSamplerFilterMode].set(SamplerFilterModeCeiling, SamplerFilterModeString, SamplerFilterModeParams);\r
+    OperandClassParams[OperandFPFastMath].set(FPFastMathCeiling, FPFastMathString, FPFastMathParams, true);\r
+    OperandClassParams[OperandFPRoundingMode].set(FPRoundingModeCeiling, FPRoundingModeString, FPRoundingModeParams);\r
+    OperandClassParams[OperandLinkageType].set(LinkageTypeCeiling, LinkageTypeString, LinkageTypeParams);\r
+    OperandClassParams[OperandFuncParamAttr].set(FuncParamAttrCeiling, FuncParamAttrString, FuncParamAttrParams);\r
+    OperandClassParams[OperandAccessQualifier].set(AccessQualifierCeiling, AccessQualifierString, AccessQualifierParams);\r
+    OperandClassParams[OperandDecoration].set(DecorationCeiling, DecorationString, DecorationParams);\r
+    OperandClassParams[OperandDecoration].setOperands(DecorationOperands);\r
+    OperandClassParams[OperandBuiltIn].set(BuiltInCeiling, BuiltInString, BuiltInParams);\r
+    OperandClassParams[OperandSelect].set(SelectControlCeiling, SelectControlString, SelectionControlParams, true);\r
+    OperandClassParams[OperandLoop].set(LoopControlCeiling, LoopControlString, LoopControlParams, true);\r
+    OperandClassParams[OperandFunction].set(FunctionControlCeiling, FunctionControlString, FunctionControlParams, true);\r
+    OperandClassParams[OperandMemorySemantics].set(MemorySemanticsCeiling, MemorySemanticsString, MemorySemanticsParams, true);\r
+    OperandClassParams[OperandMemoryAccess].set(MemoryAccessCeiling, MemoryAccessString, MemoryAccessParams, true);\r
+    OperandClassParams[OperandExecutionScope].set(ExecutionScopeCeiling, ExecutionScopeString, ExecutionScopeParams);\r
+    OperandClassParams[OperandGroupOperation].set(GroupOperationCeiling, GroupOperationString, GroupOperationParams);\r
+    OperandClassParams[OperandKernelEnqueueFlags].set(KernelEnqueueFlagsCeiling, KernelEnqueueFlagsString, KernelEnqueueFlagsParams);\r
+    OperandClassParams[OperandKernelProfilingInfo].set(KernelProfilingInfoCeiling, KernelProfilingInfoString, KernelProfilingInfoParams, true);\r
+    OperandClassParams[OperandOpcode].set(OpcodeCeiling, OpcodeString, 0);\r
+\r
+    AddressingParams[AddressingModelPhysical32].caps.push_back(CapAddr);\r
+    AddressingParams[AddressingModelPhysical64].caps.push_back(CapAddr);\r
+\r
+    MemoryParams[MemoryModelSimple].caps.push_back(CapShader);\r
+    MemoryParams[MemoryModelGLSL450].caps.push_back(CapShader);\r
+    MemoryParams[MemoryModelOpenCL12].caps.push_back(CapKernel);\r
+    MemoryParams[MemoryModelOpenCL20].caps.push_back(CapKernel);\r
+    MemoryParams[MemoryModelOpenCL21].caps.push_back(CapKernel);\r
+\r
+    ExecutionModelParams[ExecutionModelVertex].caps.push_back(CapShader);\r
+    ExecutionModelParams[ExecutionModelTessellationControl].caps.push_back(CapTess);\r
+    ExecutionModelParams[ExecutionModelTessellationEvaluation].caps.push_back(CapTess);\r
+    ExecutionModelParams[ExecutionModelGeometry].caps.push_back(CapGeom);\r
+    ExecutionModelParams[ExecutionModelFragment].caps.push_back(CapShader);\r
+    ExecutionModelParams[ExecutionModelGLCompute].caps.push_back(CapShader);\r
+    ExecutionModelParams[ExecutionModelKernel].caps.push_back(CapKernel);\r
+\r
+    // Storage capabilites\r
+    StorageParams[StorageClassInput].caps.push_back(CapShader);\r
+    StorageParams[StorageClassUniform].caps.push_back(CapShader);\r
+    StorageParams[StorageClassOutput].caps.push_back(CapShader);\r
+    StorageParams[StorageClassPrivateGlobal].caps.push_back(CapShader);\r
+    StorageParams[StorageClassFunction].caps.push_back(CapShader);\r
+    StorageParams[StorageClassGeneric].caps.push_back(CapKernel);\r
+    StorageParams[StorageClassPrivate].caps.push_back(CapKernel);\r
+    StorageParams[StorageClassAtomicCounter].caps.push_back(CapShader);\r
+\r
+    // Sampler Filter & Addressing mode capabilities\r
+    SamplerAddressingModeParams[SamplerAddressingModeNone].caps.push_back(CapKernel);\r
+    SamplerAddressingModeParams[SamplerAddressingModeClampToEdge].caps.push_back(CapKernel);\r
+    SamplerAddressingModeParams[SamplerAddressingModeClamp].caps.push_back(CapKernel);\r
+    SamplerAddressingModeParams[SamplerAddressingModeRepeat].caps.push_back(CapKernel);\r
+    SamplerAddressingModeParams[SamplerAddressingModeRepeatMirrored].caps.push_back(CapKernel);\r
+\r
+    SamplerFilterModeParams[SamplerFilterModeNearest].caps.push_back(CapKernel);\r
+    SamplerFilterModeParams[SamplerFilterModeLinear].caps.push_back(CapKernel);\r
+\r
+    // fast math flags capabilities\r
+    for (int i = 0; i < FPFastMathCeiling; ++i) {\r
+        FPFastMathParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    // fp rounding mode capabilities\r
+    for (int i = 0; i < FPRoundingModeCeiling; ++i) {\r
+        FPRoundingModeParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    // linkage types\r
+    for (int i = 0; i < LinkageTypeCeiling; ++i) {\r
+        LinkageTypeParams[i].caps.push_back(CapLink);\r
+    }\r
+\r
+    // function argument types\r
+    for (int i = 0; i < FuncParamAttrCeiling; ++i) {\r
+        FuncParamAttrParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    // function argument types\r
+    for (int i = 0; i < AccessQualifierCeiling; ++i) {\r
+        AccessQualifierParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    ExecutionModeParams[ExecutionModeInvocations].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeSpacingEqual].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeSpacingFractionalEven].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeSpacingFractionalOdd].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeVertexOrderCw].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeVertexOrderCcw].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModePixelCenterInteger].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeOriginUpperLeft].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeEarlyFragmentTests].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModePointMode].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeXfb].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeDepthReplacing].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeDepthAny].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeDepthGreater].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeDepthLess].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeDepthUnchanged].caps.push_back(CapShader);\r
+    ExecutionModeParams[ExecutionModeLocalSizeHint].caps.push_back(CapKernel);\r
+    ExecutionModeParams[ExecutionModeInputPoints].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeInputLines].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeInputLinesAdjacency].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeInputTriangles].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeInputTriangles].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeInputTrianglesAdjacency].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeInputQuads].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeInputIsolines].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeOutputVertices].caps.push_back(CapTess);\r
+    ExecutionModeParams[ExecutionModeOutputPoints].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeOutputLineStrip].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeOutputTriangleStrip].caps.push_back(CapGeom);\r
+    ExecutionModeParams[ExecutionModeVecTypeHint].caps.push_back(CapKernel);\r
+    ExecutionModeParams[ExecutionModeContractionOff].caps.push_back(CapKernel);\r
+\r
+    DecorationParams[DecorationPrecisionLow].caps.push_back(CapShader);\r
+    DecorationParams[DecorationPrecisionMedium].caps.push_back(CapShader);\r
+    DecorationParams[DecorationPrecisionHigh].caps.push_back(CapShader);\r
+    DecorationParams[DecorationBlock].caps.push_back(CapShader);\r
+    DecorationParams[DecorationBufferBlock].caps.push_back(CapShader);\r
+    DecorationParams[DecorationRowMajor].caps.push_back(CapMatrix);\r
+    DecorationParams[DecorationColMajor].caps.push_back(CapMatrix);\r
+    DecorationParams[DecorationGLSLShared].caps.push_back(CapShader);\r
+    DecorationParams[DecorationGLSLStd140].caps.push_back(CapShader);\r
+    DecorationParams[DecorationGLSLStd430].caps.push_back(CapShader);\r
+    DecorationParams[DecorationGLSLPacked].caps.push_back(CapShader);\r
+    DecorationParams[DecorationSmooth].caps.push_back(CapShader);\r
+    DecorationParams[DecorationNoperspective].caps.push_back(CapShader);\r
+    DecorationParams[DecorationFlat].caps.push_back(CapShader);\r
+    DecorationParams[DecorationPatch].caps.push_back(CapTess);\r
+    DecorationParams[DecorationCentroid].caps.push_back(CapShader);\r
+    DecorationParams[DecorationSample].caps.push_back(CapShader);\r
+    DecorationParams[DecorationInvariant].caps.push_back(CapShader);\r
+    DecorationParams[DecorationConstant].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationUniform].caps.push_back(CapShader);\r
+    DecorationParams[DecorationCPacked].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationSaturatedConversion].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationStream].caps.push_back(CapGeom);\r
+    DecorationParams[DecorationLocation].caps.push_back(CapShader);\r
+    DecorationParams[DecorationComponent].caps.push_back(CapShader);\r
+    DecorationParams[DecorationIndex].caps.push_back(CapShader);\r
+    DecorationParams[DecorationBinding].caps.push_back(CapShader);\r
+    DecorationParams[DecorationDescriptorSet].caps.push_back(CapShader);\r
+    DecorationParams[DecorationXfbBuffer].caps.push_back(CapShader);\r
+    DecorationParams[DecorationStride].caps.push_back(CapShader);\r
+    DecorationParams[DecorationBuiltIn].caps.push_back(CapShader);\r
+    DecorationParams[DecorationFuncParamAttr].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationFPRoundingMode].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationFPFastMathMode].caps.push_back(CapKernel);\r
+    DecorationParams[DecorationLinkageAttributes].caps.push_back(CapLink);\r
+    DecorationParams[DecorationSpecId].caps.push_back(CapShader);\r
+\r
+    BuiltInParams[BuiltInPosition].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInPointSize].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInClipVertex].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInClipDistance].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInCullDistance].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInVertexId].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInInstanceId].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapGeom);\r
+    BuiltInParams[BuiltInPrimitiveId].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInInvocationId].caps.push_back(CapGeom);\r
+    BuiltInParams[BuiltInInvocationId].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInLayer].caps.push_back(CapGeom);\r
+    BuiltInParams[BuiltInViewportIndex].caps.push_back(CapGeom);\r
+    BuiltInParams[BuiltInTessLevelOuter].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInTessLevelInner].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInTessCoord].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInPatchVertices].caps.push_back(CapTess);\r
+    BuiltInParams[BuiltInFragCoord].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInPointCoord].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInFrontFacing].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInSampleId].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInSamplePosition].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInSampleMask].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInFragColor].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInFragDepth].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInHelperInvocation].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInLocalInvocationIndex].caps.push_back(CapShader);\r
+    BuiltInParams[BuiltInWorkDim].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInGlobalSize].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInEnqueuedWorkgroupSize].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInGlobalOffset].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInGlobalLinearId].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInWorkgroupLinearId].caps.push_back(CapKernel);\r
+\r
+    BuiltInParams[BuiltInSubgroupSize].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInSubgroupMaxSize].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInNumSubgroups].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInNumEnqueuedSubgroups].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInSubgroupId].caps.push_back(CapKernel);\r
+    BuiltInParams[BuiltInSubgroupLocalInvocationId].caps.push_back(CapKernel);\r
+\r
+    DimensionalityParams[DimCube].caps.push_back(CapShader);\r
+    DimensionalityParams[DimRect].caps.push_back(CapShader);\r
+\r
+    // Group Operations\r
+    for (int i = 0; i < GroupOperationCeiling; ++i) {\r
+        GroupOperationParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    // Enqueue flags\r
+    for (int i = 0; i < KernelEnqueueFlagsCeiling; ++i) {\r
+        KernelEnqueueFlagsParams[i].caps.push_back(CapKernel);\r
+    }\r
+\r
+    // Profiling info\r
+    KernelProfilingInfoParams[0].caps.push_back(CapKernel);\r
+\r
+    // set name of operator, an initial set of <id> style operands, and the description\r
+\r
+    InstructionDesc[OpSource].operands.push(OperandSource, "");\r
+    InstructionDesc[OpSource].operands.push(OperandLiteralNumber, "'Version'");\r
+\r
+    InstructionDesc[OpSourceExtension].operands.push(OperandLiteralString, "'Extension'");\r
+\r
+    InstructionDesc[OpName].operands.push(OperandId, "'Target'");\r
+    InstructionDesc[OpName].operands.push(OperandLiteralString, "'Name'");\r
+\r
+    InstructionDesc[OpMemberName].operands.push(OperandId, "'Type'");\r
+    InstructionDesc[OpMemberName].operands.push(OperandLiteralNumber, "'Member'");\r
+    InstructionDesc[OpMemberName].operands.push(OperandLiteralString, "'Name'");\r
+\r
+    InstructionDesc[OpString].operands.push(OperandLiteralString, "'String'");\r
+\r
+    InstructionDesc[OpLine].operands.push(OperandId, "'Target'");\r
+    InstructionDesc[OpLine].operands.push(OperandId, "'File'");\r
+    InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Line'");\r
+    InstructionDesc[OpLine].operands.push(OperandLiteralNumber, "'Column'");\r
+\r
+    InstructionDesc[OpExtension].operands.push(OperandLiteralString, "'Name'");\r
+\r
+    InstructionDesc[OpExtInstImport].operands.push(OperandLiteralString, "'Name'");\r
+\r
+    InstructionDesc[OpMemoryModel].operands.push(OperandAddressing, "");\r
+    InstructionDesc[OpMemoryModel].operands.push(OperandMemory, "");\r
+\r
+    InstructionDesc[OpEntryPoint].operands.push(OperandExecutionModel, "");\r
+    InstructionDesc[OpEntryPoint].operands.push(OperandId, "'Entry Point'");\r
+\r
+    InstructionDesc[OpExecutionMode].operands.push(OperandId, "'Entry Point'");\r
+    InstructionDesc[OpExecutionMode].operands.push(OperandExecutionMode, "'Mode'");\r
+    InstructionDesc[OpExecutionMode].operands.push(OperandVariableLiterals, "See <<Execution Mode,Execution Mode>>");\r
+\r
+    InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Width'");\r
+    InstructionDesc[OpTypeInt].operands.push(OperandLiteralNumber, "'Signedness'");\r
+\r
+    InstructionDesc[OpTypeFloat].operands.push(OperandLiteralNumber, "'Width'");\r
+\r
+    InstructionDesc[OpTypeVector].operands.push(OperandId, "'Component type'");\r
+    InstructionDesc[OpTypeVector].operands.push(OperandLiteralNumber, "'Component count'");\r
+\r
+    InstructionDesc[OpTypeMatrix].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpTypeMatrix].operands.push(OperandId, "'Column type'");\r
+    InstructionDesc[OpTypeMatrix].operands.push(OperandLiteralNumber, "'Column count'");\r
+\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandId, "'Sampled Type'");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandDimensionality, "");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber, "'Content'");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber, "'Arrayed'");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber, "'Compare'");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandLiteralNumber, "'MS'");\r
+    InstructionDesc[OpTypeSampler].operands.push(OperandOptionalId, "'Qualifier'");\r
+\r
+    InstructionDesc[OpTypeArray].operands.push(OperandId, "'Element type'");\r
+    InstructionDesc[OpTypeArray].operands.push(OperandId, "'Length'");\r
+\r
+    InstructionDesc[OpTypeRuntimeArray].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpTypeRuntimeArray].operands.push(OperandId, "'Element type'");\r
+\r
+    InstructionDesc[OpTypeStruct].operands.push(OperandVariableIds, "'Member 0 type', +\n'member 1 type', +\n...");\r
+\r
+    InstructionDesc[OpTypeOpaque].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpTypeOpaque].operands.push(OperandLiteralString, "The name of the opaque type.");\r
+\r
+    InstructionDesc[OpTypePointer].operands.push(OperandStorage, "");\r
+    InstructionDesc[OpTypePointer].operands.push(OperandId, "'Type'");\r
+\r
+    InstructionDesc[OpTypeEvent].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpTypeDeviceEvent].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpTypeReserveId].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpTypeQueue].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpTypePipe].operands.push(OperandId, "'Type'");\r
+    InstructionDesc[OpTypePipe].operands.push(OperandAccessQualifier, "'Qualifier'");\r
+    InstructionDesc[OpTypePipe].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpTypeFunction].operands.push(OperandId, "'Return Type'");\r
+    InstructionDesc[OpTypeFunction].operands.push(OperandVariableIds, "'Parameter 0 Type', +\n'Parameter 1 Type', +\n...");\r
+\r
+    InstructionDesc[OpConstant].operands.push(OperandVariableLiterals, "'Value'");\r
+\r
+    InstructionDesc[OpConstantComposite].operands.push(OperandVariableIds, "'Constituents'");\r
+\r
+    InstructionDesc[OpConstantNullPointer].capabilities.push_back(CapAddr);\r
+\r
+    InstructionDesc[OpConstantNullObject].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpConstantSampler].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Mode'");\r
+    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Param'");\r
+    InstructionDesc[OpConstantSampler].operands.push(OperandLiteralNumber, "'Filter'");\r
+\r
+    InstructionDesc[OpSpecConstantTrue].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpSpecConstantFalse].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpSpecConstant].operands.push(OperandVariableLiterals, "'Value'");\r
+    InstructionDesc[OpSpecConstant].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpSpecConstantComposite].operands.push(OperandVariableIds, "'Constituents'");\r
+    InstructionDesc[OpSpecConstantComposite].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpVariable].operands.push(OperandStorage, "");\r
+    InstructionDesc[OpVariable].operands.push(OperandOptionalId, "'Initializer'");\r
+\r
+    InstructionDesc[OpVariableArray].operands.push(OperandStorage, "");\r
+    InstructionDesc[OpVariableArray].operands.push(OperandId, "'N'");\r
+    InstructionDesc[OpVariableArray].capabilities.push_back(CapAddr);\r
+\r
+    InstructionDesc[OpFunction].operands.push(OperandFunction, "");\r
+    InstructionDesc[OpFunction].operands.push(OperandId, "'Function Type'");\r
+\r
+    InstructionDesc[OpFunctionCall].operands.push(OperandId, "'Function'");\r
+    InstructionDesc[OpFunctionCall].operands.push(OperandVariableIds, "'Argument 0', +\n'Argument 1', +\n...");\r
+\r
+    InstructionDesc[OpExtInst].operands.push(OperandId, "'Set'");\r
+    InstructionDesc[OpExtInst].operands.push(OperandLiteralNumber, "'Instruction'");\r
+    InstructionDesc[OpExtInst].operands.push(OperandVariableIds, "'Operand 1', +\n'Operand 2', +\n...");\r
+\r
+    InstructionDesc[OpLoad].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpLoad].operands.push(OperandVariableLiterals, "'Memory Access'");\r
+\r
+    InstructionDesc[OpStore].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpStore].operands.push(OperandId, "'Object'");\r
+    InstructionDesc[OpStore].operands.push(OperandVariableLiterals, "'Memory Access'");\r
+\r
+    InstructionDesc[OpPhi].operands.push(OperandVariableIds, "");\r
+\r
+    InstructionDesc[OpDecorate].operands.push(OperandId, "'Target'");\r
+    InstructionDesc[OpDecorate].operands.push(OperandDecoration, "");\r
+    InstructionDesc[OpDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");\r
+\r
+    InstructionDesc[OpMemberDecorate].operands.push(OperandId, "'Structure type'");\r
+    InstructionDesc[OpMemberDecorate].operands.push(OperandLiteralNumber, "'Member'");\r
+    InstructionDesc[OpMemberDecorate].operands.push(OperandDecoration, "");\r
+    InstructionDesc[OpMemberDecorate].operands.push(OperandVariableLiterals, "See <<Decoration,'Decoration'>>.");\r
+\r
+    InstructionDesc[OpGroupDecorate].operands.push(OperandId, "'Decoration group'");\r
+    InstructionDesc[OpGroupDecorate].operands.push(OperandVariableIds, "'Target', 'Target', ...");\r
+\r
+    InstructionDesc[OpGroupMemberDecorate].operands.push(OperandId, "'Decoration group'");\r
+    InstructionDesc[OpGroupMemberDecorate].operands.push(OperandVariableIds, "'Target', 'Target', ...");\r
+\r
+    InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Vector'");\r
+    InstructionDesc[OpVectorExtractDynamic].operands.push(OperandId, "'Index'");\r
+\r
+    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Vector'");\r
+    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Component'");\r
+    InstructionDesc[OpVectorInsertDynamic].operands.push(OperandId, "'Index'");\r
+\r
+    InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 1'");\r
+    InstructionDesc[OpVectorShuffle].operands.push(OperandId, "'Vector 2'");\r
+    InstructionDesc[OpVectorShuffle].operands.push(OperandVariableLiterals, "'Components'");\r
+\r
+    InstructionDesc[OpCompositeConstruct].operands.push(OperandVariableIds, "'Constituents'");\r
+\r
+    InstructionDesc[OpCompositeExtract].operands.push(OperandId, "'Composite'");\r
+    InstructionDesc[OpCompositeExtract].operands.push(OperandVariableLiterals, "'Indexes'");\r
+\r
+    InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Object'");\r
+    InstructionDesc[OpCompositeInsert].operands.push(OperandId, "'Composite'");\r
+    InstructionDesc[OpCompositeInsert].operands.push(OperandVariableLiterals, "'Indexes'");\r
+\r
+    InstructionDesc[OpCopyObject].operands.push(OperandId, "'Operand'");\r
+\r
+    InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Target'");\r
+    InstructionDesc[OpCopyMemory].operands.push(OperandId, "'Source'");\r
+    InstructionDesc[OpCopyMemory].operands.push(OperandVariableLiterals, "'Memory Access'");\r
+\r
+    InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Target'");\r
+    InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Source'");\r
+    InstructionDesc[OpCopyMemorySized].operands.push(OperandId, "'Size'");\r
+    InstructionDesc[OpCopyMemorySized].operands.push(OperandVariableLiterals, "'Memory Access'");\r
+\r
+    InstructionDesc[OpCopyMemorySized].capabilities.push_back(CapAddr);\r
+\r
+    InstructionDesc[OpSampler].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpSampler].operands.push(OperandId, "'Filter'");\r
+\r
+    InstructionDesc[OpTextureSample].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSample].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSample].operands.push(OperandOptionalId, "['Bias']");\r
+    InstructionDesc[OpTextureSample].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleDref].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleDref].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleDref].operands.push(OperandId, "'D~ref~'");\r
+    InstructionDesc[OpTextureSampleDref].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleLod].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleLod].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleLod].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureSampleLod].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProj].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProj].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProj].operands.push(OperandOptionalId, "['Bias']");\r
+    InstructionDesc[OpTextureSampleProj].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId, "'dx'");\r
+    InstructionDesc[OpTextureSampleGrad].operands.push(OperandId, "'dy'");\r
+    InstructionDesc[OpTextureSampleGrad].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleOffset].operands.push(OperandOptionalId, "['Bias']");\r
+    InstructionDesc[OpTextureSampleOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProjLod].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureSampleProjLod].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId, "'dx'");\r
+    InstructionDesc[OpTextureSampleProjGrad].operands.push(OperandId, "'dy'");\r
+    InstructionDesc[OpTextureSampleProjGrad].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureSampleLodOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleLodOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleProjOffset].operands.push(OperandOptionalId, "['Bias']");\r
+    InstructionDesc[OpTextureSampleProjOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId, "'dx'");\r
+    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId, "'dy'");\r
+    InstructionDesc[OpTextureSampleGradOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleGradOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureSampleProjLodOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleProjLodOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId, "'dx'");\r
+    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId, "'dy'");\r
+    InstructionDesc[OpTextureSampleProjGradOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureSampleProjGradOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureFetchTexelLod].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureFetchTexelLod].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureFetchTexelLod].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureFetchTexelLod].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureFetchTexelOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureFetchTexelOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureFetchSample].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureFetchSample].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureFetchSample].operands.push(OperandId, "'Sample'");\r
+    InstructionDesc[OpTextureFetchSample].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureFetchTexel].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureFetchTexel].operands.push(OperandId, "'Element'");\r
+    InstructionDesc[OpTextureFetchTexel].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureGather].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureGather].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureGather].operands.push(OperandId, "'Component'");\r
+    InstructionDesc[OpTextureGather].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId, "'Component'");\r
+    InstructionDesc[OpTextureGatherOffset].operands.push(OperandId, "'Offset'");\r
+    InstructionDesc[OpTextureGatherOffset].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId, "'Component'");\r
+    InstructionDesc[OpTextureGatherOffsets].operands.push(OperandId, "'Offsets'");\r
+    InstructionDesc[OpTextureGatherOffsets].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureQuerySizeLod].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureQuerySizeLod].operands.push(OperandId, "'Level of Detail'");\r
+    InstructionDesc[OpTextureQuerySizeLod].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureQuerySize].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureQuerySize].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureQueryLod].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureQueryLod].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpTextureQueryLod].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureQueryLevels].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureQueryLevels].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpTextureQuerySamples].operands.push(OperandId, "'Sampler'");\r
+    InstructionDesc[OpTextureQuerySamples].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpAccessChain].operands.push(OperandId, "'Base'");\r
+    InstructionDesc[OpAccessChain].operands.push(OperandVariableIds, "'Indexes'");\r
+\r
+    InstructionDesc[OpInBoundsAccessChain].operands.push(OperandId, "'Base'");\r
+    InstructionDesc[OpInBoundsAccessChain].operands.push(OperandVariableIds, "'Indexes'");\r
+\r
+    InstructionDesc[OpSNegate].operands.push(OperandId, "'Operand'");\r
+\r
+    InstructionDesc[OpFNegate].operands.push(OperandId, "'Operand'");\r
+\r
+    InstructionDesc[OpNot].operands.push(OperandId, "'Operand'");\r
+\r
+    InstructionDesc[OpAny].operands.push(OperandId, "'Vector'");\r
+\r
+    InstructionDesc[OpAll].operands.push(OperandId, "'Vector'");\r
+\r
+    InstructionDesc[OpConvertFToU].operands.push(OperandId, "'Float Value'");\r
+\r
+    InstructionDesc[OpConvertFToS].operands.push(OperandId, "'Float Value'");\r
+\r
+    InstructionDesc[OpConvertSToF].operands.push(OperandId, "'Signed Value'");\r
+\r
+    InstructionDesc[OpConvertUToF].operands.push(OperandId, "'Unsigned value'");\r
+\r
+    InstructionDesc[OpUConvert].operands.push(OperandId, "'Unsigned value'");\r
+\r
+    InstructionDesc[OpSConvert].operands.push(OperandId, "'Signed Value'");\r
+\r
+    InstructionDesc[OpFConvert].operands.push(OperandId, "'Float Value'");\r
+\r
+    InstructionDesc[OpSatConvertSToU].operands.push(OperandId, "'Signed Value'");\r
+    InstructionDesc[OpSatConvertSToU].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpSatConvertUToS].operands.push(OperandId, "'Unsigned Value'");\r
+    InstructionDesc[OpSatConvertUToS].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpConvertPtrToU].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpConvertPtrToU].capabilities.push_back(CapAddr);\r
+\r
+    InstructionDesc[OpConvertUToPtr].operands.push(OperandId, "'Integer value'");\r
+    InstructionDesc[OpConvertUToPtr].capabilities.push_back(CapAddr);\r
+\r
+    InstructionDesc[OpPtrCastToGeneric].operands.push(OperandId, "'Source pointer'");\r
+    InstructionDesc[OpPtrCastToGeneric].capabilities.push_back(CapKernel);\r
+\r
+\r
+    InstructionDesc[OpGenericCastToPtr].operands.push(OperandId, "'Source pointer'");\r
+    InstructionDesc[OpGenericCastToPtr].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandId, "'Source pointer'");\r
+    InstructionDesc[OpGenericCastToPtrExplicit].operands.push(OperandStorage, "'storage'");\r
+    InstructionDesc[OpGenericCastToPtrExplicit].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpGenericPtrMemSemantics].operands.push(OperandId, "'ptr'");\r
+    InstructionDesc[OpGenericPtrMemSemantics].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpBitcast].operands.push(OperandId, "'Operand'");\r
+\r
+    InstructionDesc[OpTranspose].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpTranspose].operands.push(OperandId, "'Matrix'");\r
+\r
+    InstructionDesc[OpIsNan].operands.push(OperandId, "'x'");\r
+\r
+    InstructionDesc[OpIsInf].operands.push(OperandId, "'x'");\r
+\r
+    InstructionDesc[OpIsFinite].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpIsFinite].operands.push(OperandId, "'x'");\r
+\r
+    InstructionDesc[OpIsNormal].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpIsNormal].operands.push(OperandId, "'x'");\r
+\r
+    InstructionDesc[OpSignBitSet].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpSignBitSet].operands.push(OperandId, "'x'");\r
+\r
+    InstructionDesc[OpLessOrGreater].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'x'");\r
+    InstructionDesc[OpLessOrGreater].operands.push(OperandId, "'y'");\r
+\r
+    InstructionDesc[OpOrdered].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpOrdered].operands.push(OperandId, "'x'");\r
+    InstructionDesc[OpOrdered].operands.push(OperandId, "'y'");\r
+\r
+    InstructionDesc[OpUnordered].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpUnordered].operands.push(OperandId, "'x'");\r
+    InstructionDesc[OpUnordered].operands.push(OperandId, "'y'");\r
+\r
+    InstructionDesc[OpArrayLength].operands.push(OperandId, "'Structure'");\r
+    InstructionDesc[OpArrayLength].operands.push(OperandLiteralNumber, "'Array member'");\r
+    InstructionDesc[OpArrayLength].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpIAdd].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFAdd].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpISub].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpISub].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFSub].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpIMul].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFMul].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpUDiv].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSDiv].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFDiv].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpUMod].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSRem].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSMod].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFRem].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFMod].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Vector'");\r
+    InstructionDesc[OpVectorTimesScalar].operands.push(OperandId, "'Scalar'");\r
+\r
+    InstructionDesc[OpMatrixTimesScalar].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Matrix'");\r
+    InstructionDesc[OpMatrixTimesScalar].operands.push(OperandId, "'Scalar'");\r
+\r
+    InstructionDesc[OpVectorTimesMatrix].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Vector'");\r
+    InstructionDesc[OpVectorTimesMatrix].operands.push(OperandId, "'Matrix'");\r
+\r
+    InstructionDesc[OpMatrixTimesVector].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Matrix'");\r
+    InstructionDesc[OpMatrixTimesVector].operands.push(OperandId, "'Vector'");\r
+\r
+    InstructionDesc[OpMatrixTimesMatrix].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'LeftMatrix'");\r
+    InstructionDesc[OpMatrixTimesMatrix].operands.push(OperandId, "'RightMatrix'");\r
+\r
+    InstructionDesc[OpOuterProduct].capabilities.push_back(CapMatrix);\r
+    InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 1'");\r
+    InstructionDesc[OpOuterProduct].operands.push(OperandId, "'Vector 2'");\r
+\r
+    InstructionDesc[OpDot].operands.push(OperandId, "'Vector 1'");\r
+    InstructionDesc[OpDot].operands.push(OperandId, "'Vector 2'");\r
+\r
+    InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpShiftRightLogical].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpShiftRightArithmetic].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpShiftLeftLogical].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpLogicalOr].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpLogicalXor].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpLogicalXor].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpLogicalAnd].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpBitwiseOr].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpBitwiseXor].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpBitwiseAnd].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSelect].operands.push(OperandId, "'Condition'");\r
+    InstructionDesc[OpSelect].operands.push(OperandId, "'Object 1'");\r
+    InstructionDesc[OpSelect].operands.push(OperandId, "'Object 2'");\r
+\r
+    InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpIEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpINotEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdNotEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordNotEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpULessThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSLessThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdLessThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordLessThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpUGreaterThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSGreaterThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdGreaterThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordGreaterThan].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpULessThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSLessThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdLessThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordLessThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpUGreaterThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpSGreaterThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFOrdGreaterThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 1'");\r
+    InstructionDesc[OpFUnordGreaterThanEqual].operands.push(OperandId, "'Operand 2'");\r
+\r
+    InstructionDesc[OpDPdx].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdx].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpDPdy].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdy].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpFwidth].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpFwidth].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpDPdxFine].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdxFine].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpDPdyFine].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdyFine].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpFwidthFine].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpFwidthFine].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpDPdxCoarse].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdxCoarse].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpDPdyCoarse].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpDPdyCoarse].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpFwidthCoarse].capabilities.push_back(CapShader);\r
+    InstructionDesc[OpFwidthCoarse].operands.push(OperandId, "'P'");\r
+\r
+    InstructionDesc[OpEmitVertex].capabilities.push_back(CapGeom);\r
+\r
+    InstructionDesc[OpEndPrimitive].capabilities.push_back(CapGeom);\r
+\r
+    InstructionDesc[OpEmitStreamVertex].operands.push(OperandId, "'Stream'");\r
+    InstructionDesc[OpEmitStreamVertex].capabilities.push_back(CapGeom);\r
+\r
+    InstructionDesc[OpEndStreamPrimitive].operands.push(OperandId, "'Stream'");\r
+    InstructionDesc[OpEndStreamPrimitive].capabilities.push_back(CapGeom);\r
+\r
+    InstructionDesc[OpControlBarrier].operands.push(OperandExecutionScope, "'Scope'");\r
+\r
+    InstructionDesc[OpMemoryBarrier].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpMemoryBarrier].operands.push(OperandMemorySemantics, "'Semantics'");\r
+\r
+    InstructionDesc[OpImagePointer].operands.push(OperandId, "'Image'");\r
+    InstructionDesc[OpImagePointer].operands.push(OperandId, "'Coordinate'");\r
+    InstructionDesc[OpImagePointer].operands.push(OperandId, "'Sample'");\r
+\r
+    InstructionDesc[OpAtomicInit].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicInit].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicLoad].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicLoad].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicLoad].operands.push(OperandMemorySemantics, "'Semantics'");\r
+\r
+    InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicStore].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicStore].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicStore].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicExchange].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicExchange].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicExchange].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Value'");\r
+    InstructionDesc[OpAtomicCompareExchange].operands.push(OperandId, "'Comparator'");\r
+\r
+    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Value'");\r
+    InstructionDesc[OpAtomicCompareExchangeWeak].operands.push(OperandId, "'Comparator'");\r
+\r
+    InstructionDesc[OpAtomicIIncrement].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicIIncrement].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicIIncrement].operands.push(OperandMemorySemantics, "'Semantics'");\r
+\r
+    InstructionDesc[OpAtomicIDecrement].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicIDecrement].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicIDecrement].operands.push(OperandMemorySemantics, "'Semantics'");\r
+\r
+    InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicIAdd].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicIAdd].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicIAdd].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicISub].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicISub].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicISub].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicUMin].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicUMin].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicUMin].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicUMax].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicUMax].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicUMax].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicIMin].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicIMin].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicIMin].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicIMin].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicIMax].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicIMax].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicIMax].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicIMax].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicAnd].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicAnd].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicAnd].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicOr].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicOr].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicOr].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Pointer'");\r
+    InstructionDesc[OpAtomicXor].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAtomicXor].operands.push(OperandMemorySemantics, "'Semantics'");\r
+    InstructionDesc[OpAtomicXor].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpLoopMerge].operands.push(OperandId, "'Label'");\r
+    InstructionDesc[OpLoopMerge].operands.push(OperandLoop, "");\r
+\r
+    InstructionDesc[OpSelectionMerge].operands.push(OperandId, "'Label'");\r
+    InstructionDesc[OpSelectionMerge].operands.push(OperandSelect, "");\r
+\r
+    InstructionDesc[OpBranch].operands.push(OperandId, "'Target Label'");\r
+\r
+    InstructionDesc[OpBranchConditional].operands.push(OperandId, "'Condition'");\r
+    InstructionDesc[OpBranchConditional].operands.push(OperandId, "'True Label'");\r
+    InstructionDesc[OpBranchConditional].operands.push(OperandId, "'False Label'");\r
+    InstructionDesc[OpBranchConditional].operands.push(OperandVariableLiterals, "'Branch weights'");\r
+\r
+    InstructionDesc[OpSwitch].operands.push(OperandId, "'Selector'");\r
+    InstructionDesc[OpSwitch].operands.push(OperandId, "'Default'");\r
+    InstructionDesc[OpSwitch].operands.push(OperandVariableLiteralId, "'Target'");\r
+\r
+    InstructionDesc[OpKill].capabilities.push_back(CapShader);\r
+\r
+    InstructionDesc[OpReturnValue].operands.push(OperandId, "'Value'");\r
+\r
+    InstructionDesc[OpUnreachable].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpLifetimeStart].operands.push(OperandId, "");\r
+    InstructionDesc[OpLifetimeStart].operands.push(OperandLiteralNumber, "");\r
+\r
+    InstructionDesc[OpLifetimeStop].operands.push(OperandId, "");\r
+    InstructionDesc[OpLifetimeStop].operands.push(OperandLiteralNumber, "");\r
+\r
+    InstructionDesc[OpCompileFlag].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpCompileFlag].operands.push(OperandLiteralString, "'Flag'");\r
+\r
+    InstructionDesc[OpAsyncGroupCopy].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId, "'Destination'");\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId, "'Source'");\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId, "'Num Elements'");\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId, "'Stride'");\r
+    InstructionDesc[OpAsyncGroupCopy].operands.push(OperandId, "'Event'");\r
+\r
+    InstructionDesc[OpWaitGroupEvents].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpWaitGroupEvents].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpWaitGroupEvents].operands.push(OperandId, "'Num Events'");\r
+    InstructionDesc[OpWaitGroupEvents].operands.push(OperandId, "'Events List'");\r
+\r
+    InstructionDesc[OpGroupAll].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupAll].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupAll].operands.push(OperandId, "'Predicate'");\r
+\r
+    InstructionDesc[OpGroupAny].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupAny].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupAny].operands.push(OperandId, "'Predicate'");\r
+\r
+    InstructionDesc[OpGroupBroadcast].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupBroadcast].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'Value'");\r
+    InstructionDesc[OpGroupBroadcast].operands.push(OperandId, "'LocalId'");\r
+\r
+    InstructionDesc[OpGroupIAdd].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupIAdd].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupIAdd].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupIAdd].operands.push(OperandId, "'X'");\r
+\r
+    InstructionDesc[OpGroupFAdd].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupFAdd].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupFAdd].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupFAdd].operands.push(OperandId, "'X'");\r
+\r
+    InstructionDesc[OpGroupUMin].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupUMin].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupUMin].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupUMin].operands.push(OperandId, "'X'");\r
+\r
+    InstructionDesc[OpGroupSMin].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupSMin].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupSMin].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupSMin].operands.push(OperandId, "X");\r
+\r
+    InstructionDesc[OpGroupFMin].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupFMin].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupFMin].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupFMin].operands.push(OperandId, "X");\r
+\r
+    InstructionDesc[OpGroupUMax].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupUMax].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupUMax].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupUMax].operands.push(OperandId, "X");\r
+\r
+    InstructionDesc[OpGroupSMax].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupSMax].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupSMax].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupSMax].operands.push(OperandId, "X");\r
+\r
+    InstructionDesc[OpGroupFMax].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupFMax].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupFMax].operands.push(OperandGroupOperation, "'Operation'");\r
+    InstructionDesc[OpGroupFMax].operands.push(OperandId, "X");\r
+\r
+    InstructionDesc[OpReadPipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReadPipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpReadPipe].operands.push(OperandId, "'ptr'");\r
+\r
+    InstructionDesc[OpWritePipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpWritePipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpWritePipe].operands.push(OperandId, "'ptr'");\r
+\r
+    InstructionDesc[OpReservedReadPipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'reserve_id'");\r
+    InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'index'");\r
+    InstructionDesc[OpReservedReadPipe].operands.push(OperandId, "'ptr'");\r
+\r
+    InstructionDesc[OpReservedWritePipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'reserve_id'");\r
+    InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'index'");\r
+    InstructionDesc[OpReservedWritePipe].operands.push(OperandId, "'ptr'");\r
+\r
+    InstructionDesc[OpReserveReadPipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpReserveReadPipePackets].operands.push(OperandId, "'num_packets'");\r
+\r
+    InstructionDesc[OpReserveWritePipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpReserveWritePipePackets].operands.push(OperandId, "'num_packets'");\r
+\r
+    InstructionDesc[OpCommitReadPipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpCommitReadPipe].operands.push(OperandId, "'reserve_id'");\r
+\r
+    InstructionDesc[OpCommitWritePipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpCommitWritePipe].operands.push(OperandId, "'reserve_id'");\r
+\r
+    InstructionDesc[OpIsValidReserveId].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpIsValidReserveId].operands.push(OperandId, "'reserve_id'");\r
+\r
+    InstructionDesc[OpGetNumPipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetNumPipePackets].operands.push(OperandId, "'p'");\r
+\r
+    InstructionDesc[OpGetMaxPipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetMaxPipePackets].operands.push(OperandId, "'p'");\r
+\r
+    InstructionDesc[OpGroupReserveReadPipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpGroupReserveReadPipePackets].operands.push(OperandId, "'num_packets'");\r
+\r
+    InstructionDesc[OpGroupReserveWritePipePackets].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpGroupReserveWritePipePackets].operands.push(OperandId, "'num_packets'");\r
+\r
+    InstructionDesc[OpGroupCommitReadPipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpGroupCommitReadPipe].operands.push(OperandId, "'reserve_id'");\r
+\r
+    InstructionDesc[OpGroupCommitWritePipe].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandExecutionScope, "'Scope'");\r
+    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'p'");\r
+    InstructionDesc[OpGroupCommitWritePipe].operands.push(OperandId, "'reserve_id'");\r
+\r
+    InstructionDesc[OpBuildNDRange].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkSize'");\r
+    InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'LocalWorkSize'");\r
+    InstructionDesc[OpBuildNDRange].operands.push(OperandId, "'GlobalWorkOffset'");\r
+\r
+    InstructionDesc[OpGetDefaultQueue].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpCaptureEventProfilingInfo].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'event'");\r
+    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandKernelProfilingInfo, "'info'");\r
+    InstructionDesc[OpCaptureEventProfilingInfo].operands.push(OperandId, "'value'");\r
+\r
+    InstructionDesc[OpSetUserEventStatus].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'event'");\r
+    InstructionDesc[OpSetUserEventStatus].operands.push(OperandId, "'status'");\r
+\r
+    InstructionDesc[OpIsValidEvent].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpIsValidEvent].operands.push(OperandId, "'event'");\r
+\r
+    InstructionDesc[OpCreateUserEvent].capabilities.push_back(CapKernel);\r
+\r
+    InstructionDesc[OpRetainEvent].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpRetainEvent].operands.push(OperandId, "'event'");\r
+\r
+    InstructionDesc[OpReleaseEvent].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpReleaseEvent].operands.push(OperandId, "'event'");\r
+\r
+    InstructionDesc[OpGetKernelWorkGroupSize].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetKernelWorkGroupSize].operands.push(OperandId, "'Invoke'");\r
+\r
+    InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetKernelPreferredWorkGroupSizeMultiple].operands.push(OperandId, "'Invoke'");\r
+\r
+    InstructionDesc[OpGetKernelNDrangeSubGroupCount].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'ND Range'");\r
+    InstructionDesc[OpGetKernelNDrangeSubGroupCount].operands.push(OperandId, "'Invoke'");\r
+\r
+    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'ND Range'");\r
+    InstructionDesc[OpGetKernelNDrangeMaxSubGroupSize].operands.push(OperandId, "'Invoke'");\r
+\r
+    InstructionDesc[OpEnqueueKernel].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'q'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandKernelEnqueueFlags, "'flags'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'ND Range'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Num Events'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Wait Events'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Ret Event'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Invoke'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Size'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandId, "'Param Align'");\r
+    InstructionDesc[OpEnqueueKernel].operands.push(OperandVariableIds, "'Local Size'");\r
+\r
+    InstructionDesc[OpEnqueueMarker].capabilities.push_back(CapKernel);\r
+    InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'q'");\r
+    InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Num Events'");\r
+    InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Wait Events'");\r
+    InstructionDesc[OpEnqueueMarker].operands.push(OperandId, "'Ret Event'");\r
+}\r
+\r
 }; // end spv namespace\r
index 176ae91..9059f0e 100644 (file)
@@ -37,8 +37,7 @@
 //\r
 \r
 //\r
-// Return English versions of instruction/operand information.\r
-// This can be used for disassembly, printing documentation, etc.\r
+// Parameterize the SPIR-V enumerants.\r
 //\r
 \r
 #include "spirv.h"\r
@@ -47,7 +46,7 @@
 \r
 namespace spv {\r
 \r
-// Fill in all the parameters of the instruction set\r
+// Fill in all the parameters\r
 void Parameterize();\r
 \r
 // Return the English names of all the enums.\r
@@ -76,6 +75,35 @@ const char* ExecutionScopeString(int);
 const char* GroupOperationString(int);\r
 const char* KernelEnqueueFlagsString(int);\r
 const char* KernelProfilingInfoString(int);\r
+const char* OpcodeString(int);\r
+\r
+// For grouping opcodes into subsections\r
+enum OpcodeClass {\r
+    OpClassMisc,            // default, until opcode is classified\r
+    OpClassDebug,\r
+    OpClassAnnotate,\r
+    OpClassExtension,\r
+    OpClassMode,\r
+    OpClassType,\r
+    OpClassConstant,\r
+    OpClassMemory,\r
+    OpClassFunction,\r
+    OpClassTexture,\r
+    OpClassConvert,\r
+    OpClassComposite,\r
+    OpClassArithmetic,\r
+    OpClassRelationalLogical,\r
+    OpClassDerivative,\r
+    OpClassFlowControl,\r
+    OpClassAtomic,\r
+    OpClassPrimitive,\r
+    OpClassBarrier,\r
+    OpClassGroup,\r
+    OpClassDeviceSideEnqueue,\r
+    OpClassPipe,\r
+\r
+    OpClassCount\r
+};\r
 \r
 // For parameterizing operands.\r
 enum OperandClass {\r
@@ -99,35 +127,85 @@ enum OperandClass {
     OperandFPFastMath,\r
     OperandFPRoundingMode,\r
     OperandLinkageType,\r
+    OperandAccessQualifier,\r
     OperandFuncParamAttr,\r
     OperandDecoration,\r
     OperandBuiltIn,\r
     OperandSelect,\r
     OperandLoop,\r
     OperandFunction,\r
-    OperandAccessQualifier,\r
     OperandMemorySemantics,\r
     OperandMemoryAccess,\r
     OperandExecutionScope,\r
        OperandGroupOperation,\r
     OperandKernelEnqueueFlags,\r
     OperandKernelProfilingInfo,\r
+\r
+    OperandOpcode,\r
+\r
     OperandCount\r
 };\r
 \r
+// Set of capabilities.  Generally, something is assumed to be in core,\r
+// if nothing else is said.  So, these are used to identify when something\r
+// requires a specific capability to be declared.\r
+enum Capability {\r
+    CapMatrix,\r
+    CapShader,\r
+    CapGeom,\r
+    CapTess,\r
+    CapAddr,\r
+    CapLink,\r
+    CapKernel\r
+};\r
+\r
+// Any specific enum can have a set of capabilities that allow it:\r
+typedef std::vector<Capability> EnumCaps;\r
+\r
 // Parameterize a set of operands with their OperandClass(es) and descriptions.\r
 class OperandParameters {\r
 public:\r
     OperandParameters() { }\r
-    void push(OperandClass oc)\r
+    void push(OperandClass oc, const char* d)\r
     {\r
         opClass.push_back(oc);\r
+        desc.push_back(d);\r
     }\r
     OperandClass getClass(int op) const { return opClass[op]; }\r
+    const char* getDesc(int op) const { return desc[op]; }\r
     int getNum() const { return (int)opClass.size(); }\r
 \r
 protected:\r
     std::vector<OperandClass> opClass;\r
+    std::vector<const char*> desc;\r
+};\r
+\r
+// Parameterize an enumerant\r
+class EnumParameters {\r
+public:\r
+    EnumParameters() : desc(0) { }\r
+    EnumCaps caps;\r
+    const char* desc;\r
+};\r
+\r
+// Parameterize a set of enumerants that form an enum\r
+class EnumDefinition : public EnumParameters {\r
+public:\r
+    EnumDefinition() : \r
+        ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { }\r
+    void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false)\r
+    {\r
+        ceiling = ceil;\r
+        getName = name;\r
+        bitmask = mask;\r
+        enumParams = ep;\r
+    }\r
+    void setOperands(OperandParameters* op) { operandParams = op; }\r
+    int ceiling;   // ceiling of enumerants\r
+    bool bitmask;  // true if these enumerants combine into a bitmask\r
+    const char* (*getName)(int);      // a function that returns the name for each enumerant value (or shift)\r
+    EnumParameters* enumParams;       // parameters for each individual enumerant\r
+    OperandParameters* operandParams; // sets of operands\r
 };\r
 \r
 // Parameterize an instruction's logical format, including its known set of operands,\r
@@ -137,7 +215,8 @@ public:
     InstructionParameters() :\r
         typePresent(true),         // most normal, only exceptions have to be spelled out\r
         resultPresent(true),       // most normal, only exceptions have to be spelled out\r
-        opName(0)\r
+        opDesc(0),\r
+        opClass(OpClassMisc)\r
     { }\r
 \r
     void setResultAndType(bool r, bool t)\r
@@ -149,7 +228,9 @@ public:
     bool hasResult() const { return resultPresent != 0; }\r
     bool hasType()   const { return typePresent != 0; }\r
 \r
-    const char* opName;\r
+    const char* opDesc;\r
+    EnumCaps capabilities;\r
+    OpcodeClass opClass;\r
     OperandParameters operands;\r
 \r
 protected:\r
@@ -157,8 +238,19 @@ protected:
     int resultPresent : 1;\r
 };\r
 \r
+const int OpcodeCeiling = 267;\r
+\r
 // The set of objects that hold all the instruction/operand\r
 // parameterization information.\r
-extern InstructionParameters InstructionDesc[spv::OpCount];\r
+extern InstructionParameters InstructionDesc[];\r
+\r
+// These hold definitions of the enumerants used for operands\r
+extern EnumDefinition OperandClassParams[];\r
+\r
+const char* GetOperandDesc(OperandClass operand);\r
+void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false);\r
+const char* AccessQualifierString(int attr);\r
+\r
+void PrintOperands(const OperandParameters& operands, int reservedOperands);\r
 \r
 };  // end namespace spv\r
index 7404d6f..757fdce 100644 (file)
 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r
 */\r
 \r
-//\r
-// Enumeration tokens for SPIR V.\r
-//\r
+/*\r
+** This header is automatically generated by the same tool that creates\r
+** the Binary Section of the SPIR-V specification.\r
+*/\r
+\r
+/*\r
+** Specification revision 29.\r
+** Enumeration tokens for SPIR-V, in three styles: C, C++, generic.\r
+** - C++ will have the tokens in the "spv" name space, with no prefix.\r
+** - C will have tokens with as "Spv" prefix.\r
+**\r
+** Some tokens act like mask values, which can be OR'd together,\r
+** while others are mutually exclusive.  The mask-like ones have\r
+** "Mask" in their name, and a parallel enum that has the shift\r
+** amount (1 << x) for each corresponding enumerant.\r
+*/\r
 \r
-#pragma once\r
 #ifndef spirv_H\r
 #define spirv_H\r
 \r
 #ifdef __cplusplus\r
-namespace spv{\r
-#endif\r
+\r
+namespace spv {\r
 \r
 const int MagicNumber = 0x07230203;\r
 const int Version = 99;\r
 \r
 typedef unsigned int Id;\r
 \r
-const Id NoResult = 0;\r
-const Id NoType = 0;\r
-\r
 const unsigned int OpCodeMask = 0xFFFF;\r
 const unsigned int WordCountShift = 16;\r
 \r
-// Set of capabilities.  Generally, something is assumed to be in core,\r
-// if nothing else is said.  So, these are used to identify when something\r
-// requires a specific capability to be declared.\r
-enum Capability {\r
-    CapMatrix,\r
-    CapShader,\r
-    CapGeom,\r
-    CapTess,\r
-    CapAddr,\r
-    CapLink,\r
-    CapKernel\r
-};\r
-\r
-// What language is the source code in?  Note the OpSource instruction has a separate\r
-// operand for the version number, this is just the language name.  The GLSL\r
-// compatibility profile will be indicated by using an OpSourceExtension string.\r
 enum SourceLanguage {\r
-    LangUnknown,\r
-    LangESSL,\r
-    LangGLSL,\r
-    LangOpenCL,\r
-\r
-    LangCount     // guard for validation, "default:" statements, etc.\r
+    SourceLanguageUnknown = 0,\r
+    SourceLanguageESSL = 1,\r
+    SourceLanguageGLSL = 2,\r
+    SourceLanguageOpenCL = 3,\r
 };\r
 \r
-// Used per entry point to communicate the "stage" or other model of\r
-// execution used by that entry point.\r
-// See OpEntryPoint.\r
 enum ExecutionModel {\r
-    ModelVertex,\r
-    ModelTessellationControl,\r
-    ModelTessellationEvaluation,\r
-    ModelGeometry,\r
-    ModelFragment,\r
-    ModelGLCompute,\r
-    ModelKernel,\r
-\r
-    ModelCount    // guard for validation, "default:" statements, etc.\r
+    ExecutionModelVertex = 0,\r
+    ExecutionModelTessellationControl = 1,\r
+    ExecutionModelTessellationEvaluation = 2,\r
+    ExecutionModelGeometry = 3,\r
+    ExecutionModelFragment = 4,\r
+    ExecutionModelGLCompute = 5,\r
+    ExecutionModelKernel = 6,\r
 };\r
 \r
-// Used as an argument to OpMemoryModel\r
 enum AddressingModel {\r
-    AddressingLogical,\r
-    AddressingPhysical32,\r
-    AddressingPhysical64,\r
-\r
-    AddressingCount     // guard for validation, "default:" statements, etc.\r
+    AddressingModelLogical = 0,\r
+    AddressingModelPhysical32 = 1,\r
+    AddressingModelPhysical64 = 2,\r
 };\r
 \r
-// Used as an argment to OpMemoryModel\r
 enum MemoryModel {\r
-    MemorySimple,\r
-    MemoryGLSL450,\r
-    MemoryOCL12,\r
-    MemoryOCL20,\r
-    MemoryOCL21,\r
-\r
-    MemoryCount         // guard for validation, "default:" statements, etc.\r
+    MemoryModelSimple = 0,\r
+    MemoryModelGLSL450 = 1,\r
+    MemoryModelOpenCL12 = 2,\r
+    MemoryModelOpenCL20 = 3,\r
+    MemoryModelOpenCL21 = 4,\r
 };\r
 \r
-// Used per entry point to communicate modes related to input, output, and execution.\r
-// See OpExecutionMode.\r
 enum ExecutionMode {\r
-    ExecutionInvocations,\r
-    ExecutionSpacingEqual,\r
-    ExecutionSpacingFractionalEven,\r
-    ExecutionSpacingFractionalOdd,\r
-    ExecutionVertexOrderCw,\r
-    ExecutionVertexOrderCcw,\r
-    ExecutionPixelCenterInteger,\r
-    ExecutionOriginUpperLeft,\r
-    ExecutionEarlyFragmentTests,\r
-    ExecutionPointMode,\r
-    ExecutionXfb,\r
-    ExecutionDepthReplacing,\r
-    ExecutionDepthAny,\r
-    ExecutionDepthGreater,\r
-    ExecutionDepthLess,\r
-    ExecutionDepthUnchanged,\r
-    ExecutionLocalSize,\r
-    ExecutionLocalSizeHint,\r
-\r
-    ExecutionInputPoints,\r
-    ExecutionInputLines,\r
-    ExecutionInputLinesAdjacency,\r
-    ExecutionInputTriangles,\r
-    ExecutionInputTrianglesAdjacency,\r
-    ExecutionInputQuads,\r
-    ExecutionInputIsolines,\r
-\r
-    ExecutionOutputVertices,\r
-    ExecutionOutputPoints,\r
-    ExecutionOutputLineStrip,\r
-    ExecutionOutputTriangleStrip,\r
-\r
-    ExecutionVecTypeHint,\r
-    ExecutionContractionOff,\r
-    ExecutionModeCount    // guard for validation, "default:" statements, etc.\r
+    ExecutionModeInvocations = 0,\r
+    ExecutionModeSpacingEqual = 1,\r
+    ExecutionModeSpacingFractionalEven = 2,\r
+    ExecutionModeSpacingFractionalOdd = 3,\r
+    ExecutionModeVertexOrderCw = 4,\r
+    ExecutionModeVertexOrderCcw = 5,\r
+    ExecutionModePixelCenterInteger = 6,\r
+    ExecutionModeOriginUpperLeft = 7,\r
+    ExecutionModeEarlyFragmentTests = 8,\r
+    ExecutionModePointMode = 9,\r
+    ExecutionModeXfb = 10,\r
+    ExecutionModeDepthReplacing = 11,\r
+    ExecutionModeDepthAny = 12,\r
+    ExecutionModeDepthGreater = 13,\r
+    ExecutionModeDepthLess = 14,\r
+    ExecutionModeDepthUnchanged = 15,\r
+    ExecutionModeLocalSize = 16,\r
+    ExecutionModeLocalSizeHint = 17,\r
+    ExecutionModeInputPoints = 18,\r
+    ExecutionModeInputLines = 19,\r
+    ExecutionModeInputLinesAdjacency = 20,\r
+    ExecutionModeInputTriangles = 21,\r
+    ExecutionModeInputTrianglesAdjacency = 22,\r
+    ExecutionModeInputQuads = 23,\r
+    ExecutionModeInputIsolines = 24,\r
+    ExecutionModeOutputVertices = 25,\r
+    ExecutionModeOutputPoints = 26,\r
+    ExecutionModeOutputLineStrip = 27,\r
+    ExecutionModeOutputTriangleStrip = 28,\r
+    ExecutionModeVecTypeHint = 29,\r
+    ExecutionModeContractionOff = 30,\r
 };\r
 \r
 enum StorageClass {\r
-    StorageConstantUniform,\r
-    StorageInput,\r
-    StorageUniform,\r
-    StorageOutput,\r
-    StorageWorkgroupLocal,\r
-    StorageWorkgroupGlobal,\r
-    StoragePrivateGlobal,\r
-    StorageFunction,\r
-    StorageGeneric,\r
-    StoragePrivate,\r
-    StorageAtomicCounter,\r
-    StorageCount            // guard for validation, "default:" statements, etc.\r
-};\r
-\r
-// Dimensionalities currently used for sampling.\r
-// See TypeSampler in TypeClass.\r
-enum Dimensionality {\r
-    Dim1D,\r
-    Dim2D,\r
-    Dim3D,\r
-    DimCube,\r
-    DimRect,\r
-    DimBuffer,\r
-\r
-    DimCount   // guard for validation, "default:" statements, etc.\r
-};\r
-\r
-// Sampler addressing mode.\r
+    StorageClassUniformConstant = 0,\r
+    StorageClassInput = 1,\r
+    StorageClassUniform = 2,\r
+    StorageClassOutput = 3,\r
+    StorageClassWorkgroupLocal = 4,\r
+    StorageClassWorkgroupGlobal = 5,\r
+    StorageClassPrivateGlobal = 6,\r
+    StorageClassFunction = 7,\r
+    StorageClassGeneric = 8,\r
+    StorageClassPrivate = 9,\r
+    StorageClassAtomicCounter = 10,\r
+};\r
+\r
+enum Dim {\r
+    Dim1D = 0,\r
+    Dim2D = 1,\r
+    Dim3D = 2,\r
+    DimCube = 3,\r
+    DimRect = 4,\r
+    DimBuffer = 5,\r
+};\r
+\r
 enum SamplerAddressingMode {\r
-    SamplerAddressingNone           = 0,\r
-    SamplerAddressingClampToEdge    = 2,\r
-    SamplerAddressingClamp          = 4,\r
-    SamplerAddressingRepeat         = 6,\r
-    SamplerAddressingRepeatMirrored = 8,\r
-    SamplerAddressingModeLast,\r
+    SamplerAddressingModeNone = 0,\r
+    SamplerAddressingModeClampToEdge = 2,\r
+    SamplerAddressingModeClamp = 4,\r
+    SamplerAddressingModeRepeat = 6,\r
+    SamplerAddressingModeRepeatMirrored = 8,\r
 };\r
 \r
-// Sampler filter mode.\r
 enum SamplerFilterMode {\r
-    SamplerFilterNearest = 0x10,\r
-    SamplerFilterLinear  = 0x20,\r
-    SamplerFilterModeLast,\r
+    SamplerFilterModeNearest = 16,\r
+    SamplerFilterModeLinear = 32,\r
 };\r
 \r
-// FP Fast Math Mode.\r
-enum FPFastMath {\r
-    FPFastMathNNan =  0,      // assume parameters and result are not NaN.\r
-    FPFastMathNInf =  0x02,   // assume parameters and result are not +/- Inf.\r
-    FPFastMathNSZ  =  0x04,   // treat the sign of a zero parameter or result as insignificant.\r
-    FPFastMathARcp =  0x08,   // allow the usage of reciprocal rather than perform a division.\r
-    FPFastMathFast =  0x10,   // allow Algebraic transformations according to real number associative and distibutive algebra. This flag implies all the others.\r
-    FPFastMathLast,\r
+enum FPFastMathModeShift {\r
+    FPFastMathModeNotNaNShift = 0,\r
+    FPFastMathModeNotInfShift = 1,\r
+    FPFastMathModeNSZShift = 2,\r
+    FPFastMathModeAllowRecipShift = 3,\r
+    FPFastMathModeFastShift = 4,\r
+};\r
+\r
+enum FPFastMathModeMask {\r
+    FPFastMathModeMaskNone = 0,\r
+    FPFastMathModeNotNaNMask = 0x00000001,\r
+    FPFastMathModeNotInfMask = 0x00000002,\r
+    FPFastMathModeNSZMask = 0x00000004,\r
+    FPFastMathModeAllowRecipMask = 0x00000008,\r
+    FPFastMathModeFastMask = 0x00000010,\r
 };\r
 \r
-// FP Fast Math Mode.\r
 enum FPRoundingMode {\r
-    FPRoundRTE,    // round to nearest even.\r
-    FPRoundRTZ,    // round towards zero.\r
-    FPRoundRTP,    // round towards positive infinity.\r
-    FPRoundRTN,    // round towards negative infinity.\r
-    FPRoundLast,\r
+    FPRoundingModeRTE = 0,\r
+    FPRoundingModeRTZ = 1,\r
+    FPRoundingModeRTP = 2,\r
+    FPRoundingModeRTN = 3,\r
 };\r
 \r
-// Global identifier linkage types (by default the linkage type of global identifiers is private. This means that they are only accessible to objects inside the module.)\r
 enum LinkageType {\r
-    LinkageExport,    // accessible by objects in other modules as well.\r
-    LinkageImport,    // a forward declaration to a global identifier that exists in another module.\r
-    LinkageLast,\r
+    LinkageTypeExport = 0,\r
+    LinkageTypeImport = 1,\r
 };\r
 \r
-// Access Qualifiers for OpenCL pipes and images\r
 enum AccessQualifier {\r
-    AccessQualReadOnly,\r
-    AccessQualWriteOnly,\r
-    AccessQualReadWrite,\r
-    AccessQualLast,\r
+    AccessQualifierReadOnly = 0,\r
+    AccessQualifierWriteOnly = 1,\r
+    AccessQualifierReadWrite = 2,\r
 };\r
 \r
-// Function argument attributes\r
 enum FunctionParameterAttribute {\r
-    FuncParamAttrZext,  // value should be zero extended if needed\r
-    FuncParamAttrSext,  // value should be sign extended if needed\r
-    FuncParamAttrByval, // only valid for pointer parameters (not for ret value), this indicates that the pointer parameter should really be passed by value to the function.\r
-    FuncParamAttrSret,  // indicates that the pointer parameter specifies the address of a structure that is the return value of the function in the source program. only applicable to the first parameter\r
-    FuncParamAttrNoAlias,\r
-    FuncParamAttrNoCapture,\r
-    FuncParamAttrSVM,\r
-    FuncParamAttrNoWrite,\r
-    FuncParamAttrNoReadWrite,\r
-    FuncParamAttrLast,       // guard for validation, "default:" statements, etc.\r
+    FunctionParameterAttributeZext = 0,\r
+    FunctionParameterAttributeSext = 1,\r
+    FunctionParameterAttributeByVal = 2,\r
+    FunctionParameterAttributeSret = 3,\r
+    FunctionParameterAttributeNoAlias = 4,\r
+    FunctionParameterAttributeNoCapture = 5,\r
+    FunctionParameterAttributeSVM = 6,\r
+    FunctionParameterAttributeNoWrite = 7,\r
+    FunctionParameterAttributeNoReadWrite = 8,\r
 };\r
 \r
-\r
-// Extra forms of "qualification" to add as needed.  See OpDecorate.\r
 enum Decoration {\r
-    // For legacy ES precision qualifiers; newer language\r
-    // designs can use the "num-bits" feature in TypeClass.\r
-    // The precision qualifiers may be decorated on type <id>s or instruction <id>s.\r
-    DecPrecisionLow,\r
-    DecPrecisionMedium,\r
-    DecPrecisionHigh,\r
-\r
-    DecBlock,            // basic in/out/uniform block, applied only to types of TypeStruct\r
-    DecBufferBlock,      // shader storage buffer block\r
-    DecRowMajor,\r
-    DecColMajor,\r
-    DecGLSLShared,\r
-    DecGLSLStd140,\r
-    DecGLSLStd430,\r
-    DecGLSLPacked,\r
-    DecSmooth,\r
-    DecNoperspective,\r
-    DecFlat,\r
-    DecPatch,\r
-    DecCentroid,\r
-    DecSample,\r
-    DecInvariant,\r
-    DecRestrict,\r
-    DecAliased,\r
-    DecVolatile,\r
-    DecConstant,\r
-    DecCoherent,\r
-    DecNonwritable,\r
-    DecNonreadable,\r
-    DecUniform,\r
-    DecNoStaticUse,\r
-\r
-    DecCPacked,\r
-    DecFPSaturatedConv,\r
-\r
-    // these all take one additional operand\r
-    DecStream,\r
-    DecLocation,\r
-    DecComponent,\r
-    DecIndex,\r
-    DecBinding,\r
-    DecDescriptorSet,\r
-    DecOffset,\r
-    DecAlignment,\r
-    DecXfbBuffer,\r
-    DecStride,\r
-    DecBuiltIn,\r
-    DecFuncParamAttr,\r
-    DecFPRoundingMode,\r
-    DecFPFastMathMode,\r
-    DecLinkageType,\r
-    DecSpecId,\r
-\r
-    DecCount             // guard for validation, "default:" statements, etc.\r
+    DecorationPrecisionLow = 0,\r
+    DecorationPrecisionMedium = 1,\r
+    DecorationPrecisionHigh = 2,\r
+    DecorationBlock = 3,\r
+    DecorationBufferBlock = 4,\r
+    DecorationRowMajor = 5,\r
+    DecorationColMajor = 6,\r
+    DecorationGLSLShared = 7,\r
+    DecorationGLSLStd140 = 8,\r
+    DecorationGLSLStd430 = 9,\r
+    DecorationGLSLPacked = 10,\r
+    DecorationSmooth = 11,\r
+    DecorationNoperspective = 12,\r
+    DecorationFlat = 13,\r
+    DecorationPatch = 14,\r
+    DecorationCentroid = 15,\r
+    DecorationSample = 16,\r
+    DecorationInvariant = 17,\r
+    DecorationRestrict = 18,\r
+    DecorationAliased = 19,\r
+    DecorationVolatile = 20,\r
+    DecorationConstant = 21,\r
+    DecorationCoherent = 22,\r
+    DecorationNonwritable = 23,\r
+    DecorationNonreadable = 24,\r
+    DecorationUniform = 25,\r
+    DecorationNoStaticUse = 26,\r
+    DecorationCPacked = 27,\r
+    DecorationSaturatedConversion = 28,\r
+    DecorationStream = 29,\r
+    DecorationLocation = 30,\r
+    DecorationComponent = 31,\r
+    DecorationIndex = 32,\r
+    DecorationBinding = 33,\r
+    DecorationDescriptorSet = 34,\r
+    DecorationOffset = 35,\r
+    DecorationAlignment = 36,\r
+    DecorationXfbBuffer = 37,\r
+    DecorationStride = 38,\r
+    DecorationBuiltIn = 39,\r
+    DecorationFuncParamAttr = 40,\r
+    DecorationFPRoundingMode = 41,\r
+    DecorationFPFastMathMode = 42,\r
+    DecorationLinkageAttributes = 43,\r
+    DecorationSpecId = 44,\r
 };\r
 \r
 enum BuiltIn {\r
-    BuiltInPosition,\r
-    BuiltInPointSize,\r
-    BuiltInClipVertex,\r
-    BuiltInClipDistance,\r
-    BuiltInCullDistance,\r
-    BuiltInVertexId,\r
-    BuiltInInstanceId,\r
-    BuiltInPrimitiveId,\r
-    BuiltInInvocationId,\r
-    BuiltInLayer,\r
-    BuiltInViewportIndex,\r
-    BuiltInTessLevelOuter,\r
-    BuiltInTessLevelInner,\r
-    BuiltInTessCoord,\r
-    BuiltInPatchVertices,\r
-    BuiltInFragCoord,\r
-    BuiltInPointCoord,\r
-    BuiltInFrontFacing,\r
-    BuiltInSampleId,\r
-    BuiltInSamplePosition,\r
-    BuiltInSampleMask,\r
-    BuiltInFragColor,\r
-    BuiltInFragDepth,\r
-    BuiltInHelperInvocation,\r
-\r
-    // OpenGL compute stage, OpenCL work item built-ins\r
-    BuiltInNumWorkgroups,       // number of work-groups that will execute a kernel\r
-    BuiltInWorkgroupSize,      // OpenCL number of local work-items\r
-    BuiltInWorkgroupId,        // OpenCL work group id\r
-    BuiltInLocalInvocationId,  // OpenCL local work item id (decorates a vector3 i32/i64)\r
-    BuiltInGlobalInvocationId, // OpenCL global work item id (decorates a vector3 i32/i64)\r
-    BuiltInLocalInvocationIndex, // not in use in OpenCL\r
-    BuiltInWorkDim, // OpenCL number of dimensions in use (decorates a scalar i32/i64)\r
-    BuiltInGlobalSize, // OpenCL number of global work items, per dimension (decorates a vector3 i32/i64)\r
-    BuiltInEnqueuedWorkgroupSize,      // OpenCL 2.0 only, get local size\r
-    BuiltInGlobalOffset, // OpenCL offset values specified global_work_offset \r
-    BuiltInGlobalLinearId, // OpenCL 2.0 only, work items 1-dimensional global ID.\r
-    BuiltInWorkgroupLinearId, // OpenCL 2.0 only work items 1-dimensional local ID.\r
-\r
-    // OpenCL 2.0 subgroups\r
-    BuiltInSubgroupSize, // Returns the number of work-items in the subgroup\r
-    BuiltInSubgroupMaxSize, // Returns the maximum size of a subgroup within the dispatch\r
-    BuiltInNumSubgroups, // Returns the maximum size of a subgroup within the dispatch\r
-    BuiltInNumEnqueuedSubgroups, // Returns the maximum size of a subgroup within the dispatch\r
-    BuiltInSubgroupId, // \r
-    BuiltInSubgroupLocalInvocationId, // Returns the unique work-item ID within the current subgroup\r
-\r
-    BuiltInCount   // guard for validation, "default:" statements, etc.\r
-};\r
-\r
-enum SelectControl {\r
-    SelectControlNone,\r
-    SelectControlFlatten,\r
-    SelectControlDontFlatten,\r
-\r
-    SelectControlCount,       // guard for validation, "default:" statements, etc.\r
-};\r
-\r
-enum LoopControl {\r
-    LoopControlNone,\r
-    LoopControlUnroll,\r
-    LoopControlDontUnroll,\r
-\r
-    LoopControlCount,\r
+    BuiltInPosition = 0,\r
+    BuiltInPointSize = 1,\r
+    BuiltInClipVertex = 2,\r
+    BuiltInClipDistance = 3,\r
+    BuiltInCullDistance = 4,\r
+    BuiltInVertexId = 5,\r
+    BuiltInInstanceId = 6,\r
+    BuiltInPrimitiveId = 7,\r
+    BuiltInInvocationId = 8,\r
+    BuiltInLayer = 9,\r
+    BuiltInViewportIndex = 10,\r
+    BuiltInTessLevelOuter = 11,\r
+    BuiltInTessLevelInner = 12,\r
+    BuiltInTessCoord = 13,\r
+    BuiltInPatchVertices = 14,\r
+    BuiltInFragCoord = 15,\r
+    BuiltInPointCoord = 16,\r
+    BuiltInFrontFacing = 17,\r
+    BuiltInSampleId = 18,\r
+    BuiltInSamplePosition = 19,\r
+    BuiltInSampleMask = 20,\r
+    BuiltInFragColor = 21,\r
+    BuiltInFragDepth = 22,\r
+    BuiltInHelperInvocation = 23,\r
+    BuiltInNumWorkgroups = 24,\r
+    BuiltInWorkgroupSize = 25,\r
+    BuiltInWorkgroupId = 26,\r
+    BuiltInLocalInvocationId = 27,\r
+    BuiltInGlobalInvocationId = 28,\r
+    BuiltInLocalInvocationIndex = 29,\r
+    BuiltInWorkDim = 30,\r
+    BuiltInGlobalSize = 31,\r
+    BuiltInEnqueuedWorkgroupSize = 32,\r
+    BuiltInGlobalOffset = 33,\r
+    BuiltInGlobalLinearId = 34,\r
+    BuiltInWorkgroupLinearId = 35,\r
+    BuiltInSubgroupSize = 36,\r
+    BuiltInSubgroupMaxSize = 37,\r
+    BuiltInNumSubgroups = 38,\r
+    BuiltInNumEnqueuedSubgroups = 39,\r
+    BuiltInSubgroupId = 40,\r
+    BuiltInSubgroupLocalInvocationId = 41,\r
+};\r
+\r
+enum SelectionControlShift {\r
+    SelectionControlFlattenShift = 0,\r
+    SelectionControlDontFlattenShift = 1,\r
+};\r
+\r
+enum SelectionControlMask {\r
+    SelectionControlMaskNone = 0,\r
+    SelectionControlFlattenMask = 0x00000001,\r
+    SelectionControlDontFlattenMask = 0x00000002,\r
+};\r
+\r
+enum LoopControlShift {\r
+    LoopControlUnrollShift = 0,\r
+    LoopControlDontUnrollShift = 1,\r
+};\r
+\r
+enum LoopControlMask {\r
+    LoopControlMaskNone = 0,\r
+    LoopControlUnrollMask = 0x00000001,\r
+    LoopControlDontUnrollMask = 0x00000002,\r
+};\r
+\r
+enum FunctionControlShift {\r
+    FunctionControlInlineShift = 0,\r
+    FunctionControlDontInlineShift = 1,\r
+    FunctionControlPureShift = 2,\r
+    FunctionControlConstShift = 3,\r
 };\r
 \r
 enum FunctionControlMask {\r
-    FunctionControlNone       = 0x0,\r
-    FunctionControlInline     = 0x1,\r
-    FunctionControlDontInline = 0x2,\r
-    FunctionControlPure       = 0x4, \r
-    FunctionControlConst      = 0x8,\r
+    FunctionControlMaskNone = 0,\r
+    FunctionControlInlineMask = 0x00000001,\r
+    FunctionControlDontInlineMask = 0x00000002,\r
+    FunctionControlPureMask = 0x00000004,\r
+    FunctionControlConstMask = 0x00000008,\r
+};\r
 \r
-    FunctionControlCount      = 4,\r
+enum MemorySemanticsShift {\r
+    MemorySemanticsRelaxedShift = 0,\r
+    MemorySemanticsSequentiallyConsistentShift = 1,\r
+    MemorySemanticsAcquireShift = 2,\r
+    MemorySemanticsReleaseShift = 3,\r
+    MemorySemanticsUniformMemoryShift = 4,\r
+    MemorySemanticsSubgroupMemoryShift = 5,\r
+    MemorySemanticsWorkgroupLocalMemoryShift = 6,\r
+    MemorySemanticsWorkgroupGlobalMemoryShift = 7,\r
+    MemorySemanticsAtomicCounterMemoryShift = 8,\r
+    MemorySemanticsImageMemoryShift = 9,\r
 };\r
 \r
 enum MemorySemanticsMask {\r
-    MemorySemanticsRelaxed                = 0x0001,\r
-    MemorySemanticsSequentiallyConsistent = 0x0002,\r
-    MemorySemanticsAcquire                = 0x0004,\r
-    MemorySemanticsRelease                = 0x0008,\r
-\r
-    MemorySemanticsUniform                = 0x0010,\r
-    MemorySemanticsSubgroup               = 0x0020,\r
-    MemorySemanticsWorkgroupLocal         = 0x0040,\r
-    MemorySemanticsWorkgroupGlobal        = 0x0080,\r
-    MemorySemanticsAtomicCounter          = 0x0100,\r
-    MemorySemanticsImage                  = 0x0200,\r
-    MemorySemanticsAllMemory              = 0x03FF,\r
+    MemorySemanticsMaskNone = 0,\r
+    MemorySemanticsRelaxedMask = 0x00000001,\r
+    MemorySemanticsSequentiallyConsistentMask = 0x00000002,\r
+    MemorySemanticsAcquireMask = 0x00000004,\r
+    MemorySemanticsReleaseMask = 0x00000008,\r
+    MemorySemanticsUniformMemoryMask = 0x00000010,\r
+    MemorySemanticsSubgroupMemoryMask = 0x00000020,\r
+    MemorySemanticsWorkgroupLocalMemoryMask = 0x00000040,\r
+    MemorySemanticsWorkgroupGlobalMemoryMask = 0x00000080,\r
+    MemorySemanticsAtomicCounterMemoryMask = 0x00000100,\r
+    MemorySemanticsImageMemoryMask = 0x00000200,\r
+};\r
 \r
-    MemorySemanticsCount                  = 10\r
+enum MemoryAccessShift {\r
+    MemoryAccessVolatileShift = 0,\r
+    MemoryAccessAlignedShift = 1,\r
 };\r
 \r
 enum MemoryAccessMask {\r
-    MemoryAccessVolatile                  = 0x0001,\r
-    MemoryAccessAligned                   = 0x0002,\r
-\r
-    MemoryAccessCount                     = 2\r
+    MemoryAccessMaskNone = 0,\r
+    MemoryAccessVolatileMask = 0x00000001,\r
+    MemoryAccessAlignedMask = 0x00000002,\r
 };\r
 \r
 enum ExecutionScope {\r
-    ExecutionScopeCrossDevice,\r
-    ExecutionScopeDevice,\r
-    ExecutionScopeWorkgroup,\r
-    ExecutionScopeSubgroup,\r
-\r
-    ExecutionScopeCount     // guard for validation, "default:" statements, etc.\r
+    ExecutionScopeCrossDevice = 0,\r
+    ExecutionScopeDevice = 1,\r
+    ExecutionScopeWorkgroup = 2,\r
+    ExecutionScopeSubgroup = 3,\r
 };\r
 \r
 enum GroupOperation {\r
-    GroupOpReduce,\r
-    GroupOpInclusiveScan,\r
-    GroupOpExclusiveScan,\r
-\r
-    GroupOpCount\r
+    GroupOperationReduce = 0,\r
+    GroupOperationInclusiveScan = 1,\r
+    GroupOperationExclusiveScan = 2,\r
 };\r
 \r
 enum KernelEnqueueFlags {\r
-    EnqFlagNoWait,\r
-    EnqFlagWaitKernel,\r
-    EnqFlagWaitWaitWorgGroup,\r
-\r
-    EnqFlagCount\r
-};\r
-\r
-enum KernelProfilingInfo {\r
-    ProfInfoCmdExecTime = 0x01,\r
-    ProfilingInfoCount = 1\r
-};\r
-\r
-enum OpCode {\r
-    OpNop = 0,         // Not used.\r
-\r
-    OpSource,\r
-    OpSourceExtension,\r
-    OpExtension,\r
-    OpExtInstImport,\r
-\r
-    OpMemoryModel,\r
-    OpEntryPoint,\r
-    OpExecutionMode,\r
-\r
-    OpTypeVoid,\r
-    OpTypeBool,\r
-    OpTypeInt,\r
-    OpTypeFloat,\r
-    OpTypeVector,\r
-    OpTypeMatrix,\r
-    OpTypeSampler,\r
-    OpTypeFilter,\r
-    OpTypeArray,\r
-    OpTypeRuntimeArray,\r
-    OpTypeStruct,\r
-    OpTypeOpaque,\r
-    OpTypePointer,\r
-    OpTypeFunction,\r
-    OpTypeEvent,\r
-    OpTypeDeviceEvent,\r
-    OpTypeReserveId,\r
-    OpTypeQueue,\r
-    OpTypePipe,\r
-\r
-    OpConstantTrue,\r
-    OpConstantFalse,\r
-    OpConstant,\r
-    OpConstantComposite,\r
-    OpConstantSampler,\r
-    OpConstantNullPointer,\r
-    OpConstantNullObject,\r
-\r
-    OpSpecConstantTrue,\r
-    OpSpecConstantFalse,\r
-    OpSpecConstant,\r
-    OpSpecConstantComposite,\r
-\r
-    OpVariable,\r
-    OpVariableArray,\r
-\r
-    OpFunction,\r
-    OpFunctionParameter,\r
-    OpFunctionEnd,\r
-    OpFunctionCall,\r
-\r
-    OpExtInst,\r
-\r
-    OpUndef,\r
-\r
-    OpLoad,\r
-    OpStore,\r
-\r
-    OpPhi,\r
-\r
-    OpDecorationGroup,\r
-    OpDecorate,\r
-    OpMemberDecorate,\r
-    OpGroupDecorate,\r
-    OpGroupMemberDecorate,\r
-\r
-    OpName,\r
-    OpMemberName,\r
-    OpString,\r
-    OpLine,\r
-\r
-    OpVectorExtractDynamic,\r
-    OpVectorInsertDynamic,\r
-    OpVectorShuffle,\r
-    \r
-    OpCompositeConstruct,\r
-    OpCompositeExtract,\r
-    OpCompositeInsert,\r
-\r
-    OpCopyObject,\r
-    OpCopyMemory,\r
-    OpCopyMemorySized,\r
-\r
-    OpSampler,\r
-\r
-    OpTextureSample,\r
-    OpTextureSampleDref,\r
-    OpTextureSampleLod,\r
-    OpTextureSampleProj,\r
-    OpTextureSampleGrad,\r
-    OpTextureSampleOffset,\r
-    OpTextureSampleProjLod,\r
-    OpTextureSampleProjGrad,\r
-    OpTextureSampleLodOffset,\r
-    OpTextureSampleProjOffset,\r
-    OpTextureSampleGradOffset,\r
-    OpTextureSampleProjLodOffset,\r
-    OpTextureSampleProjGradOffset,\r
-\r
-    OpTextureFetchTexel,\r
-    OpTextureFetchTexelOffset,\r
-    OpTextureFetchSample,\r
-    OpTextureFetchBuffer,\r
-    OpTextureGather,\r
-    OpTextureGatherOffset,\r
-    OpTextureGatherOffsets,\r
-\r
-    OpTextureQuerySizeLod,\r
-    OpTextureQuerySize,\r
-    OpTextureQueryLod,\r
-    OpTextureQueryLevels,\r
-    OpTextureQuerySamples,\r
-\r
-    OpAccessChain,\r
-    OpInBoundsAccessChain,\r
-\r
-    OpSNegate,\r
-    OpFNegate,\r
-\r
-    OpNot,\r
-\r
-    OpAny,\r
-    OpAll,\r
-\r
-    OpConvertFToU,\r
-    OpConvertFToS,\r
-    OpConvertSToF,\r
-    OpConvertUToF,\r
-    OpUConvert,\r
-    OpSConvert,\r
-    OpFConvert,\r
-    OpConvertPtrToU,\r
-    OpConvertUToPtr,\r
-    OpPtrCastToGeneric,   // cast a pointer storage class to be in storage generic\r
-    OpGenericCastToPtr,   // cast a pointer in the generic storage class generic to another storage class\r
-    OpBitcast,\r
-\r
-    OpTranspose,\r
-\r
-    OpIsNan,\r
-    OpIsInf,\r
-    OpIsFinite,\r
-    OpIsNormal,\r
-    OpSignBitSet,\r
-    OpLessOrGreater,\r
-    OpOrdered,\r
-    OpUnordered,\r
-\r
-    OpArrayLength,\r
-\r
-    OpIAdd,\r
-    OpFAdd,\r
-    OpISub,\r
-    OpFSub,\r
-    OpIMul,\r
-    OpFMul,\r
-    OpUDiv,\r
-    OpSDiv,\r
-    OpFDiv,\r
-\r
-    OpUMod,\r
-    OpSRem,\r
-    OpSMod,\r
-    OpFRem,\r
-    OpFMod,\r
-\r
-    OpVectorTimesScalar,\r
-    OpMatrixTimesScalar,\r
-    OpVectorTimesMatrix,\r
-    OpMatrixTimesVector,\r
-    OpMatrixTimesMatrix,\r
-    OpOuterProduct,\r
-\r
-    OpDot,\r
-\r
-    OpShiftRightLogical,\r
-    OpShiftRightArithmetic,\r
-    OpShiftLeftLogical,\r
-    OpLogicalOr,\r
-    OpLogicalXor,\r
-    OpLogicalAnd,\r
-    \r
-    OpBitwiseOr,\r
-    OpBitwiseXor,\r
-    OpBitwiseAnd,\r
-    \r
-    OpSelect,\r
-\r
-    OpIEqual,\r
-    OpFOrdEqual,\r
-    OpFUnordEqual,\r
-\r
-    OpINotEqual,\r
-    OpFOrdNotEqual,\r
-    OpFUnordNotEqual,\r
-\r
-    OpULessThan,\r
-    OpSLessThan,\r
-    OpFOrdLessThan,\r
-    OpFUnordLessThan,\r
-\r
-    OpUGreaterThan,\r
-    OpSGreaterThan,\r
-    OpFOrdGreaterThan,\r
-    OpFUnordGreaterThan,\r
-\r
-    OpULessThanEqual,\r
-    OpSLessThanEqual,\r
-    OpFOrdLessThanEqual,\r
-    OpFUnordLessThanEqual,\r
-\r
-    OpUGreaterThanEqual,\r
-    OpSGreaterThanEqual,\r
-    OpFOrdGreaterThanEqual,\r
-    OpFUnordGreaterThanEqual,\r
-\r
-    OpDPdx,\r
-    OpDPdy,\r
-    OpFwidth,\r
-    OpDPdxFine,\r
-    OpDPdyFine,\r
-    OpFwidthFine,\r
-    OpDPdxCoarse,\r
-    OpDPdyCoarse,\r
-    OpFwidthCoarse,\r
-\r
-    OpEmitVertex,\r
-    OpEndPrimitive,\r
-    OpEmitStreamVertex,\r
-    OpEndStreamPrimitive,\r
-\r
-    OpControlBarrier,\r
-    OpMemoryBarrier,\r
-\r
-    OpImagePointer,\r
-\r
-    OpAtomicInit,\r
-    OpAtomicLoad,\r
-    OpAtomicStore,\r
-    OpAtomicExchange,\r
-    OpAtomicCompareExchange,\r
-    OpAtomicCompareExchangeWeak,\r
-    OpAtomicIIncrement,\r
-    OpAtomicIDecrement,\r
-    OpAtomicIAdd,\r
-    OpAtomicISub,\r
-    OpAtomicUMin,\r
-    OpAtomicUMax,\r
-    OpAtomicAnd,\r
-    OpAtomicOr,\r
-    OpAtomicXor,\r
-\r
-    OpLoopMerge,\r
-    OpSelectionMerge,\r
-    OpLabel,\r
-    OpBranch,\r
-    OpBranchConditional,\r
-    OpSwitch,\r
-    OpKill,\r
-    OpReturn,\r
-    OpReturnValue,\r
-\r
-    OpUnreachable,\r
-\r
-    OpLifetimeStart,\r
-    OpLifetimeStop,\r
-\r
-    OpCompileFlag,\r
-    \r
-    OpAsyncGroupCopy,\r
-    OpWaitGroupEvents, \r
-\r
-    OpGroupAll,\r
-    OpGroupAny,\r
-    OpGroupBroadcast,\r
-    \r
-    OpGroupIAdd,\r
-    OpGroupFAdd,\r
-    OpGroupFMin,\r
-    OpGroupUMin,\r
-    OpGroupSMin,\r
-    OpGroupFMax,\r
-    OpGroupUMax,\r
-    OpGroupSMax,\r
-\r
-    OpGenericCastToPtrExplicit,\r
-    OpGenericPtrMemSemantics,\r
-\r
-    OpReadPipe,\r
-    OpWritePipe,\r
-    OpReservedReadPipe,\r
-    OpReservedWritePipe,\r
-    OpReserveReadPipePackets,\r
-    OpReserveWritePipePackets,\r
-    OpCommitReadPipe,\r
-    OpCommitWritePipe,\r
-    OpIsValidReserveId,\r
-    OpGetNumPipePackets,\r
-    OpGetMaxPipePackets,\r
-    OpGroupReserveReadPipePackets,\r
-    OpGroupReserveWritePipePackets,\r
-    OpGroupCommitReadPipe,\r
-    OpGroupCommitWritePipe,    \r
-\r
-    OpEnqueueMarker,\r
-    OpEnqueueKernel,\r
-    OpGetKernelNDrangeSubGroupCount,\r
-    OpGetKernelNDrangeMaxSubGroupSize,\r
-\r
-    OpGetKernelWorkGroupSize,\r
-    OpGetKernelPreferredWorkGroupSizeMultiple,\r
-\r
-    OpRetainEvent,\r
-    OpReleaseEvent,\r
-\r
-    OpCreateUserEvent,\r
-    OpIsValidEvent,\r
-    OpSetUserEventStatus,\r
-    OpCaptureEventProfilingInfo,\r
-    OpGetDefaultQueue,\r
-    \r
-    OpBuildNDRange,\r
-\r
-    OpCount              // guard for validation, "default:" statements, etc.\r
+    KernelEnqueueFlagsNoWait = 0,\r
+    KernelEnqueueFlagsWaitKernel = 1,\r
+    KernelEnqueueFlagsWaitWorkGroup = 2,\r
+};\r
+\r
+enum KernelProfilingInfoShift {\r
+    KernelProfilingInfoCmdExecTimeShift = 0,\r
+};\r
+\r
+enum KernelProfilingInfoMask {\r
+    KernelProfilingInfoMaskNone = 0,\r
+    KernelProfilingInfoCmdExecTimeMask = 0x00000001,\r
+};\r
+\r
+enum Op {\r
+    OpNop = 0,\r
+    OpSource = 1,\r
+    OpSourceExtension = 2,\r
+    OpExtension = 3,\r
+    OpExtInstImport = 4,\r
+    OpMemoryModel = 5,\r
+    OpEntryPoint = 6,\r
+    OpExecutionMode = 7,\r
+    OpTypeVoid = 8,\r
+    OpTypeBool = 9,\r
+    OpTypeInt = 10,\r
+    OpTypeFloat = 11,\r
+    OpTypeVector = 12,\r
+    OpTypeMatrix = 13,\r
+    OpTypeSampler = 14,\r
+    OpTypeFilter = 15,\r
+    OpTypeArray = 16,\r
+    OpTypeRuntimeArray = 17,\r
+    OpTypeStruct = 18,\r
+    OpTypeOpaque = 19,\r
+    OpTypePointer = 20,\r
+    OpTypeFunction = 21,\r
+    OpTypeEvent = 22,\r
+    OpTypeDeviceEvent = 23,\r
+    OpTypeReserveId = 24,\r
+    OpTypeQueue = 25,\r
+    OpTypePipe = 26,\r
+    OpConstantTrue = 27,\r
+    OpConstantFalse = 28,\r
+    OpConstant = 29,\r
+    OpConstantComposite = 30,\r
+    OpConstantSampler = 31,\r
+    OpConstantNullPointer = 32,\r
+    OpConstantNullObject = 33,\r
+    OpSpecConstantTrue = 34,\r
+    OpSpecConstantFalse = 35,\r
+    OpSpecConstant = 36,\r
+    OpSpecConstantComposite = 37,\r
+    OpVariable = 38,\r
+    OpVariableArray = 39,\r
+    OpFunction = 40,\r
+    OpFunctionParameter = 41,\r
+    OpFunctionEnd = 42,\r
+    OpFunctionCall = 43,\r
+    OpExtInst = 44,\r
+    OpUndef = 45,\r
+    OpLoad = 46,\r
+    OpStore = 47,\r
+    OpPhi = 48,\r
+    OpDecorationGroup = 49,\r
+    OpDecorate = 50,\r
+    OpMemberDecorate = 51,\r
+    OpGroupDecorate = 52,\r
+    OpGroupMemberDecorate = 53,\r
+    OpName = 54,\r
+    OpMemberName = 55,\r
+    OpString = 56,\r
+    OpLine = 57,\r
+    OpVectorExtractDynamic = 58,\r
+    OpVectorInsertDynamic = 59,\r
+    OpVectorShuffle = 60,\r
+    OpCompositeConstruct = 61,\r
+    OpCompositeExtract = 62,\r
+    OpCompositeInsert = 63,\r
+    OpCopyObject = 64,\r
+    OpCopyMemory = 65,\r
+    OpCopyMemorySized = 66,\r
+    OpSampler = 67,\r
+    OpTextureSample = 68,\r
+    OpTextureSampleDref = 69,\r
+    OpTextureSampleLod = 70,\r
+    OpTextureSampleProj = 71,\r
+    OpTextureSampleGrad = 72,\r
+    OpTextureSampleOffset = 73,\r
+    OpTextureSampleProjLod = 74,\r
+    OpTextureSampleProjGrad = 75,\r
+    OpTextureSampleLodOffset = 76,\r
+    OpTextureSampleProjOffset = 77,\r
+    OpTextureSampleGradOffset = 78,\r
+    OpTextureSampleProjLodOffset = 79,\r
+    OpTextureSampleProjGradOffset = 80,\r
+    OpTextureFetchTexelLod = 81,\r
+    OpTextureFetchTexelOffset = 82,\r
+    OpTextureFetchSample = 83,\r
+    OpTextureFetchTexel = 84,\r
+    OpTextureGather = 85,\r
+    OpTextureGatherOffset = 86,\r
+    OpTextureGatherOffsets = 87,\r
+    OpTextureQuerySizeLod = 88,\r
+    OpTextureQuerySize = 89,\r
+    OpTextureQueryLod = 90,\r
+    OpTextureQueryLevels = 91,\r
+    OpTextureQuerySamples = 92,\r
+    OpAccessChain = 93,\r
+    OpInBoundsAccessChain = 94,\r
+    OpSNegate = 95,\r
+    OpFNegate = 96,\r
+    OpNot = 97,\r
+    OpAny = 98,\r
+    OpAll = 99,\r
+    OpConvertFToU = 100,\r
+    OpConvertFToS = 101,\r
+    OpConvertSToF = 102,\r
+    OpConvertUToF = 103,\r
+    OpUConvert = 104,\r
+    OpSConvert = 105,\r
+    OpFConvert = 106,\r
+    OpConvertPtrToU = 107,\r
+    OpConvertUToPtr = 108,\r
+    OpPtrCastToGeneric = 109,\r
+    OpGenericCastToPtr = 110,\r
+    OpBitcast = 111,\r
+    OpTranspose = 112,\r
+    OpIsNan = 113,\r
+    OpIsInf = 114,\r
+    OpIsFinite = 115,\r
+    OpIsNormal = 116,\r
+    OpSignBitSet = 117,\r
+    OpLessOrGreater = 118,\r
+    OpOrdered = 119,\r
+    OpUnordered = 120,\r
+    OpArrayLength = 121,\r
+    OpIAdd = 122,\r
+    OpFAdd = 123,\r
+    OpISub = 124,\r
+    OpFSub = 125,\r
+    OpIMul = 126,\r
+    OpFMul = 127,\r
+    OpUDiv = 128,\r
+    OpSDiv = 129,\r
+    OpFDiv = 130,\r
+    OpUMod = 131,\r
+    OpSRem = 132,\r
+    OpSMod = 133,\r
+    OpFRem = 134,\r
+    OpFMod = 135,\r
+    OpVectorTimesScalar = 136,\r
+    OpMatrixTimesScalar = 137,\r
+    OpVectorTimesMatrix = 138,\r
+    OpMatrixTimesVector = 139,\r
+    OpMatrixTimesMatrix = 140,\r
+    OpOuterProduct = 141,\r
+    OpDot = 142,\r
+    OpShiftRightLogical = 143,\r
+    OpShiftRightArithmetic = 144,\r
+    OpShiftLeftLogical = 145,\r
+    OpLogicalOr = 146,\r
+    OpLogicalXor = 147,\r
+    OpLogicalAnd = 148,\r
+    OpBitwiseOr = 149,\r
+    OpBitwiseXor = 150,\r
+    OpBitwiseAnd = 151,\r
+    OpSelect = 152,\r
+    OpIEqual = 153,\r
+    OpFOrdEqual = 154,\r
+    OpFUnordEqual = 155,\r
+    OpINotEqual = 156,\r
+    OpFOrdNotEqual = 157,\r
+    OpFUnordNotEqual = 158,\r
+    OpULessThan = 159,\r
+    OpSLessThan = 160,\r
+    OpFOrdLessThan = 161,\r
+    OpFUnordLessThan = 162,\r
+    OpUGreaterThan = 163,\r
+    OpSGreaterThan = 164,\r
+    OpFOrdGreaterThan = 165,\r
+    OpFUnordGreaterThan = 166,\r
+    OpULessThanEqual = 167,\r
+    OpSLessThanEqual = 168,\r
+    OpFOrdLessThanEqual = 169,\r
+    OpFUnordLessThanEqual = 170,\r
+    OpUGreaterThanEqual = 171,\r
+    OpSGreaterThanEqual = 172,\r
+    OpFOrdGreaterThanEqual = 173,\r
+    OpFUnordGreaterThanEqual = 174,\r
+    OpDPdx = 175,\r
+    OpDPdy = 176,\r
+    OpFwidth = 177,\r
+    OpDPdxFine = 178,\r
+    OpDPdyFine = 179,\r
+    OpFwidthFine = 180,\r
+    OpDPdxCoarse = 181,\r
+    OpDPdyCoarse = 182,\r
+    OpFwidthCoarse = 183,\r
+    OpEmitVertex = 184,\r
+    OpEndPrimitive = 185,\r
+    OpEmitStreamVertex = 186,\r
+    OpEndStreamPrimitive = 187,\r
+    OpControlBarrier = 188,\r
+    OpMemoryBarrier = 189,\r
+    OpImagePointer = 190,\r
+    OpAtomicInit = 191,\r
+    OpAtomicLoad = 192,\r
+    OpAtomicStore = 193,\r
+    OpAtomicExchange = 194,\r
+    OpAtomicCompareExchange = 195,\r
+    OpAtomicCompareExchangeWeak = 196,\r
+    OpAtomicIIncrement = 197,\r
+    OpAtomicIDecrement = 198,\r
+    OpAtomicIAdd = 199,\r
+    OpAtomicISub = 200,\r
+    OpAtomicUMin = 201,\r
+    OpAtomicUMax = 202,\r
+    OpAtomicAnd = 203,\r
+    OpAtomicOr = 204,\r
+    OpAtomicXor = 205,\r
+    OpLoopMerge = 206,\r
+    OpSelectionMerge = 207,\r
+    OpLabel = 208,\r
+    OpBranch = 209,\r
+    OpBranchConditional = 210,\r
+    OpSwitch = 211,\r
+    OpKill = 212,\r
+    OpReturn = 213,\r
+    OpReturnValue = 214,\r
+    OpUnreachable = 215,\r
+    OpLifetimeStart = 216,\r
+    OpLifetimeStop = 217,\r
+    OpCompileFlag = 218,\r
+    OpAsyncGroupCopy = 219,\r
+    OpWaitGroupEvents = 220,\r
+    OpGroupAll = 221,\r
+    OpGroupAny = 222,\r
+    OpGroupBroadcast = 223,\r
+    OpGroupIAdd = 224,\r
+    OpGroupFAdd = 225,\r
+    OpGroupFMin = 226,\r
+    OpGroupUMin = 227,\r
+    OpGroupSMin = 228,\r
+    OpGroupFMax = 229,\r
+    OpGroupUMax = 230,\r
+    OpGroupSMax = 231,\r
+    OpGenericCastToPtrExplicit = 232,\r
+    OpGenericPtrMemSemantics = 233,\r
+    OpReadPipe = 234,\r
+    OpWritePipe = 235,\r
+    OpReservedReadPipe = 236,\r
+    OpReservedWritePipe = 237,\r
+    OpReserveReadPipePackets = 238,\r
+    OpReserveWritePipePackets = 239,\r
+    OpCommitReadPipe = 240,\r
+    OpCommitWritePipe = 241,\r
+    OpIsValidReserveId = 242,\r
+    OpGetNumPipePackets = 243,\r
+    OpGetMaxPipePackets = 244,\r
+    OpGroupReserveReadPipePackets = 245,\r
+    OpGroupReserveWritePipePackets = 246,\r
+    OpGroupCommitReadPipe = 247,\r
+    OpGroupCommitWritePipe = 248,\r
+    OpEnqueueMarker = 249,\r
+    OpEnqueueKernel = 250,\r
+    OpGetKernelNDrangeSubGroupCount = 251,\r
+    OpGetKernelNDrangeMaxSubGroupSize = 252,\r
+    OpGetKernelWorkGroupSize = 253,\r
+    OpGetKernelPreferredWorkGroupSizeMultiple = 254,\r
+    OpRetainEvent = 255,\r
+    OpReleaseEvent = 256,\r
+    OpCreateUserEvent = 257,\r
+    OpIsValidEvent = 258,\r
+    OpSetUserEventStatus = 259,\r
+    OpCaptureEventProfilingInfo = 260,\r
+    OpGetDefaultQueue = 261,\r
+    OpBuildNDRange = 262,\r
+    OpSatConvertSToU = 263,\r
+    OpSatConvertUToS = 264,\r
+    OpAtomicIMin = 265,\r
+    OpAtomicIMax = 266,\r
 };\r
 \r
-#ifdef __cplusplus\r
 };  // end namespace spv\r
-#endif\r
 \r
-#endif // spirv_H\r
+#endif  // #ifdef __cplusplus\r
+\r
+\r
+#ifndef __cplusplus\r
+\r
+const int SpvMagicNumber = 0x07230203;\r
+const int SpvVersion = 99;\r
+\r
+typedef unsigned int SpvId;\r
+\r
+const unsigned int SpvOpCodeMask = 0xFFFF;\r
+const unsigned int SpvWordCountShift = 16;\r
+\r
+typedef enum SpvSourceLanguage_ {\r
+    SpvSourceLanguageUnknown = 0,\r
+    SpvSourceLanguageESSL = 1,\r
+    SpvSourceLanguageGLSL = 2,\r
+    SpvSourceLanguageOpenCL = 3,\r
+} SpvSourceLanguage;\r
+\r
+typedef enum SpvExecutionModel_ {\r
+    SpvExecutionModelVertex = 0,\r
+    SpvExecutionModelTessellationControl = 1,\r
+    SpvExecutionModelTessellationEvaluation = 2,\r
+    SpvExecutionModelGeometry = 3,\r
+    SpvExecutionModelFragment = 4,\r
+    SpvExecutionModelGLCompute = 5,\r
+    SpvExecutionModelKernel = 6,\r
+} SpvExecutionModel;\r
+\r
+typedef enum SpvAddressingModel_ {\r
+    SpvAddressingModelLogical = 0,\r
+    SpvAddressingModelPhysical32 = 1,\r
+    SpvAddressingModelPhysical64 = 2,\r
+} SpvAddressingModel;\r
+\r
+typedef enum SpvMemoryModel_ {\r
+    SpvMemoryModelSimple = 0,\r
+    SpvMemoryModelGLSL450 = 1,\r
+    SpvMemoryModelOpenCL12 = 2,\r
+    SpvMemoryModelOpenCL20 = 3,\r
+    SpvMemoryModelOpenCL21 = 4,\r
+} SpvMemoryModel;\r
+\r
+typedef enum SpvExecutionMode_ {\r
+    SpvExecutionModeInvocations = 0,\r
+    SpvExecutionModeSpacingEqual = 1,\r
+    SpvExecutionModeSpacingFractionalEven = 2,\r
+    SpvExecutionModeSpacingFractionalOdd = 3,\r
+    SpvExecutionModeVertexOrderCw = 4,\r
+    SpvExecutionModeVertexOrderCcw = 5,\r
+    SpvExecutionModePixelCenterInteger = 6,\r
+    SpvExecutionModeOriginUpperLeft = 7,\r
+    SpvExecutionModeEarlyFragmentTests = 8,\r
+    SpvExecutionModePointMode = 9,\r
+    SpvExecutionModeXfb = 10,\r
+    SpvExecutionModeDepthReplacing = 11,\r
+    SpvExecutionModeDepthAny = 12,\r
+    SpvExecutionModeDepthGreater = 13,\r
+    SpvExecutionModeDepthLess = 14,\r
+    SpvExecutionModeDepthUnchanged = 15,\r
+    SpvExecutionModeLocalSize = 16,\r
+    SpvExecutionModeLocalSizeHint = 17,\r
+    SpvExecutionModeInputPoints = 18,\r
+    SpvExecutionModeInputLines = 19,\r
+    SpvExecutionModeInputLinesAdjacency = 20,\r
+    SpvExecutionModeInputTriangles = 21,\r
+    SpvExecutionModeInputTrianglesAdjacency = 22,\r
+    SpvExecutionModeInputQuads = 23,\r
+    SpvExecutionModeInputIsolines = 24,\r
+    SpvExecutionModeOutputVertices = 25,\r
+    SpvExecutionModeOutputPoints = 26,\r
+    SpvExecutionModeOutputLineStrip = 27,\r
+    SpvExecutionModeOutputTriangleStrip = 28,\r
+    SpvExecutionModeVecTypeHint = 29,\r
+    SpvExecutionModeContractionOff = 30,\r
+} SpvExecutionMode;\r
+\r
+typedef enum SpvStorageClass_ {\r
+    SpvStorageClassUniformConstant = 0,\r
+    SpvStorageClassInput = 1,\r
+    SpvStorageClassUniform = 2,\r
+    SpvStorageClassOutput = 3,\r
+    SpvStorageClassWorkgroupLocal = 4,\r
+    SpvStorageClassWorkgroupGlobal = 5,\r
+    SpvStorageClassPrivateGlobal = 6,\r
+    SpvStorageClassFunction = 7,\r
+    SpvStorageClassGeneric = 8,\r
+    SpvStorageClassPrivate = 9,\r
+    SpvStorageClassAtomicCounter = 10,\r
+} SpvStorageClass;\r
+\r
+typedef enum SpvDim_ {\r
+    SpvDim1D = 0,\r
+    SpvDim2D = 1,\r
+    SpvDim3D = 2,\r
+    SpvDimCube = 3,\r
+    SpvDimRect = 4,\r
+    SpvDimBuffer = 5,\r
+} SpvDim;\r
+\r
+typedef enum SpvSamplerAddressingMode_ {\r
+    SpvSamplerAddressingModeNone = 0,\r
+    SpvSamplerAddressingModeClampToEdge = 2,\r
+    SpvSamplerAddressingModeClamp = 4,\r
+    SpvSamplerAddressingModeRepeat = 6,\r
+    SpvSamplerAddressingModeRepeatMirrored = 8,\r
+} SpvSamplerAddressingMode;\r
+\r
+typedef enum SpvSamplerFilterMode_ {\r
+    SpvSamplerFilterModeNearest = 16,\r
+    SpvSamplerFilterModeLinear = 32,\r
+} SpvSamplerFilterMode;\r
+\r
+typedef enum SpvFPFastMathModeShift_ {\r
+    SpvFPFastMathModeNotNaNShift = 0,\r
+    SpvFPFastMathModeNotInfShift = 1,\r
+    SpvFPFastMathModeNSZShift = 2,\r
+    SpvFPFastMathModeAllowRecipShift = 3,\r
+    SpvFPFastMathModeFastShift = 4,\r
+} SpvFPFastMathModeShift;\r
+\r
+typedef enum SpvFPFastMathModeMask_ {\r
+    SpvFPFastMathModeMaskNone = 0,\r
+    SpvFPFastMathModeNotNaNMask = 0x00000001,\r
+    SpvFPFastMathModeNotInfMask = 0x00000002,\r
+    SpvFPFastMathModeNSZMask = 0x00000004,\r
+    SpvFPFastMathModeAllowRecipMask = 0x00000008,\r
+    SpvFPFastMathModeFastMask = 0x00000010,\r
+} SpvFPFastMathModeMask;\r
+\r
+typedef enum SpvFPRoundingMode_ {\r
+    SpvFPRoundingModeRTE = 0,\r
+    SpvFPRoundingModeRTZ = 1,\r
+    SpvFPRoundingModeRTP = 2,\r
+    SpvFPRoundingModeRTN = 3,\r
+} SpvFPRoundingMode;\r
+\r
+typedef enum SpvLinkageType_ {\r
+    SpvLinkageTypeExport = 0,\r
+    SpvLinkageTypeImport = 1,\r
+} SpvLinkageType;\r
+\r
+typedef enum SpvAccessQualifier_ {\r
+    SpvAccessQualifierReadOnly = 0,\r
+    SpvAccessQualifierWriteOnly = 1,\r
+    SpvAccessQualifierReadWrite = 2,\r
+} SpvAccessQualifier;\r
+\r
+typedef enum SpvFunctionParameterAttribute_ {\r
+    SpvFunctionParameterAttributeZext = 0,\r
+    SpvFunctionParameterAttributeSext = 1,\r
+    SpvFunctionParameterAttributeByVal = 2,\r
+    SpvFunctionParameterAttributeSret = 3,\r
+    SpvFunctionParameterAttributeNoAlias = 4,\r
+    SpvFunctionParameterAttributeNoCapture = 5,\r
+    SpvFunctionParameterAttributeSVM = 6,\r
+    SpvFunctionParameterAttributeNoWrite = 7,\r
+    SpvFunctionParameterAttributeNoReadWrite = 8,\r
+} SpvFunctionParameterAttribute;\r
+\r
+typedef enum SpvDecoration_ {\r
+    SpvDecorationPrecisionLow = 0,\r
+    SpvDecorationPrecisionMedium = 1,\r
+    SpvDecorationPrecisionHigh = 2,\r
+    SpvDecorationBlock = 3,\r
+    SpvDecorationBufferBlock = 4,\r
+    SpvDecorationRowMajor = 5,\r
+    SpvDecorationColMajor = 6,\r
+    SpvDecorationGLSLShared = 7,\r
+    SpvDecorationGLSLStd140 = 8,\r
+    SpvDecorationGLSLStd430 = 9,\r
+    SpvDecorationGLSLPacked = 10,\r
+    SpvDecorationSmooth = 11,\r
+    SpvDecorationNoperspective = 12,\r
+    SpvDecorationFlat = 13,\r
+    SpvDecorationPatch = 14,\r
+    SpvDecorationCentroid = 15,\r
+    SpvDecorationSample = 16,\r
+    SpvDecorationInvariant = 17,\r
+    SpvDecorationRestrict = 18,\r
+    SpvDecorationAliased = 19,\r
+    SpvDecorationVolatile = 20,\r
+    SpvDecorationConstant = 21,\r
+    SpvDecorationCoherent = 22,\r
+    SpvDecorationNonwritable = 23,\r
+    SpvDecorationNonreadable = 24,\r
+    SpvDecorationUniform = 25,\r
+    SpvDecorationNoStaticUse = 26,\r
+    SpvDecorationCPacked = 27,\r
+    SpvDecorationSaturatedConversion = 28,\r
+    SpvDecorationStream = 29,\r
+    SpvDecorationLocation = 30,\r
+    SpvDecorationComponent = 31,\r
+    SpvDecorationIndex = 32,\r
+    SpvDecorationBinding = 33,\r
+    SpvDecorationDescriptorSet = 34,\r
+    SpvDecorationOffset = 35,\r
+    SpvDecorationAlignment = 36,\r
+    SpvDecorationXfbBuffer = 37,\r
+    SpvDecorationStride = 38,\r
+    SpvDecorationBuiltIn = 39,\r
+    SpvDecorationFuncParamAttr = 40,\r
+    SpvDecorationFPRoundingMode = 41,\r
+    SpvDecorationFPFastMathMode = 42,\r
+    SpvDecorationLinkageAttributes = 43,\r
+    SpvDecorationSpecId = 44,\r
+} SpvDecoration;\r
+\r
+typedef enum SpvBuiltIn_ {\r
+    SpvBuiltInPosition = 0,\r
+    SpvBuiltInPointSize = 1,\r
+    SpvBuiltInClipVertex = 2,\r
+    SpvBuiltInClipDistance = 3,\r
+    SpvBuiltInCullDistance = 4,\r
+    SpvBuiltInVertexId = 5,\r
+    SpvBuiltInInstanceId = 6,\r
+    SpvBuiltInPrimitiveId = 7,\r
+    SpvBuiltInInvocationId = 8,\r
+    SpvBuiltInLayer = 9,\r
+    SpvBuiltInViewportIndex = 10,\r
+    SpvBuiltInTessLevelOuter = 11,\r
+    SpvBuiltInTessLevelInner = 12,\r
+    SpvBuiltInTessCoord = 13,\r
+    SpvBuiltInPatchVertices = 14,\r
+    SpvBuiltInFragCoord = 15,\r
+    SpvBuiltInPointCoord = 16,\r
+    SpvBuiltInFrontFacing = 17,\r
+    SpvBuiltInSampleId = 18,\r
+    SpvBuiltInSamplePosition = 19,\r
+    SpvBuiltInSampleMask = 20,\r
+    SpvBuiltInFragColor = 21,\r
+    SpvBuiltInFragDepth = 22,\r
+    SpvBuiltInHelperInvocation = 23,\r
+    SpvBuiltInNumWorkgroups = 24,\r
+    SpvBuiltInWorkgroupSize = 25,\r
+    SpvBuiltInWorkgroupId = 26,\r
+    SpvBuiltInLocalInvocationId = 27,\r
+    SpvBuiltInGlobalInvocationId = 28,\r
+    SpvBuiltInLocalInvocationIndex = 29,\r
+    SpvBuiltInWorkDim = 30,\r
+    SpvBuiltInGlobalSize = 31,\r
+    SpvBuiltInEnqueuedWorkgroupSize = 32,\r
+    SpvBuiltInGlobalOffset = 33,\r
+    SpvBuiltInGlobalLinearId = 34,\r
+    SpvBuiltInWorkgroupLinearId = 35,\r
+    SpvBuiltInSubgroupSize = 36,\r
+    SpvBuiltInSubgroupMaxSize = 37,\r
+    SpvBuiltInNumSubgroups = 38,\r
+    SpvBuiltInNumEnqueuedSubgroups = 39,\r
+    SpvBuiltInSubgroupId = 40,\r
+    SpvBuiltInSubgroupLocalInvocationId = 41,\r
+} SpvBuiltIn;\r
+\r
+typedef enum SpvSelectionControlShift_ {\r
+    SpvSelectionControlFlattenShift = 0,\r
+    SpvSelectionControlDontFlattenShift = 1,\r
+} SpvSelectionControlShift;\r
+\r
+typedef enum SpvSelectionControlMask_ {\r
+    SpvSelectionControlMaskNone = 0,\r
+    SpvSelectionControlFlattenMask = 0x00000001,\r
+    SpvSelectionControlDontFlattenMask = 0x00000002,\r
+} SpvSelectionControlMask;\r
+\r
+typedef enum SpvLoopControlShift_ {\r
+    SpvLoopControlUnrollShift = 0,\r
+    SpvLoopControlDontUnrollShift = 1,\r
+} SpvLoopControlShift;\r
+\r
+typedef enum SpvLoopControlMask_ {\r
+    SpvLoopControlMaskNone = 0,\r
+    SpvLoopControlUnrollMask = 0x00000001,\r
+    SpvLoopControlDontUnrollMask = 0x00000002,\r
+} SpvLoopControlMask;\r
+\r
+typedef enum SpvFunctionControlShift_ {\r
+    SpvFunctionControlInlineShift = 0,\r
+    SpvFunctionControlDontInlineShift = 1,\r
+    SpvFunctionControlPureShift = 2,\r
+    SpvFunctionControlConstShift = 3,\r
+} SpvFunctionControlShift;\r
+\r
+typedef enum SpvFunctionControlMask_ {\r
+    SpvFunctionControlMaskNone = 0,\r
+    SpvFunctionControlInlineMask = 0x00000001,\r
+    SpvFunctionControlDontInlineMask = 0x00000002,\r
+    SpvFunctionControlPureMask = 0x00000004,\r
+    SpvFunctionControlConstMask = 0x00000008,\r
+} SpvFunctionControlMask;\r
+\r
+typedef enum SpvMemorySemanticsShift_ {\r
+    SpvMemorySemanticsRelaxedShift = 0,\r
+    SpvMemorySemanticsSequentiallyConsistentShift = 1,\r
+    SpvMemorySemanticsAcquireShift = 2,\r
+    SpvMemorySemanticsReleaseShift = 3,\r
+    SpvMemorySemanticsUniformMemoryShift = 4,\r
+    SpvMemorySemanticsSubgroupMemoryShift = 5,\r
+    SpvMemorySemanticsWorkgroupLocalMemoryShift = 6,\r
+    SpvMemorySemanticsWorkgroupGlobalMemoryShift = 7,\r
+    SpvMemorySemanticsAtomicCounterMemoryShift = 8,\r
+    SpvMemorySemanticsImageMemoryShift = 9,\r
+} SpvMemorySemanticsShift;\r
+\r
+typedef enum SpvMemorySemanticsMask_ {\r
+    SpvMemorySemanticsMaskNone = 0,\r
+    SpvMemorySemanticsRelaxedMask = 0x00000001,\r
+    SpvMemorySemanticsSequentiallyConsistentMask = 0x00000002,\r
+    SpvMemorySemanticsAcquireMask = 0x00000004,\r
+    SpvMemorySemanticsReleaseMask = 0x00000008,\r
+    SpvMemorySemanticsUniformMemoryMask = 0x00000010,\r
+    SpvMemorySemanticsSubgroupMemoryMask = 0x00000020,\r
+    SpvMemorySemanticsWorkgroupLocalMemoryMask = 0x00000040,\r
+    SpvMemorySemanticsWorkgroupGlobalMemoryMask = 0x00000080,\r
+    SpvMemorySemanticsAtomicCounterMemoryMask = 0x00000100,\r
+    SpvMemorySemanticsImageMemoryMask = 0x00000200,\r
+} SpvMemorySemanticsMask;\r
+\r
+typedef enum SpvMemoryAccessShift_ {\r
+    SpvMemoryAccessVolatileShift = 0,\r
+    SpvMemoryAccessAlignedShift = 1,\r
+} SpvMemoryAccessShift;\r
+\r
+typedef enum SpvMemoryAccessMask_ {\r
+    SpvMemoryAccessMaskNone = 0,\r
+    SpvMemoryAccessVolatileMask = 0x00000001,\r
+    SpvMemoryAccessAlignedMask = 0x00000002,\r
+} SpvMemoryAccessMask;\r
+\r
+typedef enum SpvExecutionScope_ {\r
+    SpvExecutionScopeCrossDevice = 0,\r
+    SpvExecutionScopeDevice = 1,\r
+    SpvExecutionScopeWorkgroup = 2,\r
+    SpvExecutionScopeSubgroup = 3,\r
+} SpvExecutionScope;\r
+\r
+typedef enum SpvGroupOperation_ {\r
+    SpvGroupOperationReduce = 0,\r
+    SpvGroupOperationInclusiveScan = 1,\r
+    SpvGroupOperationExclusiveScan = 2,\r
+} SpvGroupOperation;\r
+\r
+typedef enum SpvKernelEnqueueFlags_ {\r
+    SpvKernelEnqueueFlagsNoWait = 0,\r
+    SpvKernelEnqueueFlagsWaitKernel = 1,\r
+    SpvKernelEnqueueFlagsWaitWorkGroup = 2,\r
+} SpvKernelEnqueueFlags;\r
+\r
+typedef enum SpvKernelProfilingInfoShift_ {\r
+    SpvKernelProfilingInfoCmdExecTimeShift = 0,\r
+} SpvKernelProfilingInfoShift;\r
+\r
+typedef enum SpvKernelProfilingInfoMask_ {\r
+    SpvKernelProfilingInfoMaskNone = 0,\r
+    SpvKernelProfilingInfoCmdExecTimeMask = 0x00000001,\r
+} SpvKernelProfilingInfoMask;\r
+\r
+typedef enum SpvOp_ {\r
+    SpvOpNop = 0,\r
+    SpvOpSource = 1,\r
+    SpvOpSourceExtension = 2,\r
+    SpvOpExtension = 3,\r
+    SpvOpExtInstImport = 4,\r
+    SpvOpMemoryModel = 5,\r
+    SpvOpEntryPoint = 6,\r
+    SpvOpExecutionMode = 7,\r
+    SpvOpTypeVoid = 8,\r
+    SpvOpTypeBool = 9,\r
+    SpvOpTypeInt = 10,\r
+    SpvOpTypeFloat = 11,\r
+    SpvOpTypeVector = 12,\r
+    SpvOpTypeMatrix = 13,\r
+    SpvOpTypeSampler = 14,\r
+    SpvOpTypeFilter = 15,\r
+    SpvOpTypeArray = 16,\r
+    SpvOpTypeRuntimeArray = 17,\r
+    SpvOpTypeStruct = 18,\r
+    SpvOpTypeOpaque = 19,\r
+    SpvOpTypePointer = 20,\r
+    SpvOpTypeFunction = 21,\r
+    SpvOpTypeEvent = 22,\r
+    SpvOpTypeDeviceEvent = 23,\r
+    SpvOpTypeReserveId = 24,\r
+    SpvOpTypeQueue = 25,\r
+    SpvOpTypePipe = 26,\r
+    SpvOpConstantTrue = 27,\r
+    SpvOpConstantFalse = 28,\r
+    SpvOpConstant = 29,\r
+    SpvOpConstantComposite = 30,\r
+    SpvOpConstantSampler = 31,\r
+    SpvOpConstantNullPointer = 32,\r
+    SpvOpConstantNullObject = 33,\r
+    SpvOpSpecConstantTrue = 34,\r
+    SpvOpSpecConstantFalse = 35,\r
+    SpvOpSpecConstant = 36,\r
+    SpvOpSpecConstantComposite = 37,\r
+    SpvOpVariable = 38,\r
+    SpvOpVariableArray = 39,\r
+    SpvOpFunction = 40,\r
+    SpvOpFunctionParameter = 41,\r
+    SpvOpFunctionEnd = 42,\r
+    SpvOpFunctionCall = 43,\r
+    SpvOpExtInst = 44,\r
+    SpvOpUndef = 45,\r
+    SpvOpLoad = 46,\r
+    SpvOpStore = 47,\r
+    SpvOpPhi = 48,\r
+    SpvOpDecorationGroup = 49,\r
+    SpvOpDecorate = 50,\r
+    SpvOpMemberDecorate = 51,\r
+    SpvOpGroupDecorate = 52,\r
+    SpvOpGroupMemberDecorate = 53,\r
+    SpvOpName = 54,\r
+    SpvOpMemberName = 55,\r
+    SpvOpString = 56,\r
+    SpvOpLine = 57,\r
+    SpvOpVectorExtractDynamic = 58,\r
+    SpvOpVectorInsertDynamic = 59,\r
+    SpvOpVectorShuffle = 60,\r
+    SpvOpCompositeConstruct = 61,\r
+    SpvOpCompositeExtract = 62,\r
+    SpvOpCompositeInsert = 63,\r
+    SpvOpCopyObject = 64,\r
+    SpvOpCopyMemory = 65,\r
+    SpvOpCopyMemorySized = 66,\r
+    SpvOpSampler = 67,\r
+    SpvOpTextureSample = 68,\r
+    SpvOpTextureSampleDref = 69,\r
+    SpvOpTextureSampleLod = 70,\r
+    SpvOpTextureSampleProj = 71,\r
+    SpvOpTextureSampleGrad = 72,\r
+    SpvOpTextureSampleOffset = 73,\r
+    SpvOpTextureSampleProjLod = 74,\r
+    SpvOpTextureSampleProjGrad = 75,\r
+    SpvOpTextureSampleLodOffset = 76,\r
+    SpvOpTextureSampleProjOffset = 77,\r
+    SpvOpTextureSampleGradOffset = 78,\r
+    SpvOpTextureSampleProjLodOffset = 79,\r
+    SpvOpTextureSampleProjGradOffset = 80,\r
+    SpvOpTextureFetchTexelLod = 81,\r
+    SpvOpTextureFetchTexelOffset = 82,\r
+    SpvOpTextureFetchSample = 83,\r
+    SpvOpTextureFetchTexel = 84,\r
+    SpvOpTextureGather = 85,\r
+    SpvOpTextureGatherOffset = 86,\r
+    SpvOpTextureGatherOffsets = 87,\r
+    SpvOpTextureQuerySizeLod = 88,\r
+    SpvOpTextureQuerySize = 89,\r
+    SpvOpTextureQueryLod = 90,\r
+    SpvOpTextureQueryLevels = 91,\r
+    SpvOpTextureQuerySamples = 92,\r
+    SpvOpAccessChain = 93,\r
+    SpvOpInBoundsAccessChain = 94,\r
+    SpvOpSNegate = 95,\r
+    SpvOpFNegate = 96,\r
+    SpvOpNot = 97,\r
+    SpvOpAny = 98,\r
+    SpvOpAll = 99,\r
+    SpvOpConvertFToU = 100,\r
+    SpvOpConvertFToS = 101,\r
+    SpvOpConvertSToF = 102,\r
+    SpvOpConvertUToF = 103,\r
+    SpvOpUConvert = 104,\r
+    SpvOpSConvert = 105,\r
+    SpvOpFConvert = 106,\r
+    SpvOpConvertPtrToU = 107,\r
+    SpvOpConvertUToPtr = 108,\r
+    SpvOpPtrCastToGeneric = 109,\r
+    SpvOpGenericCastToPtr = 110,\r
+    SpvOpBitcast = 111,\r
+    SpvOpTranspose = 112,\r
+    SpvOpIsNan = 113,\r
+    SpvOpIsInf = 114,\r
+    SpvOpIsFinite = 115,\r
+    SpvOpIsNormal = 116,\r
+    SpvOpSignBitSet = 117,\r
+    SpvOpLessOrGreater = 118,\r
+    SpvOpOrdered = 119,\r
+    SpvOpUnordered = 120,\r
+    SpvOpArrayLength = 121,\r
+    SpvOpIAdd = 122,\r
+    SpvOpFAdd = 123,\r
+    SpvOpISub = 124,\r
+    SpvOpFSub = 125,\r
+    SpvOpIMul = 126,\r
+    SpvOpFMul = 127,\r
+    SpvOpUDiv = 128,\r
+    SpvOpSDiv = 129,\r
+    SpvOpFDiv = 130,\r
+    SpvOpUMod = 131,\r
+    SpvOpSRem = 132,\r
+    SpvOpSMod = 133,\r
+    SpvOpFRem = 134,\r
+    SpvOpFMod = 135,\r
+    SpvOpVectorTimesScalar = 136,\r
+    SpvOpMatrixTimesScalar = 137,\r
+    SpvOpVectorTimesMatrix = 138,\r
+    SpvOpMatrixTimesVector = 139,\r
+    SpvOpMatrixTimesMatrix = 140,\r
+    SpvOpOuterProduct = 141,\r
+    SpvOpDot = 142,\r
+    SpvOpShiftRightLogical = 143,\r
+    SpvOpShiftRightArithmetic = 144,\r
+    SpvOpShiftLeftLogical = 145,\r
+    SpvOpLogicalOr = 146,\r
+    SpvOpLogicalXor = 147,\r
+    SpvOpLogicalAnd = 148,\r
+    SpvOpBitwiseOr = 149,\r
+    SpvOpBitwiseXor = 150,\r
+    SpvOpBitwiseAnd = 151,\r
+    SpvOpSelect = 152,\r
+    SpvOpIEqual = 153,\r
+    SpvOpFOrdEqual = 154,\r
+    SpvOpFUnordEqual = 155,\r
+    SpvOpINotEqual = 156,\r
+    SpvOpFOrdNotEqual = 157,\r
+    SpvOpFUnordNotEqual = 158,\r
+    SpvOpULessThan = 159,\r
+    SpvOpSLessThan = 160,\r
+    SpvOpFOrdLessThan = 161,\r
+    SpvOpFUnordLessThan = 162,\r
+    SpvOpUGreaterThan = 163,\r
+    SpvOpSGreaterThan = 164,\r
+    SpvOpFOrdGreaterThan = 165,\r
+    SpvOpFUnordGreaterThan = 166,\r
+    SpvOpULessThanEqual = 167,\r
+    SpvOpSLessThanEqual = 168,\r
+    SpvOpFOrdLessThanEqual = 169,\r
+    SpvOpFUnordLessThanEqual = 170,\r
+    SpvOpUGreaterThanEqual = 171,\r
+    SpvOpSGreaterThanEqual = 172,\r
+    SpvOpFOrdGreaterThanEqual = 173,\r
+    SpvOpFUnordGreaterThanEqual = 174,\r
+    SpvOpDPdx = 175,\r
+    SpvOpDPdy = 176,\r
+    SpvOpFwidth = 177,\r
+    SpvOpDPdxFine = 178,\r
+    SpvOpDPdyFine = 179,\r
+    SpvOpFwidthFine = 180,\r
+    SpvOpDPdxCoarse = 181,\r
+    SpvOpDPdyCoarse = 182,\r
+    SpvOpFwidthCoarse = 183,\r
+    SpvOpEmitVertex = 184,\r
+    SpvOpEndPrimitive = 185,\r
+    SpvOpEmitStreamVertex = 186,\r
+    SpvOpEndStreamPrimitive = 187,\r
+    SpvOpControlBarrier = 188,\r
+    SpvOpMemoryBarrier = 189,\r
+    SpvOpImagePointer = 190,\r
+    SpvOpAtomicInit = 191,\r
+    SpvOpAtomicLoad = 192,\r
+    SpvOpAtomicStore = 193,\r
+    SpvOpAtomicExchange = 194,\r
+    SpvOpAtomicCompareExchange = 195,\r
+    SpvOpAtomicCompareExchangeWeak = 196,\r
+    SpvOpAtomicIIncrement = 197,\r
+    SpvOpAtomicIDecrement = 198,\r
+    SpvOpAtomicIAdd = 199,\r
+    SpvOpAtomicISub = 200,\r
+    SpvOpAtomicUMin = 201,\r
+    SpvOpAtomicUMax = 202,\r
+    SpvOpAtomicAnd = 203,\r
+    SpvOpAtomicOr = 204,\r
+    SpvOpAtomicXor = 205,\r
+    SpvOpLoopMerge = 206,\r
+    SpvOpSelectionMerge = 207,\r
+    SpvOpLabel = 208,\r
+    SpvOpBranch = 209,\r
+    SpvOpBranchConditional = 210,\r
+    SpvOpSwitch = 211,\r
+    SpvOpKill = 212,\r
+    SpvOpReturn = 213,\r
+    SpvOpReturnValue = 214,\r
+    SpvOpUnreachable = 215,\r
+    SpvOpLifetimeStart = 216,\r
+    SpvOpLifetimeStop = 217,\r
+    SpvOpCompileFlag = 218,\r
+    SpvOpAsyncGroupCopy = 219,\r
+    SpvOpWaitGroupEvents = 220,\r
+    SpvOpGroupAll = 221,\r
+    SpvOpGroupAny = 222,\r
+    SpvOpGroupBroadcast = 223,\r
+    SpvOpGroupIAdd = 224,\r
+    SpvOpGroupFAdd = 225,\r
+    SpvOpGroupFMin = 226,\r
+    SpvOpGroupUMin = 227,\r
+    SpvOpGroupSMin = 228,\r
+    SpvOpGroupFMax = 229,\r
+    SpvOpGroupUMax = 230,\r
+    SpvOpGroupSMax = 231,\r
+    SpvOpGenericCastToPtrExplicit = 232,\r
+    SpvOpGenericPtrMemSemantics = 233,\r
+    SpvOpReadPipe = 234,\r
+    SpvOpWritePipe = 235,\r
+    SpvOpReservedReadPipe = 236,\r
+    SpvOpReservedWritePipe = 237,\r
+    SpvOpReserveReadPipePackets = 238,\r
+    SpvOpReserveWritePipePackets = 239,\r
+    SpvOpCommitReadPipe = 240,\r
+    SpvOpCommitWritePipe = 241,\r
+    SpvOpIsValidReserveId = 242,\r
+    SpvOpGetNumPipePackets = 243,\r
+    SpvOpGetMaxPipePackets = 244,\r
+    SpvOpGroupReserveReadPipePackets = 245,\r
+    SpvOpGroupReserveWritePipePackets = 246,\r
+    SpvOpGroupCommitReadPipe = 247,\r
+    SpvOpGroupCommitWritePipe = 248,\r
+    SpvOpEnqueueMarker = 249,\r
+    SpvOpEnqueueKernel = 250,\r
+    SpvOpGetKernelNDrangeSubGroupCount = 251,\r
+    SpvOpGetKernelNDrangeMaxSubGroupSize = 252,\r
+    SpvOpGetKernelWorkGroupSize = 253,\r
+    SpvOpGetKernelPreferredWorkGroupSizeMultiple = 254,\r
+    SpvOpRetainEvent = 255,\r
+    SpvOpReleaseEvent = 256,\r
+    SpvOpCreateUserEvent = 257,\r
+    SpvOpIsValidEvent = 258,\r
+    SpvOpSetUserEventStatus = 259,\r
+    SpvOpCaptureEventProfilingInfo = 260,\r
+    SpvOpGetDefaultQueue = 261,\r
+    SpvOpBuildNDRange = 262,\r
+    SpvOpSatConvertSToU = 263,\r
+    SpvOpSatConvertUToS = 264,\r
+    SpvOpAtomicIMin = 265,\r
+    SpvOpAtomicIMax = 266,\r
+} SpvOp;\r
+\r
+#endif  // #ifndef __cplusplus\r
+\r
+#endif  // #ifndef spirv_H\r
index 5bea596..585af82 100644 (file)
@@ -60,14 +60,21 @@ namespace spv {
 class Function;\r
 class Module;\r
 \r
+const Id NoResult = 0;\r
+const Id NoType = 0;\r
+\r
+const unsigned int BadValue = 0xFFFFFFFF;\r
+const Decoration NoPrecision = (Decoration)BadValue;\r
+const MemorySemanticsMask MemorySemanticsAllMemory = (MemorySemanticsMask)0x3FF;\r
+\r
 //\r
 // SPIR-V IR instruction.\r
 //\r
 \r
 class Instruction {\r
 public:\r
-    Instruction(Id resultId, Id typeId, OpCode opCode) : resultId(resultId), typeId(typeId), opCode(opCode), string(0) { }\r
-    explicit Instruction(OpCode opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), string(0) { }\r
+    Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), string(0) { }\r
+    explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), string(0) { }\r
     virtual ~Instruction()\r
     {\r
         delete string;\r
@@ -103,7 +110,7 @@ public:
 \r
         originalString = str;\r
     }\r
-    OpCode getOpCode() const { return opCode; }\r
+    Op getOpCode() const { return opCode; }\r
     int getNumOperands() const { return operands.size(); }\r
     Id getResultId() const { return resultId; }\r
     Id getTypeId() const { return typeId; }\r
@@ -143,7 +150,7 @@ protected:
     Instruction(const Instruction&);\r
     Id resultId;\r
     Id typeId;\r
-    OpCode opCode;\r
+    Op opCode;\r
     std::vector<Id> operands;\r
     std::vector<unsigned int>* string; // usually non-existent\r
     std::string originalString;        // could be optimized away; convenience for getting string operand\r
@@ -310,7 +317,7 @@ __inline Function::Function(Id id, Id resultType, Id functionType, Id firstParam
     : parent(parent), functionInstruction(id, resultType, OpFunction)\r
 {\r
     // OpFunction\r
-    functionInstruction.addImmediateOperand(FunctionControlNone);\r
+    functionInstruction.addImmediateOperand(FunctionControlMaskNone);\r
     functionInstruction.addIdOperand(functionType);\r
     parent.mapInstruction(&functionInstruction);\r
     parent.addFunction(this);\r