packages feed

spirv-reflect-ffi 0.2 → 0.3

raw patch · 8 files changed

+10654/−7682 lines, 8 filesdep +spirv-enumdep +vector-algorithmsdep ~spirv-reflect-types

Dependencies added: spirv-enum, vector-algorithms

Dependency ranges changed: spirv-reflect-types

Files

ChangeLog.md view
@@ -1,12 +1,20 @@ # Changelog for spirv-reflect-ffi +## [0.3] - 2024-09-30++* Update cbits to `vulkan-sdk-1.3.290`.+* Updates for `spirv-reflect-types-0.3`.++[0.3]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.3-ffi+ ## [0.2] - 2022-09-04  * Fixed a mess in input/output interface variables. +[0.2]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.2-ffi+ ## [0.1] - 2022-09-04  * Initial release.  [0.1]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.1-ffi-[0.2]: https://gitlab.com/dpwiz/spirv-reflect/-/tree/v0.2-ffi
cbits/include/spirv/unified1/spirv.h view
@@ -1,2541 +1,4889 @@ /* ** Copyright (c) 2014-2020 The Khronos Group Inc.-** -** Permission is hereby granted, free of charge, to any person obtaining a copy-** of this software and/or associated documentation files (the "Materials"),-** to deal in the Materials without restriction, including without limitation-** the rights to use, copy, modify, merge, publish, distribute, sublicense,-** and/or sell copies of the Materials, and to permit persons to whom the-** Materials are furnished to do so, subject to the following conditions:-** -** The above copyright notice and this permission notice shall be included in-** all copies or substantial portions of the Materials.-** -** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS-** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND-** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -** -** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS-** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,-** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL-** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER-** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING-** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS-** IN THE MATERIALS.-*/--/*-** This header is automatically generated by the same tool that creates-** the Binary Section of the SPIR-V specification.-*/--/*-** Enumeration tokens for SPIR-V, in various styles:-**   C, C++, C++11, JSON, Lua, Python, C#, D-** -** - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL-** - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL-** - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL-** - Lua will use tables, e.g.: spv.SourceLanguage.GLSL-** - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']-** - C# will use enum classes in the Specification class located in the "Spv" namespace,-**     e.g.: Spv.Specification.SourceLanguage.GLSL-** - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL-** -** Some tokens act like mask values, which can be OR'd together,-** while others are mutually exclusive.  The mask-like ones have-** "Mask" in their name, and a parallel enum that has the shift-** amount (1 << x) for each corresponding enumerant.-*/--#ifndef spirv_H-#define spirv_H--typedef unsigned int SpvId;--#define SPV_VERSION 0x10600-#define SPV_REVISION 1--static const unsigned int SpvMagicNumber = 0x07230203;-static const unsigned int SpvVersion = 0x00010600;-static const unsigned int SpvRevision = 1;-static const unsigned int SpvOpCodeMask = 0xffff;-static const unsigned int SpvWordCountShift = 16;--typedef enum SpvSourceLanguage_ {-    SpvSourceLanguageUnknown = 0,-    SpvSourceLanguageESSL = 1,-    SpvSourceLanguageGLSL = 2,-    SpvSourceLanguageOpenCL_C = 3,-    SpvSourceLanguageOpenCL_CPP = 4,-    SpvSourceLanguageHLSL = 5,-    SpvSourceLanguageCPP_for_OpenCL = 6,-    SpvSourceLanguageSYCL = 7,-    SpvSourceLanguageMax = 0x7fffffff,-} SpvSourceLanguage;--typedef enum SpvExecutionModel_ {-    SpvExecutionModelVertex = 0,-    SpvExecutionModelTessellationControl = 1,-    SpvExecutionModelTessellationEvaluation = 2,-    SpvExecutionModelGeometry = 3,-    SpvExecutionModelFragment = 4,-    SpvExecutionModelGLCompute = 5,-    SpvExecutionModelKernel = 6,-    SpvExecutionModelTaskNV = 5267,-    SpvExecutionModelMeshNV = 5268,-    SpvExecutionModelRayGenerationKHR = 5313,-    SpvExecutionModelRayGenerationNV = 5313,-    SpvExecutionModelIntersectionKHR = 5314,-    SpvExecutionModelIntersectionNV = 5314,-    SpvExecutionModelAnyHitKHR = 5315,-    SpvExecutionModelAnyHitNV = 5315,-    SpvExecutionModelClosestHitKHR = 5316,-    SpvExecutionModelClosestHitNV = 5316,-    SpvExecutionModelMissKHR = 5317,-    SpvExecutionModelMissNV = 5317,-    SpvExecutionModelCallableKHR = 5318,-    SpvExecutionModelCallableNV = 5318,-    SpvExecutionModelMax = 0x7fffffff,-} SpvExecutionModel;--typedef enum SpvAddressingModel_ {-    SpvAddressingModelLogical = 0,-    SpvAddressingModelPhysical32 = 1,-    SpvAddressingModelPhysical64 = 2,-    SpvAddressingModelPhysicalStorageBuffer64 = 5348,-    SpvAddressingModelPhysicalStorageBuffer64EXT = 5348,-    SpvAddressingModelMax = 0x7fffffff,-} SpvAddressingModel;--typedef enum SpvMemoryModel_ {-    SpvMemoryModelSimple = 0,-    SpvMemoryModelGLSL450 = 1,-    SpvMemoryModelOpenCL = 2,-    SpvMemoryModelVulkan = 3,-    SpvMemoryModelVulkanKHR = 3,-    SpvMemoryModelMax = 0x7fffffff,-} SpvMemoryModel;--typedef enum SpvExecutionMode_ {-    SpvExecutionModeInvocations = 0,-    SpvExecutionModeSpacingEqual = 1,-    SpvExecutionModeSpacingFractionalEven = 2,-    SpvExecutionModeSpacingFractionalOdd = 3,-    SpvExecutionModeVertexOrderCw = 4,-    SpvExecutionModeVertexOrderCcw = 5,-    SpvExecutionModePixelCenterInteger = 6,-    SpvExecutionModeOriginUpperLeft = 7,-    SpvExecutionModeOriginLowerLeft = 8,-    SpvExecutionModeEarlyFragmentTests = 9,-    SpvExecutionModePointMode = 10,-    SpvExecutionModeXfb = 11,-    SpvExecutionModeDepthReplacing = 12,-    SpvExecutionModeDepthGreater = 14,-    SpvExecutionModeDepthLess = 15,-    SpvExecutionModeDepthUnchanged = 16,-    SpvExecutionModeLocalSize = 17,-    SpvExecutionModeLocalSizeHint = 18,-    SpvExecutionModeInputPoints = 19,-    SpvExecutionModeInputLines = 20,-    SpvExecutionModeInputLinesAdjacency = 21,-    SpvExecutionModeTriangles = 22,-    SpvExecutionModeInputTrianglesAdjacency = 23,-    SpvExecutionModeQuads = 24,-    SpvExecutionModeIsolines = 25,-    SpvExecutionModeOutputVertices = 26,-    SpvExecutionModeOutputPoints = 27,-    SpvExecutionModeOutputLineStrip = 28,-    SpvExecutionModeOutputTriangleStrip = 29,-    SpvExecutionModeVecTypeHint = 30,-    SpvExecutionModeContractionOff = 31,-    SpvExecutionModeInitializer = 33,-    SpvExecutionModeFinalizer = 34,-    SpvExecutionModeSubgroupSize = 35,-    SpvExecutionModeSubgroupsPerWorkgroup = 36,-    SpvExecutionModeSubgroupsPerWorkgroupId = 37,-    SpvExecutionModeLocalSizeId = 38,-    SpvExecutionModeLocalSizeHintId = 39,-    SpvExecutionModeSubgroupUniformControlFlowKHR = 4421,-    SpvExecutionModePostDepthCoverage = 4446,-    SpvExecutionModeDenormPreserve = 4459,-    SpvExecutionModeDenormFlushToZero = 4460,-    SpvExecutionModeSignedZeroInfNanPreserve = 4461,-    SpvExecutionModeRoundingModeRTE = 4462,-    SpvExecutionModeRoundingModeRTZ = 4463,-    SpvExecutionModeStencilRefReplacingEXT = 5027,-    SpvExecutionModeOutputLinesNV = 5269,-    SpvExecutionModeOutputPrimitivesNV = 5270,-    SpvExecutionModeDerivativeGroupQuadsNV = 5289,-    SpvExecutionModeDerivativeGroupLinearNV = 5290,-    SpvExecutionModeOutputTrianglesNV = 5298,-    SpvExecutionModePixelInterlockOrderedEXT = 5366,-    SpvExecutionModePixelInterlockUnorderedEXT = 5367,-    SpvExecutionModeSampleInterlockOrderedEXT = 5368,-    SpvExecutionModeSampleInterlockUnorderedEXT = 5369,-    SpvExecutionModeShadingRateInterlockOrderedEXT = 5370,-    SpvExecutionModeShadingRateInterlockUnorderedEXT = 5371,-    SpvExecutionModeSharedLocalMemorySizeINTEL = 5618,-    SpvExecutionModeRoundingModeRTPINTEL = 5620,-    SpvExecutionModeRoundingModeRTNINTEL = 5621,-    SpvExecutionModeFloatingPointModeALTINTEL = 5622,-    SpvExecutionModeFloatingPointModeIEEEINTEL = 5623,-    SpvExecutionModeMaxWorkgroupSizeINTEL = 5893,-    SpvExecutionModeMaxWorkDimINTEL = 5894,-    SpvExecutionModeNoGlobalOffsetINTEL = 5895,-    SpvExecutionModeNumSIMDWorkitemsINTEL = 5896,-    SpvExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,-    SpvExecutionModeNamedBarrierCountINTEL = 6417,-    SpvExecutionModeMax = 0x7fffffff,-} SpvExecutionMode;--typedef enum SpvStorageClass_ {-    SpvStorageClassUniformConstant = 0,-    SpvStorageClassInput = 1,-    SpvStorageClassUniform = 2,-    SpvStorageClassOutput = 3,-    SpvStorageClassWorkgroup = 4,-    SpvStorageClassCrossWorkgroup = 5,-    SpvStorageClassPrivate = 6,-    SpvStorageClassFunction = 7,-    SpvStorageClassGeneric = 8,-    SpvStorageClassPushConstant = 9,-    SpvStorageClassAtomicCounter = 10,-    SpvStorageClassImage = 11,-    SpvStorageClassStorageBuffer = 12,-    SpvStorageClassCallableDataKHR = 5328,-    SpvStorageClassCallableDataNV = 5328,-    SpvStorageClassIncomingCallableDataKHR = 5329,-    SpvStorageClassIncomingCallableDataNV = 5329,-    SpvStorageClassRayPayloadKHR = 5338,-    SpvStorageClassRayPayloadNV = 5338,-    SpvStorageClassHitAttributeKHR = 5339,-    SpvStorageClassHitAttributeNV = 5339,-    SpvStorageClassIncomingRayPayloadKHR = 5342,-    SpvStorageClassIncomingRayPayloadNV = 5342,-    SpvStorageClassShaderRecordBufferKHR = 5343,-    SpvStorageClassShaderRecordBufferNV = 5343,-    SpvStorageClassPhysicalStorageBuffer = 5349,-    SpvStorageClassPhysicalStorageBufferEXT = 5349,-    SpvStorageClassCodeSectionINTEL = 5605,-    SpvStorageClassDeviceOnlyINTEL = 5936,-    SpvStorageClassHostOnlyINTEL = 5937,-    SpvStorageClassMax = 0x7fffffff,-} SpvStorageClass;--typedef enum SpvDim_ {-    SpvDim1D = 0,-    SpvDim2D = 1,-    SpvDim3D = 2,-    SpvDimCube = 3,-    SpvDimRect = 4,-    SpvDimBuffer = 5,-    SpvDimSubpassData = 6,-    SpvDimMax = 0x7fffffff,-} SpvDim;--typedef enum SpvSamplerAddressingMode_ {-    SpvSamplerAddressingModeNone = 0,-    SpvSamplerAddressingModeClampToEdge = 1,-    SpvSamplerAddressingModeClamp = 2,-    SpvSamplerAddressingModeRepeat = 3,-    SpvSamplerAddressingModeRepeatMirrored = 4,-    SpvSamplerAddressingModeMax = 0x7fffffff,-} SpvSamplerAddressingMode;--typedef enum SpvSamplerFilterMode_ {-    SpvSamplerFilterModeNearest = 0,-    SpvSamplerFilterModeLinear = 1,-    SpvSamplerFilterModeMax = 0x7fffffff,-} SpvSamplerFilterMode;--typedef enum SpvImageFormat_ {-    SpvImageFormatUnknown = 0,-    SpvImageFormatRgba32f = 1,-    SpvImageFormatRgba16f = 2,-    SpvImageFormatR32f = 3,-    SpvImageFormatRgba8 = 4,-    SpvImageFormatRgba8Snorm = 5,-    SpvImageFormatRg32f = 6,-    SpvImageFormatRg16f = 7,-    SpvImageFormatR11fG11fB10f = 8,-    SpvImageFormatR16f = 9,-    SpvImageFormatRgba16 = 10,-    SpvImageFormatRgb10A2 = 11,-    SpvImageFormatRg16 = 12,-    SpvImageFormatRg8 = 13,-    SpvImageFormatR16 = 14,-    SpvImageFormatR8 = 15,-    SpvImageFormatRgba16Snorm = 16,-    SpvImageFormatRg16Snorm = 17,-    SpvImageFormatRg8Snorm = 18,-    SpvImageFormatR16Snorm = 19,-    SpvImageFormatR8Snorm = 20,-    SpvImageFormatRgba32i = 21,-    SpvImageFormatRgba16i = 22,-    SpvImageFormatRgba8i = 23,-    SpvImageFormatR32i = 24,-    SpvImageFormatRg32i = 25,-    SpvImageFormatRg16i = 26,-    SpvImageFormatRg8i = 27,-    SpvImageFormatR16i = 28,-    SpvImageFormatR8i = 29,-    SpvImageFormatRgba32ui = 30,-    SpvImageFormatRgba16ui = 31,-    SpvImageFormatRgba8ui = 32,-    SpvImageFormatR32ui = 33,-    SpvImageFormatRgb10a2ui = 34,-    SpvImageFormatRg32ui = 35,-    SpvImageFormatRg16ui = 36,-    SpvImageFormatRg8ui = 37,-    SpvImageFormatR16ui = 38,-    SpvImageFormatR8ui = 39,-    SpvImageFormatR64ui = 40,-    SpvImageFormatR64i = 41,-    SpvImageFormatMax = 0x7fffffff,-} SpvImageFormat;--typedef enum SpvImageChannelOrder_ {-    SpvImageChannelOrderR = 0,-    SpvImageChannelOrderA = 1,-    SpvImageChannelOrderRG = 2,-    SpvImageChannelOrderRA = 3,-    SpvImageChannelOrderRGB = 4,-    SpvImageChannelOrderRGBA = 5,-    SpvImageChannelOrderBGRA = 6,-    SpvImageChannelOrderARGB = 7,-    SpvImageChannelOrderIntensity = 8,-    SpvImageChannelOrderLuminance = 9,-    SpvImageChannelOrderRx = 10,-    SpvImageChannelOrderRGx = 11,-    SpvImageChannelOrderRGBx = 12,-    SpvImageChannelOrderDepth = 13,-    SpvImageChannelOrderDepthStencil = 14,-    SpvImageChannelOrdersRGB = 15,-    SpvImageChannelOrdersRGBx = 16,-    SpvImageChannelOrdersRGBA = 17,-    SpvImageChannelOrdersBGRA = 18,-    SpvImageChannelOrderABGR = 19,-    SpvImageChannelOrderMax = 0x7fffffff,-} SpvImageChannelOrder;--typedef enum SpvImageChannelDataType_ {-    SpvImageChannelDataTypeSnormInt8 = 0,-    SpvImageChannelDataTypeSnormInt16 = 1,-    SpvImageChannelDataTypeUnormInt8 = 2,-    SpvImageChannelDataTypeUnormInt16 = 3,-    SpvImageChannelDataTypeUnormShort565 = 4,-    SpvImageChannelDataTypeUnormShort555 = 5,-    SpvImageChannelDataTypeUnormInt101010 = 6,-    SpvImageChannelDataTypeSignedInt8 = 7,-    SpvImageChannelDataTypeSignedInt16 = 8,-    SpvImageChannelDataTypeSignedInt32 = 9,-    SpvImageChannelDataTypeUnsignedInt8 = 10,-    SpvImageChannelDataTypeUnsignedInt16 = 11,-    SpvImageChannelDataTypeUnsignedInt32 = 12,-    SpvImageChannelDataTypeHalfFloat = 13,-    SpvImageChannelDataTypeFloat = 14,-    SpvImageChannelDataTypeUnormInt24 = 15,-    SpvImageChannelDataTypeUnormInt101010_2 = 16,-    SpvImageChannelDataTypeMax = 0x7fffffff,-} SpvImageChannelDataType;--typedef enum SpvImageOperandsShift_ {-    SpvImageOperandsBiasShift = 0,-    SpvImageOperandsLodShift = 1,-    SpvImageOperandsGradShift = 2,-    SpvImageOperandsConstOffsetShift = 3,-    SpvImageOperandsOffsetShift = 4,-    SpvImageOperandsConstOffsetsShift = 5,-    SpvImageOperandsSampleShift = 6,-    SpvImageOperandsMinLodShift = 7,-    SpvImageOperandsMakeTexelAvailableShift = 8,-    SpvImageOperandsMakeTexelAvailableKHRShift = 8,-    SpvImageOperandsMakeTexelVisibleShift = 9,-    SpvImageOperandsMakeTexelVisibleKHRShift = 9,-    SpvImageOperandsNonPrivateTexelShift = 10,-    SpvImageOperandsNonPrivateTexelKHRShift = 10,-    SpvImageOperandsVolatileTexelShift = 11,-    SpvImageOperandsVolatileTexelKHRShift = 11,-    SpvImageOperandsSignExtendShift = 12,-    SpvImageOperandsZeroExtendShift = 13,-    SpvImageOperandsNontemporalShift = 14,-    SpvImageOperandsOffsetsShift = 16,-    SpvImageOperandsMax = 0x7fffffff,-} SpvImageOperandsShift;--typedef enum SpvImageOperandsMask_ {-    SpvImageOperandsMaskNone = 0,-    SpvImageOperandsBiasMask = 0x00000001,-    SpvImageOperandsLodMask = 0x00000002,-    SpvImageOperandsGradMask = 0x00000004,-    SpvImageOperandsConstOffsetMask = 0x00000008,-    SpvImageOperandsOffsetMask = 0x00000010,-    SpvImageOperandsConstOffsetsMask = 0x00000020,-    SpvImageOperandsSampleMask = 0x00000040,-    SpvImageOperandsMinLodMask = 0x00000080,-    SpvImageOperandsMakeTexelAvailableMask = 0x00000100,-    SpvImageOperandsMakeTexelAvailableKHRMask = 0x00000100,-    SpvImageOperandsMakeTexelVisibleMask = 0x00000200,-    SpvImageOperandsMakeTexelVisibleKHRMask = 0x00000200,-    SpvImageOperandsNonPrivateTexelMask = 0x00000400,-    SpvImageOperandsNonPrivateTexelKHRMask = 0x00000400,-    SpvImageOperandsVolatileTexelMask = 0x00000800,-    SpvImageOperandsVolatileTexelKHRMask = 0x00000800,-    SpvImageOperandsSignExtendMask = 0x00001000,-    SpvImageOperandsZeroExtendMask = 0x00002000,-    SpvImageOperandsNontemporalMask = 0x00004000,-    SpvImageOperandsOffsetsMask = 0x00010000,-} SpvImageOperandsMask;--typedef enum SpvFPFastMathModeShift_ {-    SpvFPFastMathModeNotNaNShift = 0,-    SpvFPFastMathModeNotInfShift = 1,-    SpvFPFastMathModeNSZShift = 2,-    SpvFPFastMathModeAllowRecipShift = 3,-    SpvFPFastMathModeFastShift = 4,-    SpvFPFastMathModeAllowContractFastINTELShift = 16,-    SpvFPFastMathModeAllowReassocINTELShift = 17,-    SpvFPFastMathModeMax = 0x7fffffff,-} SpvFPFastMathModeShift;--typedef enum SpvFPFastMathModeMask_ {-    SpvFPFastMathModeMaskNone = 0,-    SpvFPFastMathModeNotNaNMask = 0x00000001,-    SpvFPFastMathModeNotInfMask = 0x00000002,-    SpvFPFastMathModeNSZMask = 0x00000004,-    SpvFPFastMathModeAllowRecipMask = 0x00000008,-    SpvFPFastMathModeFastMask = 0x00000010,-    SpvFPFastMathModeAllowContractFastINTELMask = 0x00010000,-    SpvFPFastMathModeAllowReassocINTELMask = 0x00020000,-} SpvFPFastMathModeMask;--typedef enum SpvFPRoundingMode_ {-    SpvFPRoundingModeRTE = 0,-    SpvFPRoundingModeRTZ = 1,-    SpvFPRoundingModeRTP = 2,-    SpvFPRoundingModeRTN = 3,-    SpvFPRoundingModeMax = 0x7fffffff,-} SpvFPRoundingMode;--typedef enum SpvLinkageType_ {-    SpvLinkageTypeExport = 0,-    SpvLinkageTypeImport = 1,-    SpvLinkageTypeLinkOnceODR = 2,-    SpvLinkageTypeMax = 0x7fffffff,-} SpvLinkageType;--typedef enum SpvAccessQualifier_ {-    SpvAccessQualifierReadOnly = 0,-    SpvAccessQualifierWriteOnly = 1,-    SpvAccessQualifierReadWrite = 2,-    SpvAccessQualifierMax = 0x7fffffff,-} SpvAccessQualifier;--typedef enum SpvFunctionParameterAttribute_ {-    SpvFunctionParameterAttributeZext = 0,-    SpvFunctionParameterAttributeSext = 1,-    SpvFunctionParameterAttributeByVal = 2,-    SpvFunctionParameterAttributeSret = 3,-    SpvFunctionParameterAttributeNoAlias = 4,-    SpvFunctionParameterAttributeNoCapture = 5,-    SpvFunctionParameterAttributeNoWrite = 6,-    SpvFunctionParameterAttributeNoReadWrite = 7,-    SpvFunctionParameterAttributeMax = 0x7fffffff,-} SpvFunctionParameterAttribute;--typedef enum SpvDecoration_ {-    SpvDecorationRelaxedPrecision = 0,-    SpvDecorationSpecId = 1,-    SpvDecorationBlock = 2,-    SpvDecorationBufferBlock = 3,-    SpvDecorationRowMajor = 4,-    SpvDecorationColMajor = 5,-    SpvDecorationArrayStride = 6,-    SpvDecorationMatrixStride = 7,-    SpvDecorationGLSLShared = 8,-    SpvDecorationGLSLPacked = 9,-    SpvDecorationCPacked = 10,-    SpvDecorationBuiltIn = 11,-    SpvDecorationNoPerspective = 13,-    SpvDecorationFlat = 14,-    SpvDecorationPatch = 15,-    SpvDecorationCentroid = 16,-    SpvDecorationSample = 17,-    SpvDecorationInvariant = 18,-    SpvDecorationRestrict = 19,-    SpvDecorationAliased = 20,-    SpvDecorationVolatile = 21,-    SpvDecorationConstant = 22,-    SpvDecorationCoherent = 23,-    SpvDecorationNonWritable = 24,-    SpvDecorationNonReadable = 25,-    SpvDecorationUniform = 26,-    SpvDecorationUniformId = 27,-    SpvDecorationSaturatedConversion = 28,-    SpvDecorationStream = 29,-    SpvDecorationLocation = 30,-    SpvDecorationComponent = 31,-    SpvDecorationIndex = 32,-    SpvDecorationBinding = 33,-    SpvDecorationDescriptorSet = 34,-    SpvDecorationOffset = 35,-    SpvDecorationXfbBuffer = 36,-    SpvDecorationXfbStride = 37,-    SpvDecorationFuncParamAttr = 38,-    SpvDecorationFPRoundingMode = 39,-    SpvDecorationFPFastMathMode = 40,-    SpvDecorationLinkageAttributes = 41,-    SpvDecorationNoContraction = 42,-    SpvDecorationInputAttachmentIndex = 43,-    SpvDecorationAlignment = 44,-    SpvDecorationMaxByteOffset = 45,-    SpvDecorationAlignmentId = 46,-    SpvDecorationMaxByteOffsetId = 47,-    SpvDecorationNoSignedWrap = 4469,-    SpvDecorationNoUnsignedWrap = 4470,-    SpvDecorationExplicitInterpAMD = 4999,-    SpvDecorationOverrideCoverageNV = 5248,-    SpvDecorationPassthroughNV = 5250,-    SpvDecorationViewportRelativeNV = 5252,-    SpvDecorationSecondaryViewportRelativeNV = 5256,-    SpvDecorationPerPrimitiveNV = 5271,-    SpvDecorationPerViewNV = 5272,-    SpvDecorationPerTaskNV = 5273,-    SpvDecorationPerVertexKHR = 5285,-    SpvDecorationPerVertexNV = 5285,-    SpvDecorationNonUniform = 5300,-    SpvDecorationNonUniformEXT = 5300,-    SpvDecorationRestrictPointer = 5355,-    SpvDecorationRestrictPointerEXT = 5355,-    SpvDecorationAliasedPointer = 5356,-    SpvDecorationAliasedPointerEXT = 5356,-    SpvDecorationBindlessSamplerNV = 5398,-    SpvDecorationBindlessImageNV = 5399,-    SpvDecorationBoundSamplerNV = 5400,-    SpvDecorationBoundImageNV = 5401,-    SpvDecorationSIMTCallINTEL = 5599,-    SpvDecorationReferencedIndirectlyINTEL = 5602,-    SpvDecorationClobberINTEL = 5607,-    SpvDecorationSideEffectsINTEL = 5608,-    SpvDecorationVectorComputeVariableINTEL = 5624,-    SpvDecorationFuncParamIOKindINTEL = 5625,-    SpvDecorationVectorComputeFunctionINTEL = 5626,-    SpvDecorationStackCallINTEL = 5627,-    SpvDecorationGlobalVariableOffsetINTEL = 5628,-    SpvDecorationCounterBuffer = 5634,-    SpvDecorationHlslCounterBufferGOOGLE = 5634,-    SpvDecorationHlslSemanticGOOGLE = 5635,-    SpvDecorationUserSemantic = 5635,-    SpvDecorationUserTypeGOOGLE = 5636,-    SpvDecorationFunctionRoundingModeINTEL = 5822,-    SpvDecorationFunctionDenormModeINTEL = 5823,-    SpvDecorationRegisterINTEL = 5825,-    SpvDecorationMemoryINTEL = 5826,-    SpvDecorationNumbanksINTEL = 5827,-    SpvDecorationBankwidthINTEL = 5828,-    SpvDecorationMaxPrivateCopiesINTEL = 5829,-    SpvDecorationSinglepumpINTEL = 5830,-    SpvDecorationDoublepumpINTEL = 5831,-    SpvDecorationMaxReplicatesINTEL = 5832,-    SpvDecorationSimpleDualPortINTEL = 5833,-    SpvDecorationMergeINTEL = 5834,-    SpvDecorationBankBitsINTEL = 5835,-    SpvDecorationForcePow2DepthINTEL = 5836,-    SpvDecorationBurstCoalesceINTEL = 5899,-    SpvDecorationCacheSizeINTEL = 5900,-    SpvDecorationDontStaticallyCoalesceINTEL = 5901,-    SpvDecorationPrefetchINTEL = 5902,-    SpvDecorationStallEnableINTEL = 5905,-    SpvDecorationFuseLoopsInFunctionINTEL = 5907,-    SpvDecorationAliasScopeINTEL = 5914,-    SpvDecorationNoAliasINTEL = 5915,-    SpvDecorationBufferLocationINTEL = 5921,-    SpvDecorationIOPipeStorageINTEL = 5944,-    SpvDecorationFunctionFloatingPointModeINTEL = 6080,-    SpvDecorationSingleElementVectorINTEL = 6085,-    SpvDecorationVectorComputeCallableFunctionINTEL = 6087,-    SpvDecorationMediaBlockIOINTEL = 6140,-    SpvDecorationMax = 0x7fffffff,-} SpvDecoration;--typedef enum SpvBuiltIn_ {-    SpvBuiltInPosition = 0,-    SpvBuiltInPointSize = 1,-    SpvBuiltInClipDistance = 3,-    SpvBuiltInCullDistance = 4,-    SpvBuiltInVertexId = 5,-    SpvBuiltInInstanceId = 6,-    SpvBuiltInPrimitiveId = 7,-    SpvBuiltInInvocationId = 8,-    SpvBuiltInLayer = 9,-    SpvBuiltInViewportIndex = 10,-    SpvBuiltInTessLevelOuter = 11,-    SpvBuiltInTessLevelInner = 12,-    SpvBuiltInTessCoord = 13,-    SpvBuiltInPatchVertices = 14,-    SpvBuiltInFragCoord = 15,-    SpvBuiltInPointCoord = 16,-    SpvBuiltInFrontFacing = 17,-    SpvBuiltInSampleId = 18,-    SpvBuiltInSamplePosition = 19,-    SpvBuiltInSampleMask = 20,-    SpvBuiltInFragDepth = 22,-    SpvBuiltInHelperInvocation = 23,-    SpvBuiltInNumWorkgroups = 24,-    SpvBuiltInWorkgroupSize = 25,-    SpvBuiltInWorkgroupId = 26,-    SpvBuiltInLocalInvocationId = 27,-    SpvBuiltInGlobalInvocationId = 28,-    SpvBuiltInLocalInvocationIndex = 29,-    SpvBuiltInWorkDim = 30,-    SpvBuiltInGlobalSize = 31,-    SpvBuiltInEnqueuedWorkgroupSize = 32,-    SpvBuiltInGlobalOffset = 33,-    SpvBuiltInGlobalLinearId = 34,-    SpvBuiltInSubgroupSize = 36,-    SpvBuiltInSubgroupMaxSize = 37,-    SpvBuiltInNumSubgroups = 38,-    SpvBuiltInNumEnqueuedSubgroups = 39,-    SpvBuiltInSubgroupId = 40,-    SpvBuiltInSubgroupLocalInvocationId = 41,-    SpvBuiltInVertexIndex = 42,-    SpvBuiltInInstanceIndex = 43,-    SpvBuiltInSubgroupEqMask = 4416,-    SpvBuiltInSubgroupEqMaskKHR = 4416,-    SpvBuiltInSubgroupGeMask = 4417,-    SpvBuiltInSubgroupGeMaskKHR = 4417,-    SpvBuiltInSubgroupGtMask = 4418,-    SpvBuiltInSubgroupGtMaskKHR = 4418,-    SpvBuiltInSubgroupLeMask = 4419,-    SpvBuiltInSubgroupLeMaskKHR = 4419,-    SpvBuiltInSubgroupLtMask = 4420,-    SpvBuiltInSubgroupLtMaskKHR = 4420,-    SpvBuiltInBaseVertex = 4424,-    SpvBuiltInBaseInstance = 4425,-    SpvBuiltInDrawIndex = 4426,-    SpvBuiltInPrimitiveShadingRateKHR = 4432,-    SpvBuiltInDeviceIndex = 4438,-    SpvBuiltInViewIndex = 4440,-    SpvBuiltInShadingRateKHR = 4444,-    SpvBuiltInBaryCoordNoPerspAMD = 4992,-    SpvBuiltInBaryCoordNoPerspCentroidAMD = 4993,-    SpvBuiltInBaryCoordNoPerspSampleAMD = 4994,-    SpvBuiltInBaryCoordSmoothAMD = 4995,-    SpvBuiltInBaryCoordSmoothCentroidAMD = 4996,-    SpvBuiltInBaryCoordSmoothSampleAMD = 4997,-    SpvBuiltInBaryCoordPullModelAMD = 4998,-    SpvBuiltInFragStencilRefEXT = 5014,-    SpvBuiltInViewportMaskNV = 5253,-    SpvBuiltInSecondaryPositionNV = 5257,-    SpvBuiltInSecondaryViewportMaskNV = 5258,-    SpvBuiltInPositionPerViewNV = 5261,-    SpvBuiltInViewportMaskPerViewNV = 5262,-    SpvBuiltInFullyCoveredEXT = 5264,-    SpvBuiltInTaskCountNV = 5274,-    SpvBuiltInPrimitiveCountNV = 5275,-    SpvBuiltInPrimitiveIndicesNV = 5276,-    SpvBuiltInClipDistancePerViewNV = 5277,-    SpvBuiltInCullDistancePerViewNV = 5278,-    SpvBuiltInLayerPerViewNV = 5279,-    SpvBuiltInMeshViewCountNV = 5280,-    SpvBuiltInMeshViewIndicesNV = 5281,-    SpvBuiltInBaryCoordKHR = 5286,-    SpvBuiltInBaryCoordNV = 5286,-    SpvBuiltInBaryCoordNoPerspKHR = 5287,-    SpvBuiltInBaryCoordNoPerspNV = 5287,-    SpvBuiltInFragSizeEXT = 5292,-    SpvBuiltInFragmentSizeNV = 5292,-    SpvBuiltInFragInvocationCountEXT = 5293,-    SpvBuiltInInvocationsPerPixelNV = 5293,-    SpvBuiltInLaunchIdKHR = 5319,-    SpvBuiltInLaunchIdNV = 5319,-    SpvBuiltInLaunchSizeKHR = 5320,-    SpvBuiltInLaunchSizeNV = 5320,-    SpvBuiltInWorldRayOriginKHR = 5321,-    SpvBuiltInWorldRayOriginNV = 5321,-    SpvBuiltInWorldRayDirectionKHR = 5322,-    SpvBuiltInWorldRayDirectionNV = 5322,-    SpvBuiltInObjectRayOriginKHR = 5323,-    SpvBuiltInObjectRayOriginNV = 5323,-    SpvBuiltInObjectRayDirectionKHR = 5324,-    SpvBuiltInObjectRayDirectionNV = 5324,-    SpvBuiltInRayTminKHR = 5325,-    SpvBuiltInRayTminNV = 5325,-    SpvBuiltInRayTmaxKHR = 5326,-    SpvBuiltInRayTmaxNV = 5326,-    SpvBuiltInInstanceCustomIndexKHR = 5327,-    SpvBuiltInInstanceCustomIndexNV = 5327,-    SpvBuiltInObjectToWorldKHR = 5330,-    SpvBuiltInObjectToWorldNV = 5330,-    SpvBuiltInWorldToObjectKHR = 5331,-    SpvBuiltInWorldToObjectNV = 5331,-    SpvBuiltInHitTNV = 5332,-    SpvBuiltInHitKindKHR = 5333,-    SpvBuiltInHitKindNV = 5333,-    SpvBuiltInCurrentRayTimeNV = 5334,-    SpvBuiltInIncomingRayFlagsKHR = 5351,-    SpvBuiltInIncomingRayFlagsNV = 5351,-    SpvBuiltInRayGeometryIndexKHR = 5352,-    SpvBuiltInWarpsPerSMNV = 5374,-    SpvBuiltInSMCountNV = 5375,-    SpvBuiltInWarpIDNV = 5376,-    SpvBuiltInSMIDNV = 5377,-    SpvBuiltInCullMaskKHR = 6021,-    SpvBuiltInMax = 0x7fffffff,-} SpvBuiltIn;--typedef enum SpvSelectionControlShift_ {-    SpvSelectionControlFlattenShift = 0,-    SpvSelectionControlDontFlattenShift = 1,-    SpvSelectionControlMax = 0x7fffffff,-} SpvSelectionControlShift;--typedef enum SpvSelectionControlMask_ {-    SpvSelectionControlMaskNone = 0,-    SpvSelectionControlFlattenMask = 0x00000001,-    SpvSelectionControlDontFlattenMask = 0x00000002,-} SpvSelectionControlMask;--typedef enum SpvLoopControlShift_ {-    SpvLoopControlUnrollShift = 0,-    SpvLoopControlDontUnrollShift = 1,-    SpvLoopControlDependencyInfiniteShift = 2,-    SpvLoopControlDependencyLengthShift = 3,-    SpvLoopControlMinIterationsShift = 4,-    SpvLoopControlMaxIterationsShift = 5,-    SpvLoopControlIterationMultipleShift = 6,-    SpvLoopControlPeelCountShift = 7,-    SpvLoopControlPartialCountShift = 8,-    SpvLoopControlInitiationIntervalINTELShift = 16,-    SpvLoopControlMaxConcurrencyINTELShift = 17,-    SpvLoopControlDependencyArrayINTELShift = 18,-    SpvLoopControlPipelineEnableINTELShift = 19,-    SpvLoopControlLoopCoalesceINTELShift = 20,-    SpvLoopControlMaxInterleavingINTELShift = 21,-    SpvLoopControlSpeculatedIterationsINTELShift = 22,-    SpvLoopControlNoFusionINTELShift = 23,-    SpvLoopControlMax = 0x7fffffff,-} SpvLoopControlShift;--typedef enum SpvLoopControlMask_ {-    SpvLoopControlMaskNone = 0,-    SpvLoopControlUnrollMask = 0x00000001,-    SpvLoopControlDontUnrollMask = 0x00000002,-    SpvLoopControlDependencyInfiniteMask = 0x00000004,-    SpvLoopControlDependencyLengthMask = 0x00000008,-    SpvLoopControlMinIterationsMask = 0x00000010,-    SpvLoopControlMaxIterationsMask = 0x00000020,-    SpvLoopControlIterationMultipleMask = 0x00000040,-    SpvLoopControlPeelCountMask = 0x00000080,-    SpvLoopControlPartialCountMask = 0x00000100,-    SpvLoopControlInitiationIntervalINTELMask = 0x00010000,-    SpvLoopControlMaxConcurrencyINTELMask = 0x00020000,-    SpvLoopControlDependencyArrayINTELMask = 0x00040000,-    SpvLoopControlPipelineEnableINTELMask = 0x00080000,-    SpvLoopControlLoopCoalesceINTELMask = 0x00100000,-    SpvLoopControlMaxInterleavingINTELMask = 0x00200000,-    SpvLoopControlSpeculatedIterationsINTELMask = 0x00400000,-    SpvLoopControlNoFusionINTELMask = 0x00800000,-} SpvLoopControlMask;--typedef enum SpvFunctionControlShift_ {-    SpvFunctionControlInlineShift = 0,-    SpvFunctionControlDontInlineShift = 1,-    SpvFunctionControlPureShift = 2,-    SpvFunctionControlConstShift = 3,-    SpvFunctionControlOptNoneINTELShift = 16,-    SpvFunctionControlMax = 0x7fffffff,-} SpvFunctionControlShift;--typedef enum SpvFunctionControlMask_ {-    SpvFunctionControlMaskNone = 0,-    SpvFunctionControlInlineMask = 0x00000001,-    SpvFunctionControlDontInlineMask = 0x00000002,-    SpvFunctionControlPureMask = 0x00000004,-    SpvFunctionControlConstMask = 0x00000008,-    SpvFunctionControlOptNoneINTELMask = 0x00010000,-} SpvFunctionControlMask;--typedef enum SpvMemorySemanticsShift_ {-    SpvMemorySemanticsAcquireShift = 1,-    SpvMemorySemanticsReleaseShift = 2,-    SpvMemorySemanticsAcquireReleaseShift = 3,-    SpvMemorySemanticsSequentiallyConsistentShift = 4,-    SpvMemorySemanticsUniformMemoryShift = 6,-    SpvMemorySemanticsSubgroupMemoryShift = 7,-    SpvMemorySemanticsWorkgroupMemoryShift = 8,-    SpvMemorySemanticsCrossWorkgroupMemoryShift = 9,-    SpvMemorySemanticsAtomicCounterMemoryShift = 10,-    SpvMemorySemanticsImageMemoryShift = 11,-    SpvMemorySemanticsOutputMemoryShift = 12,-    SpvMemorySemanticsOutputMemoryKHRShift = 12,-    SpvMemorySemanticsMakeAvailableShift = 13,-    SpvMemorySemanticsMakeAvailableKHRShift = 13,-    SpvMemorySemanticsMakeVisibleShift = 14,-    SpvMemorySemanticsMakeVisibleKHRShift = 14,-    SpvMemorySemanticsVolatileShift = 15,-    SpvMemorySemanticsMax = 0x7fffffff,-} SpvMemorySemanticsShift;--typedef enum SpvMemorySemanticsMask_ {-    SpvMemorySemanticsMaskNone = 0,-    SpvMemorySemanticsAcquireMask = 0x00000002,-    SpvMemorySemanticsReleaseMask = 0x00000004,-    SpvMemorySemanticsAcquireReleaseMask = 0x00000008,-    SpvMemorySemanticsSequentiallyConsistentMask = 0x00000010,-    SpvMemorySemanticsUniformMemoryMask = 0x00000040,-    SpvMemorySemanticsSubgroupMemoryMask = 0x00000080,-    SpvMemorySemanticsWorkgroupMemoryMask = 0x00000100,-    SpvMemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,-    SpvMemorySemanticsAtomicCounterMemoryMask = 0x00000400,-    SpvMemorySemanticsImageMemoryMask = 0x00000800,-    SpvMemorySemanticsOutputMemoryMask = 0x00001000,-    SpvMemorySemanticsOutputMemoryKHRMask = 0x00001000,-    SpvMemorySemanticsMakeAvailableMask = 0x00002000,-    SpvMemorySemanticsMakeAvailableKHRMask = 0x00002000,-    SpvMemorySemanticsMakeVisibleMask = 0x00004000,-    SpvMemorySemanticsMakeVisibleKHRMask = 0x00004000,-    SpvMemorySemanticsVolatileMask = 0x00008000,-} SpvMemorySemanticsMask;--typedef enum SpvMemoryAccessShift_ {-    SpvMemoryAccessVolatileShift = 0,-    SpvMemoryAccessAlignedShift = 1,-    SpvMemoryAccessNontemporalShift = 2,-    SpvMemoryAccessMakePointerAvailableShift = 3,-    SpvMemoryAccessMakePointerAvailableKHRShift = 3,-    SpvMemoryAccessMakePointerVisibleShift = 4,-    SpvMemoryAccessMakePointerVisibleKHRShift = 4,-    SpvMemoryAccessNonPrivatePointerShift = 5,-    SpvMemoryAccessNonPrivatePointerKHRShift = 5,-    SpvMemoryAccessAliasScopeINTELMaskShift = 16,-    SpvMemoryAccessNoAliasINTELMaskShift = 17,-    SpvMemoryAccessMax = 0x7fffffff,-} SpvMemoryAccessShift;--typedef enum SpvMemoryAccessMask_ {-    SpvMemoryAccessMaskNone = 0,-    SpvMemoryAccessVolatileMask = 0x00000001,-    SpvMemoryAccessAlignedMask = 0x00000002,-    SpvMemoryAccessNontemporalMask = 0x00000004,-    SpvMemoryAccessMakePointerAvailableMask = 0x00000008,-    SpvMemoryAccessMakePointerAvailableKHRMask = 0x00000008,-    SpvMemoryAccessMakePointerVisibleMask = 0x00000010,-    SpvMemoryAccessMakePointerVisibleKHRMask = 0x00000010,-    SpvMemoryAccessNonPrivatePointerMask = 0x00000020,-    SpvMemoryAccessNonPrivatePointerKHRMask = 0x00000020,-    SpvMemoryAccessAliasScopeINTELMaskMask = 0x00010000,-    SpvMemoryAccessNoAliasINTELMaskMask = 0x00020000,-} SpvMemoryAccessMask;--typedef enum SpvScope_ {-    SpvScopeCrossDevice = 0,-    SpvScopeDevice = 1,-    SpvScopeWorkgroup = 2,-    SpvScopeSubgroup = 3,-    SpvScopeInvocation = 4,-    SpvScopeQueueFamily = 5,-    SpvScopeQueueFamilyKHR = 5,-    SpvScopeShaderCallKHR = 6,-    SpvScopeMax = 0x7fffffff,-} SpvScope;--typedef enum SpvGroupOperation_ {-    SpvGroupOperationReduce = 0,-    SpvGroupOperationInclusiveScan = 1,-    SpvGroupOperationExclusiveScan = 2,-    SpvGroupOperationClusteredReduce = 3,-    SpvGroupOperationPartitionedReduceNV = 6,-    SpvGroupOperationPartitionedInclusiveScanNV = 7,-    SpvGroupOperationPartitionedExclusiveScanNV = 8,-    SpvGroupOperationMax = 0x7fffffff,-} SpvGroupOperation;--typedef enum SpvKernelEnqueueFlags_ {-    SpvKernelEnqueueFlagsNoWait = 0,-    SpvKernelEnqueueFlagsWaitKernel = 1,-    SpvKernelEnqueueFlagsWaitWorkGroup = 2,-    SpvKernelEnqueueFlagsMax = 0x7fffffff,-} SpvKernelEnqueueFlags;--typedef enum SpvKernelProfilingInfoShift_ {-    SpvKernelProfilingInfoCmdExecTimeShift = 0,-    SpvKernelProfilingInfoMax = 0x7fffffff,-} SpvKernelProfilingInfoShift;--typedef enum SpvKernelProfilingInfoMask_ {-    SpvKernelProfilingInfoMaskNone = 0,-    SpvKernelProfilingInfoCmdExecTimeMask = 0x00000001,-} SpvKernelProfilingInfoMask;--typedef enum SpvCapability_ {-    SpvCapabilityMatrix = 0,-    SpvCapabilityShader = 1,-    SpvCapabilityGeometry = 2,-    SpvCapabilityTessellation = 3,-    SpvCapabilityAddresses = 4,-    SpvCapabilityLinkage = 5,-    SpvCapabilityKernel = 6,-    SpvCapabilityVector16 = 7,-    SpvCapabilityFloat16Buffer = 8,-    SpvCapabilityFloat16 = 9,-    SpvCapabilityFloat64 = 10,-    SpvCapabilityInt64 = 11,-    SpvCapabilityInt64Atomics = 12,-    SpvCapabilityImageBasic = 13,-    SpvCapabilityImageReadWrite = 14,-    SpvCapabilityImageMipmap = 15,-    SpvCapabilityPipes = 17,-    SpvCapabilityGroups = 18,-    SpvCapabilityDeviceEnqueue = 19,-    SpvCapabilityLiteralSampler = 20,-    SpvCapabilityAtomicStorage = 21,-    SpvCapabilityInt16 = 22,-    SpvCapabilityTessellationPointSize = 23,-    SpvCapabilityGeometryPointSize = 24,-    SpvCapabilityImageGatherExtended = 25,-    SpvCapabilityStorageImageMultisample = 27,-    SpvCapabilityUniformBufferArrayDynamicIndexing = 28,-    SpvCapabilitySampledImageArrayDynamicIndexing = 29,-    SpvCapabilityStorageBufferArrayDynamicIndexing = 30,-    SpvCapabilityStorageImageArrayDynamicIndexing = 31,-    SpvCapabilityClipDistance = 32,-    SpvCapabilityCullDistance = 33,-    SpvCapabilityImageCubeArray = 34,-    SpvCapabilitySampleRateShading = 35,-    SpvCapabilityImageRect = 36,-    SpvCapabilitySampledRect = 37,-    SpvCapabilityGenericPointer = 38,-    SpvCapabilityInt8 = 39,-    SpvCapabilityInputAttachment = 40,-    SpvCapabilitySparseResidency = 41,-    SpvCapabilityMinLod = 42,-    SpvCapabilitySampled1D = 43,-    SpvCapabilityImage1D = 44,-    SpvCapabilitySampledCubeArray = 45,-    SpvCapabilitySampledBuffer = 46,-    SpvCapabilityImageBuffer = 47,-    SpvCapabilityImageMSArray = 48,-    SpvCapabilityStorageImageExtendedFormats = 49,-    SpvCapabilityImageQuery = 50,-    SpvCapabilityDerivativeControl = 51,-    SpvCapabilityInterpolationFunction = 52,-    SpvCapabilityTransformFeedback = 53,-    SpvCapabilityGeometryStreams = 54,-    SpvCapabilityStorageImageReadWithoutFormat = 55,-    SpvCapabilityStorageImageWriteWithoutFormat = 56,-    SpvCapabilityMultiViewport = 57,-    SpvCapabilitySubgroupDispatch = 58,-    SpvCapabilityNamedBarrier = 59,-    SpvCapabilityPipeStorage = 60,-    SpvCapabilityGroupNonUniform = 61,-    SpvCapabilityGroupNonUniformVote = 62,-    SpvCapabilityGroupNonUniformArithmetic = 63,-    SpvCapabilityGroupNonUniformBallot = 64,-    SpvCapabilityGroupNonUniformShuffle = 65,-    SpvCapabilityGroupNonUniformShuffleRelative = 66,-    SpvCapabilityGroupNonUniformClustered = 67,-    SpvCapabilityGroupNonUniformQuad = 68,-    SpvCapabilityShaderLayer = 69,-    SpvCapabilityShaderViewportIndex = 70,-    SpvCapabilityUniformDecoration = 71,-    SpvCapabilityFragmentShadingRateKHR = 4422,-    SpvCapabilitySubgroupBallotKHR = 4423,-    SpvCapabilityDrawParameters = 4427,-    SpvCapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,-    SpvCapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,-    SpvCapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,-    SpvCapabilitySubgroupVoteKHR = 4431,-    SpvCapabilityStorageBuffer16BitAccess = 4433,-    SpvCapabilityStorageUniformBufferBlock16 = 4433,-    SpvCapabilityStorageUniform16 = 4434,-    SpvCapabilityUniformAndStorageBuffer16BitAccess = 4434,-    SpvCapabilityStoragePushConstant16 = 4435,-    SpvCapabilityStorageInputOutput16 = 4436,-    SpvCapabilityDeviceGroup = 4437,-    SpvCapabilityMultiView = 4439,-    SpvCapabilityVariablePointersStorageBuffer = 4441,-    SpvCapabilityVariablePointers = 4442,-    SpvCapabilityAtomicStorageOps = 4445,-    SpvCapabilitySampleMaskPostDepthCoverage = 4447,-    SpvCapabilityStorageBuffer8BitAccess = 4448,-    SpvCapabilityUniformAndStorageBuffer8BitAccess = 4449,-    SpvCapabilityStoragePushConstant8 = 4450,-    SpvCapabilityDenormPreserve = 4464,-    SpvCapabilityDenormFlushToZero = 4465,-    SpvCapabilitySignedZeroInfNanPreserve = 4466,-    SpvCapabilityRoundingModeRTE = 4467,-    SpvCapabilityRoundingModeRTZ = 4468,-    SpvCapabilityRayQueryProvisionalKHR = 4471,-    SpvCapabilityRayQueryKHR = 4472,-    SpvCapabilityRayTraversalPrimitiveCullingKHR = 4478,-    SpvCapabilityRayTracingKHR = 4479,-    SpvCapabilityFloat16ImageAMD = 5008,-    SpvCapabilityImageGatherBiasLodAMD = 5009,-    SpvCapabilityFragmentMaskAMD = 5010,-    SpvCapabilityStencilExportEXT = 5013,-    SpvCapabilityImageReadWriteLodAMD = 5015,-    SpvCapabilityInt64ImageEXT = 5016,-    SpvCapabilityShaderClockKHR = 5055,-    SpvCapabilitySampleMaskOverrideCoverageNV = 5249,-    SpvCapabilityGeometryShaderPassthroughNV = 5251,-    SpvCapabilityShaderViewportIndexLayerEXT = 5254,-    SpvCapabilityShaderViewportIndexLayerNV = 5254,-    SpvCapabilityShaderViewportMaskNV = 5255,-    SpvCapabilityShaderStereoViewNV = 5259,-    SpvCapabilityPerViewAttributesNV = 5260,-    SpvCapabilityFragmentFullyCoveredEXT = 5265,-    SpvCapabilityMeshShadingNV = 5266,-    SpvCapabilityImageFootprintNV = 5282,-    SpvCapabilityFragmentBarycentricKHR = 5284,-    SpvCapabilityFragmentBarycentricNV = 5284,-    SpvCapabilityComputeDerivativeGroupQuadsNV = 5288,-    SpvCapabilityFragmentDensityEXT = 5291,-    SpvCapabilityShadingRateNV = 5291,-    SpvCapabilityGroupNonUniformPartitionedNV = 5297,-    SpvCapabilityShaderNonUniform = 5301,-    SpvCapabilityShaderNonUniformEXT = 5301,-    SpvCapabilityRuntimeDescriptorArray = 5302,-    SpvCapabilityRuntimeDescriptorArrayEXT = 5302,-    SpvCapabilityInputAttachmentArrayDynamicIndexing = 5303,-    SpvCapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,-    SpvCapabilityUniformTexelBufferArrayDynamicIndexing = 5304,-    SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,-    SpvCapabilityStorageTexelBufferArrayDynamicIndexing = 5305,-    SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,-    SpvCapabilityUniformBufferArrayNonUniformIndexing = 5306,-    SpvCapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,-    SpvCapabilitySampledImageArrayNonUniformIndexing = 5307,-    SpvCapabilitySampledImageArrayNonUniformIndexingEXT = 5307,-    SpvCapabilityStorageBufferArrayNonUniformIndexing = 5308,-    SpvCapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,-    SpvCapabilityStorageImageArrayNonUniformIndexing = 5309,-    SpvCapabilityStorageImageArrayNonUniformIndexingEXT = 5309,-    SpvCapabilityInputAttachmentArrayNonUniformIndexing = 5310,-    SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,-    SpvCapabilityUniformTexelBufferArrayNonUniformIndexing = 5311,-    SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,-    SpvCapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,-    SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,-    SpvCapabilityRayTracingNV = 5340,-    SpvCapabilityRayTracingMotionBlurNV = 5341,-    SpvCapabilityVulkanMemoryModel = 5345,-    SpvCapabilityVulkanMemoryModelKHR = 5345,-    SpvCapabilityVulkanMemoryModelDeviceScope = 5346,-    SpvCapabilityVulkanMemoryModelDeviceScopeKHR = 5346,-    SpvCapabilityPhysicalStorageBufferAddresses = 5347,-    SpvCapabilityPhysicalStorageBufferAddressesEXT = 5347,-    SpvCapabilityComputeDerivativeGroupLinearNV = 5350,-    SpvCapabilityRayTracingProvisionalKHR = 5353,-    SpvCapabilityCooperativeMatrixNV = 5357,-    SpvCapabilityFragmentShaderSampleInterlockEXT = 5363,-    SpvCapabilityFragmentShaderShadingRateInterlockEXT = 5372,-    SpvCapabilityShaderSMBuiltinsNV = 5373,-    SpvCapabilityFragmentShaderPixelInterlockEXT = 5378,-    SpvCapabilityDemoteToHelperInvocation = 5379,-    SpvCapabilityDemoteToHelperInvocationEXT = 5379,-    SpvCapabilityBindlessTextureNV = 5390,-    SpvCapabilitySubgroupShuffleINTEL = 5568,-    SpvCapabilitySubgroupBufferBlockIOINTEL = 5569,-    SpvCapabilitySubgroupImageBlockIOINTEL = 5570,-    SpvCapabilitySubgroupImageMediaBlockIOINTEL = 5579,-    SpvCapabilityRoundToInfinityINTEL = 5582,-    SpvCapabilityFloatingPointModeINTEL = 5583,-    SpvCapabilityIntegerFunctions2INTEL = 5584,-    SpvCapabilityFunctionPointersINTEL = 5603,-    SpvCapabilityIndirectReferencesINTEL = 5604,-    SpvCapabilityAsmINTEL = 5606,-    SpvCapabilityAtomicFloat32MinMaxEXT = 5612,-    SpvCapabilityAtomicFloat64MinMaxEXT = 5613,-    SpvCapabilityAtomicFloat16MinMaxEXT = 5616,-    SpvCapabilityVectorComputeINTEL = 5617,-    SpvCapabilityVectorAnyINTEL = 5619,-    SpvCapabilityExpectAssumeKHR = 5629,-    SpvCapabilitySubgroupAvcMotionEstimationINTEL = 5696,-    SpvCapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,-    SpvCapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,-    SpvCapabilityVariableLengthArrayINTEL = 5817,-    SpvCapabilityFunctionFloatControlINTEL = 5821,-    SpvCapabilityFPGAMemoryAttributesINTEL = 5824,-    SpvCapabilityFPFastMathModeINTEL = 5837,-    SpvCapabilityArbitraryPrecisionIntegersINTEL = 5844,-    SpvCapabilityArbitraryPrecisionFloatingPointINTEL = 5845,-    SpvCapabilityUnstructuredLoopControlsINTEL = 5886,-    SpvCapabilityFPGALoopControlsINTEL = 5888,-    SpvCapabilityKernelAttributesINTEL = 5892,-    SpvCapabilityFPGAKernelAttributesINTEL = 5897,-    SpvCapabilityFPGAMemoryAccessesINTEL = 5898,-    SpvCapabilityFPGAClusterAttributesINTEL = 5904,-    SpvCapabilityLoopFuseINTEL = 5906,-    SpvCapabilityMemoryAccessAliasingINTEL = 5910,-    SpvCapabilityFPGABufferLocationINTEL = 5920,-    SpvCapabilityArbitraryPrecisionFixedPointINTEL = 5922,-    SpvCapabilityUSMStorageClassesINTEL = 5935,-    SpvCapabilityIOPipesINTEL = 5943,-    SpvCapabilityBlockingPipesINTEL = 5945,-    SpvCapabilityFPGARegINTEL = 5948,-    SpvCapabilityDotProductInputAll = 6016,-    SpvCapabilityDotProductInputAllKHR = 6016,-    SpvCapabilityDotProductInput4x8Bit = 6017,-    SpvCapabilityDotProductInput4x8BitKHR = 6017,-    SpvCapabilityDotProductInput4x8BitPacked = 6018,-    SpvCapabilityDotProductInput4x8BitPackedKHR = 6018,-    SpvCapabilityDotProduct = 6019,-    SpvCapabilityDotProductKHR = 6019,-    SpvCapabilityRayCullMaskKHR = 6020,-    SpvCapabilityBitInstructions = 6025,-    SpvCapabilityGroupNonUniformRotateKHR = 6026,-    SpvCapabilityAtomicFloat32AddEXT = 6033,-    SpvCapabilityAtomicFloat64AddEXT = 6034,-    SpvCapabilityLongConstantCompositeINTEL = 6089,-    SpvCapabilityOptNoneINTEL = 6094,-    SpvCapabilityAtomicFloat16AddEXT = 6095,-    SpvCapabilityDebugInfoModuleINTEL = 6114,-    SpvCapabilitySplitBarrierINTEL = 6141,-    SpvCapabilityGroupUniformArithmeticKHR = 6400,-    SpvCapabilityMax = 0x7fffffff,-} SpvCapability;--typedef enum SpvRayFlagsShift_ {-    SpvRayFlagsOpaqueKHRShift = 0,-    SpvRayFlagsNoOpaqueKHRShift = 1,-    SpvRayFlagsTerminateOnFirstHitKHRShift = 2,-    SpvRayFlagsSkipClosestHitShaderKHRShift = 3,-    SpvRayFlagsCullBackFacingTrianglesKHRShift = 4,-    SpvRayFlagsCullFrontFacingTrianglesKHRShift = 5,-    SpvRayFlagsCullOpaqueKHRShift = 6,-    SpvRayFlagsCullNoOpaqueKHRShift = 7,-    SpvRayFlagsSkipTrianglesKHRShift = 8,-    SpvRayFlagsSkipAABBsKHRShift = 9,-    SpvRayFlagsMax = 0x7fffffff,-} SpvRayFlagsShift;--typedef enum SpvRayFlagsMask_ {-    SpvRayFlagsMaskNone = 0,-    SpvRayFlagsOpaqueKHRMask = 0x00000001,-    SpvRayFlagsNoOpaqueKHRMask = 0x00000002,-    SpvRayFlagsTerminateOnFirstHitKHRMask = 0x00000004,-    SpvRayFlagsSkipClosestHitShaderKHRMask = 0x00000008,-    SpvRayFlagsCullBackFacingTrianglesKHRMask = 0x00000010,-    SpvRayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020,-    SpvRayFlagsCullOpaqueKHRMask = 0x00000040,-    SpvRayFlagsCullNoOpaqueKHRMask = 0x00000080,-    SpvRayFlagsSkipTrianglesKHRMask = 0x00000100,-    SpvRayFlagsSkipAABBsKHRMask = 0x00000200,-} SpvRayFlagsMask;--typedef enum SpvRayQueryIntersection_ {-    SpvRayQueryIntersectionRayQueryCandidateIntersectionKHR = 0,-    SpvRayQueryIntersectionRayQueryCommittedIntersectionKHR = 1,-    SpvRayQueryIntersectionMax = 0x7fffffff,-} SpvRayQueryIntersection;--typedef enum SpvRayQueryCommittedIntersectionType_ {-    SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0,-    SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR = 1,-    SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR = 2,-    SpvRayQueryCommittedIntersectionTypeMax = 0x7fffffff,-} SpvRayQueryCommittedIntersectionType;--typedef enum SpvRayQueryCandidateIntersectionType_ {-    SpvRayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR = 0,-    SpvRayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1,-    SpvRayQueryCandidateIntersectionTypeMax = 0x7fffffff,-} SpvRayQueryCandidateIntersectionType;--typedef enum SpvFragmentShadingRateShift_ {-    SpvFragmentShadingRateVertical2PixelsShift = 0,-    SpvFragmentShadingRateVertical4PixelsShift = 1,-    SpvFragmentShadingRateHorizontal2PixelsShift = 2,-    SpvFragmentShadingRateHorizontal4PixelsShift = 3,-    SpvFragmentShadingRateMax = 0x7fffffff,-} SpvFragmentShadingRateShift;--typedef enum SpvFragmentShadingRateMask_ {-    SpvFragmentShadingRateMaskNone = 0,-    SpvFragmentShadingRateVertical2PixelsMask = 0x00000001,-    SpvFragmentShadingRateVertical4PixelsMask = 0x00000002,-    SpvFragmentShadingRateHorizontal2PixelsMask = 0x00000004,-    SpvFragmentShadingRateHorizontal4PixelsMask = 0x00000008,-} SpvFragmentShadingRateMask;--typedef enum SpvFPDenormMode_ {-    SpvFPDenormModePreserve = 0,-    SpvFPDenormModeFlushToZero = 1,-    SpvFPDenormModeMax = 0x7fffffff,-} SpvFPDenormMode;--typedef enum SpvFPOperationMode_ {-    SpvFPOperationModeIEEE = 0,-    SpvFPOperationModeALT = 1,-    SpvFPOperationModeMax = 0x7fffffff,-} SpvFPOperationMode;--typedef enum SpvQuantizationModes_ {-    SpvQuantizationModesTRN = 0,-    SpvQuantizationModesTRN_ZERO = 1,-    SpvQuantizationModesRND = 2,-    SpvQuantizationModesRND_ZERO = 3,-    SpvQuantizationModesRND_INF = 4,-    SpvQuantizationModesRND_MIN_INF = 5,-    SpvQuantizationModesRND_CONV = 6,-    SpvQuantizationModesRND_CONV_ODD = 7,-    SpvQuantizationModesMax = 0x7fffffff,-} SpvQuantizationModes;--typedef enum SpvOverflowModes_ {-    SpvOverflowModesWRAP = 0,-    SpvOverflowModesSAT = 1,-    SpvOverflowModesSAT_ZERO = 2,-    SpvOverflowModesSAT_SYM = 3,-    SpvOverflowModesMax = 0x7fffffff,-} SpvOverflowModes;--typedef enum SpvPackedVectorFormat_ {-    SpvPackedVectorFormatPackedVectorFormat4x8Bit = 0,-    SpvPackedVectorFormatPackedVectorFormat4x8BitKHR = 0,-    SpvPackedVectorFormatMax = 0x7fffffff,-} SpvPackedVectorFormat;--typedef enum SpvOp_ {-    SpvOpNop = 0,-    SpvOpUndef = 1,-    SpvOpSourceContinued = 2,-    SpvOpSource = 3,-    SpvOpSourceExtension = 4,-    SpvOpName = 5,-    SpvOpMemberName = 6,-    SpvOpString = 7,-    SpvOpLine = 8,-    SpvOpExtension = 10,-    SpvOpExtInstImport = 11,-    SpvOpExtInst = 12,-    SpvOpMemoryModel = 14,-    SpvOpEntryPoint = 15,-    SpvOpExecutionMode = 16,-    SpvOpCapability = 17,-    SpvOpTypeVoid = 19,-    SpvOpTypeBool = 20,-    SpvOpTypeInt = 21,-    SpvOpTypeFloat = 22,-    SpvOpTypeVector = 23,-    SpvOpTypeMatrix = 24,-    SpvOpTypeImage = 25,-    SpvOpTypeSampler = 26,-    SpvOpTypeSampledImage = 27,-    SpvOpTypeArray = 28,-    SpvOpTypeRuntimeArray = 29,-    SpvOpTypeStruct = 30,-    SpvOpTypeOpaque = 31,-    SpvOpTypePointer = 32,-    SpvOpTypeFunction = 33,-    SpvOpTypeEvent = 34,-    SpvOpTypeDeviceEvent = 35,-    SpvOpTypeReserveId = 36,-    SpvOpTypeQueue = 37,-    SpvOpTypePipe = 38,-    SpvOpTypeForwardPointer = 39,-    SpvOpConstantTrue = 41,-    SpvOpConstantFalse = 42,-    SpvOpConstant = 43,-    SpvOpConstantComposite = 44,-    SpvOpConstantSampler = 45,-    SpvOpConstantNull = 46,-    SpvOpSpecConstantTrue = 48,-    SpvOpSpecConstantFalse = 49,-    SpvOpSpecConstant = 50,-    SpvOpSpecConstantComposite = 51,-    SpvOpSpecConstantOp = 52,-    SpvOpFunction = 54,-    SpvOpFunctionParameter = 55,-    SpvOpFunctionEnd = 56,-    SpvOpFunctionCall = 57,-    SpvOpVariable = 59,-    SpvOpImageTexelPointer = 60,-    SpvOpLoad = 61,-    SpvOpStore = 62,-    SpvOpCopyMemory = 63,-    SpvOpCopyMemorySized = 64,-    SpvOpAccessChain = 65,-    SpvOpInBoundsAccessChain = 66,-    SpvOpPtrAccessChain = 67,-    SpvOpArrayLength = 68,-    SpvOpGenericPtrMemSemantics = 69,-    SpvOpInBoundsPtrAccessChain = 70,-    SpvOpDecorate = 71,-    SpvOpMemberDecorate = 72,-    SpvOpDecorationGroup = 73,-    SpvOpGroupDecorate = 74,-    SpvOpGroupMemberDecorate = 75,-    SpvOpVectorExtractDynamic = 77,-    SpvOpVectorInsertDynamic = 78,-    SpvOpVectorShuffle = 79,-    SpvOpCompositeConstruct = 80,-    SpvOpCompositeExtract = 81,-    SpvOpCompositeInsert = 82,-    SpvOpCopyObject = 83,-    SpvOpTranspose = 84,-    SpvOpSampledImage = 86,-    SpvOpImageSampleImplicitLod = 87,-    SpvOpImageSampleExplicitLod = 88,-    SpvOpImageSampleDrefImplicitLod = 89,-    SpvOpImageSampleDrefExplicitLod = 90,-    SpvOpImageSampleProjImplicitLod = 91,-    SpvOpImageSampleProjExplicitLod = 92,-    SpvOpImageSampleProjDrefImplicitLod = 93,-    SpvOpImageSampleProjDrefExplicitLod = 94,-    SpvOpImageFetch = 95,-    SpvOpImageGather = 96,-    SpvOpImageDrefGather = 97,-    SpvOpImageRead = 98,-    SpvOpImageWrite = 99,-    SpvOpImage = 100,-    SpvOpImageQueryFormat = 101,-    SpvOpImageQueryOrder = 102,-    SpvOpImageQuerySizeLod = 103,-    SpvOpImageQuerySize = 104,-    SpvOpImageQueryLod = 105,-    SpvOpImageQueryLevels = 106,-    SpvOpImageQuerySamples = 107,-    SpvOpConvertFToU = 109,-    SpvOpConvertFToS = 110,-    SpvOpConvertSToF = 111,-    SpvOpConvertUToF = 112,-    SpvOpUConvert = 113,-    SpvOpSConvert = 114,-    SpvOpFConvert = 115,-    SpvOpQuantizeToF16 = 116,-    SpvOpConvertPtrToU = 117,-    SpvOpSatConvertSToU = 118,-    SpvOpSatConvertUToS = 119,-    SpvOpConvertUToPtr = 120,-    SpvOpPtrCastToGeneric = 121,-    SpvOpGenericCastToPtr = 122,-    SpvOpGenericCastToPtrExplicit = 123,-    SpvOpBitcast = 124,-    SpvOpSNegate = 126,-    SpvOpFNegate = 127,-    SpvOpIAdd = 128,-    SpvOpFAdd = 129,-    SpvOpISub = 130,-    SpvOpFSub = 131,-    SpvOpIMul = 132,-    SpvOpFMul = 133,-    SpvOpUDiv = 134,-    SpvOpSDiv = 135,-    SpvOpFDiv = 136,-    SpvOpUMod = 137,-    SpvOpSRem = 138,-    SpvOpSMod = 139,-    SpvOpFRem = 140,-    SpvOpFMod = 141,-    SpvOpVectorTimesScalar = 142,-    SpvOpMatrixTimesScalar = 143,-    SpvOpVectorTimesMatrix = 144,-    SpvOpMatrixTimesVector = 145,-    SpvOpMatrixTimesMatrix = 146,-    SpvOpOuterProduct = 147,-    SpvOpDot = 148,-    SpvOpIAddCarry = 149,-    SpvOpISubBorrow = 150,-    SpvOpUMulExtended = 151,-    SpvOpSMulExtended = 152,-    SpvOpAny = 154,-    SpvOpAll = 155,-    SpvOpIsNan = 156,-    SpvOpIsInf = 157,-    SpvOpIsFinite = 158,-    SpvOpIsNormal = 159,-    SpvOpSignBitSet = 160,-    SpvOpLessOrGreater = 161,-    SpvOpOrdered = 162,-    SpvOpUnordered = 163,-    SpvOpLogicalEqual = 164,-    SpvOpLogicalNotEqual = 165,-    SpvOpLogicalOr = 166,-    SpvOpLogicalAnd = 167,-    SpvOpLogicalNot = 168,-    SpvOpSelect = 169,-    SpvOpIEqual = 170,-    SpvOpINotEqual = 171,-    SpvOpUGreaterThan = 172,-    SpvOpSGreaterThan = 173,-    SpvOpUGreaterThanEqual = 174,-    SpvOpSGreaterThanEqual = 175,-    SpvOpULessThan = 176,-    SpvOpSLessThan = 177,-    SpvOpULessThanEqual = 178,-    SpvOpSLessThanEqual = 179,-    SpvOpFOrdEqual = 180,-    SpvOpFUnordEqual = 181,-    SpvOpFOrdNotEqual = 182,-    SpvOpFUnordNotEqual = 183,-    SpvOpFOrdLessThan = 184,-    SpvOpFUnordLessThan = 185,-    SpvOpFOrdGreaterThan = 186,-    SpvOpFUnordGreaterThan = 187,-    SpvOpFOrdLessThanEqual = 188,-    SpvOpFUnordLessThanEqual = 189,-    SpvOpFOrdGreaterThanEqual = 190,-    SpvOpFUnordGreaterThanEqual = 191,-    SpvOpShiftRightLogical = 194,-    SpvOpShiftRightArithmetic = 195,-    SpvOpShiftLeftLogical = 196,-    SpvOpBitwiseOr = 197,-    SpvOpBitwiseXor = 198,-    SpvOpBitwiseAnd = 199,-    SpvOpNot = 200,-    SpvOpBitFieldInsert = 201,-    SpvOpBitFieldSExtract = 202,-    SpvOpBitFieldUExtract = 203,-    SpvOpBitReverse = 204,-    SpvOpBitCount = 205,-    SpvOpDPdx = 207,-    SpvOpDPdy = 208,-    SpvOpFwidth = 209,-    SpvOpDPdxFine = 210,-    SpvOpDPdyFine = 211,-    SpvOpFwidthFine = 212,-    SpvOpDPdxCoarse = 213,-    SpvOpDPdyCoarse = 214,-    SpvOpFwidthCoarse = 215,-    SpvOpEmitVertex = 218,-    SpvOpEndPrimitive = 219,-    SpvOpEmitStreamVertex = 220,-    SpvOpEndStreamPrimitive = 221,-    SpvOpControlBarrier = 224,-    SpvOpMemoryBarrier = 225,-    SpvOpAtomicLoad = 227,-    SpvOpAtomicStore = 228,-    SpvOpAtomicExchange = 229,-    SpvOpAtomicCompareExchange = 230,-    SpvOpAtomicCompareExchangeWeak = 231,-    SpvOpAtomicIIncrement = 232,-    SpvOpAtomicIDecrement = 233,-    SpvOpAtomicIAdd = 234,-    SpvOpAtomicISub = 235,-    SpvOpAtomicSMin = 236,-    SpvOpAtomicUMin = 237,-    SpvOpAtomicSMax = 238,-    SpvOpAtomicUMax = 239,-    SpvOpAtomicAnd = 240,-    SpvOpAtomicOr = 241,-    SpvOpAtomicXor = 242,-    SpvOpPhi = 245,-    SpvOpLoopMerge = 246,-    SpvOpSelectionMerge = 247,-    SpvOpLabel = 248,-    SpvOpBranch = 249,-    SpvOpBranchConditional = 250,-    SpvOpSwitch = 251,-    SpvOpKill = 252,-    SpvOpReturn = 253,-    SpvOpReturnValue = 254,-    SpvOpUnreachable = 255,-    SpvOpLifetimeStart = 256,-    SpvOpLifetimeStop = 257,-    SpvOpGroupAsyncCopy = 259,-    SpvOpGroupWaitEvents = 260,-    SpvOpGroupAll = 261,-    SpvOpGroupAny = 262,-    SpvOpGroupBroadcast = 263,-    SpvOpGroupIAdd = 264,-    SpvOpGroupFAdd = 265,-    SpvOpGroupFMin = 266,-    SpvOpGroupUMin = 267,-    SpvOpGroupSMin = 268,-    SpvOpGroupFMax = 269,-    SpvOpGroupUMax = 270,-    SpvOpGroupSMax = 271,-    SpvOpReadPipe = 274,-    SpvOpWritePipe = 275,-    SpvOpReservedReadPipe = 276,-    SpvOpReservedWritePipe = 277,-    SpvOpReserveReadPipePackets = 278,-    SpvOpReserveWritePipePackets = 279,-    SpvOpCommitReadPipe = 280,-    SpvOpCommitWritePipe = 281,-    SpvOpIsValidReserveId = 282,-    SpvOpGetNumPipePackets = 283,-    SpvOpGetMaxPipePackets = 284,-    SpvOpGroupReserveReadPipePackets = 285,-    SpvOpGroupReserveWritePipePackets = 286,-    SpvOpGroupCommitReadPipe = 287,-    SpvOpGroupCommitWritePipe = 288,-    SpvOpEnqueueMarker = 291,-    SpvOpEnqueueKernel = 292,-    SpvOpGetKernelNDrangeSubGroupCount = 293,-    SpvOpGetKernelNDrangeMaxSubGroupSize = 294,-    SpvOpGetKernelWorkGroupSize = 295,-    SpvOpGetKernelPreferredWorkGroupSizeMultiple = 296,-    SpvOpRetainEvent = 297,-    SpvOpReleaseEvent = 298,-    SpvOpCreateUserEvent = 299,-    SpvOpIsValidEvent = 300,-    SpvOpSetUserEventStatus = 301,-    SpvOpCaptureEventProfilingInfo = 302,-    SpvOpGetDefaultQueue = 303,-    SpvOpBuildNDRange = 304,-    SpvOpImageSparseSampleImplicitLod = 305,-    SpvOpImageSparseSampleExplicitLod = 306,-    SpvOpImageSparseSampleDrefImplicitLod = 307,-    SpvOpImageSparseSampleDrefExplicitLod = 308,-    SpvOpImageSparseSampleProjImplicitLod = 309,-    SpvOpImageSparseSampleProjExplicitLod = 310,-    SpvOpImageSparseSampleProjDrefImplicitLod = 311,-    SpvOpImageSparseSampleProjDrefExplicitLod = 312,-    SpvOpImageSparseFetch = 313,-    SpvOpImageSparseGather = 314,-    SpvOpImageSparseDrefGather = 315,-    SpvOpImageSparseTexelsResident = 316,-    SpvOpNoLine = 317,-    SpvOpAtomicFlagTestAndSet = 318,-    SpvOpAtomicFlagClear = 319,-    SpvOpImageSparseRead = 320,-    SpvOpSizeOf = 321,-    SpvOpTypePipeStorage = 322,-    SpvOpConstantPipeStorage = 323,-    SpvOpCreatePipeFromPipeStorage = 324,-    SpvOpGetKernelLocalSizeForSubgroupCount = 325,-    SpvOpGetKernelMaxNumSubgroups = 326,-    SpvOpTypeNamedBarrier = 327,-    SpvOpNamedBarrierInitialize = 328,-    SpvOpMemoryNamedBarrier = 329,-    SpvOpModuleProcessed = 330,-    SpvOpExecutionModeId = 331,-    SpvOpDecorateId = 332,-    SpvOpGroupNonUniformElect = 333,-    SpvOpGroupNonUniformAll = 334,-    SpvOpGroupNonUniformAny = 335,-    SpvOpGroupNonUniformAllEqual = 336,-    SpvOpGroupNonUniformBroadcast = 337,-    SpvOpGroupNonUniformBroadcastFirst = 338,-    SpvOpGroupNonUniformBallot = 339,-    SpvOpGroupNonUniformInverseBallot = 340,-    SpvOpGroupNonUniformBallotBitExtract = 341,-    SpvOpGroupNonUniformBallotBitCount = 342,-    SpvOpGroupNonUniformBallotFindLSB = 343,-    SpvOpGroupNonUniformBallotFindMSB = 344,-    SpvOpGroupNonUniformShuffle = 345,-    SpvOpGroupNonUniformShuffleXor = 346,-    SpvOpGroupNonUniformShuffleUp = 347,-    SpvOpGroupNonUniformShuffleDown = 348,-    SpvOpGroupNonUniformIAdd = 349,-    SpvOpGroupNonUniformFAdd = 350,-    SpvOpGroupNonUniformIMul = 351,-    SpvOpGroupNonUniformFMul = 352,-    SpvOpGroupNonUniformSMin = 353,-    SpvOpGroupNonUniformUMin = 354,-    SpvOpGroupNonUniformFMin = 355,-    SpvOpGroupNonUniformSMax = 356,-    SpvOpGroupNonUniformUMax = 357,-    SpvOpGroupNonUniformFMax = 358,-    SpvOpGroupNonUniformBitwiseAnd = 359,-    SpvOpGroupNonUniformBitwiseOr = 360,-    SpvOpGroupNonUniformBitwiseXor = 361,-    SpvOpGroupNonUniformLogicalAnd = 362,-    SpvOpGroupNonUniformLogicalOr = 363,-    SpvOpGroupNonUniformLogicalXor = 364,-    SpvOpGroupNonUniformQuadBroadcast = 365,-    SpvOpGroupNonUniformQuadSwap = 366,-    SpvOpCopyLogical = 400,-    SpvOpPtrEqual = 401,-    SpvOpPtrNotEqual = 402,-    SpvOpPtrDiff = 403,-    SpvOpTerminateInvocation = 4416,-    SpvOpSubgroupBallotKHR = 4421,-    SpvOpSubgroupFirstInvocationKHR = 4422,-    SpvOpSubgroupAllKHR = 4428,-    SpvOpSubgroupAnyKHR = 4429,-    SpvOpSubgroupAllEqualKHR = 4430,-    SpvOpGroupNonUniformRotateKHR = 4431,-    SpvOpSubgroupReadInvocationKHR = 4432,-    SpvOpTraceRayKHR = 4445,-    SpvOpExecuteCallableKHR = 4446,-    SpvOpConvertUToAccelerationStructureKHR = 4447,-    SpvOpIgnoreIntersectionKHR = 4448,-    SpvOpTerminateRayKHR = 4449,-    SpvOpSDot = 4450,-    SpvOpSDotKHR = 4450,-    SpvOpUDot = 4451,-    SpvOpUDotKHR = 4451,-    SpvOpSUDot = 4452,-    SpvOpSUDotKHR = 4452,-    SpvOpSDotAccSat = 4453,-    SpvOpSDotAccSatKHR = 4453,-    SpvOpUDotAccSat = 4454,-    SpvOpUDotAccSatKHR = 4454,-    SpvOpSUDotAccSat = 4455,-    SpvOpSUDotAccSatKHR = 4455,-    SpvOpTypeRayQueryKHR = 4472,-    SpvOpRayQueryInitializeKHR = 4473,-    SpvOpRayQueryTerminateKHR = 4474,-    SpvOpRayQueryGenerateIntersectionKHR = 4475,-    SpvOpRayQueryConfirmIntersectionKHR = 4476,-    SpvOpRayQueryProceedKHR = 4477,-    SpvOpRayQueryGetIntersectionTypeKHR = 4479,-    SpvOpGroupIAddNonUniformAMD = 5000,-    SpvOpGroupFAddNonUniformAMD = 5001,-    SpvOpGroupFMinNonUniformAMD = 5002,-    SpvOpGroupUMinNonUniformAMD = 5003,-    SpvOpGroupSMinNonUniformAMD = 5004,-    SpvOpGroupFMaxNonUniformAMD = 5005,-    SpvOpGroupUMaxNonUniformAMD = 5006,-    SpvOpGroupSMaxNonUniformAMD = 5007,-    SpvOpFragmentMaskFetchAMD = 5011,-    SpvOpFragmentFetchAMD = 5012,-    SpvOpReadClockKHR = 5056,-    SpvOpImageSampleFootprintNV = 5283,-    SpvOpGroupNonUniformPartitionNV = 5296,-    SpvOpWritePackedPrimitiveIndices4x8NV = 5299,-    SpvOpReportIntersectionKHR = 5334,-    SpvOpReportIntersectionNV = 5334,-    SpvOpIgnoreIntersectionNV = 5335,-    SpvOpTerminateRayNV = 5336,-    SpvOpTraceNV = 5337,-    SpvOpTraceMotionNV = 5338,-    SpvOpTraceRayMotionNV = 5339,-    SpvOpTypeAccelerationStructureKHR = 5341,-    SpvOpTypeAccelerationStructureNV = 5341,-    SpvOpExecuteCallableNV = 5344,-    SpvOpTypeCooperativeMatrixNV = 5358,-    SpvOpCooperativeMatrixLoadNV = 5359,-    SpvOpCooperativeMatrixStoreNV = 5360,-    SpvOpCooperativeMatrixMulAddNV = 5361,-    SpvOpCooperativeMatrixLengthNV = 5362,-    SpvOpBeginInvocationInterlockEXT = 5364,-    SpvOpEndInvocationInterlockEXT = 5365,-    SpvOpDemoteToHelperInvocation = 5380,-    SpvOpDemoteToHelperInvocationEXT = 5380,-    SpvOpIsHelperInvocationEXT = 5381,-    SpvOpConvertUToImageNV = 5391,-    SpvOpConvertUToSamplerNV = 5392,-    SpvOpConvertImageToUNV = 5393,-    SpvOpConvertSamplerToUNV = 5394,-    SpvOpConvertUToSampledImageNV = 5395,-    SpvOpConvertSampledImageToUNV = 5396,-    SpvOpSamplerImageAddressingModeNV = 5397,-    SpvOpSubgroupShuffleINTEL = 5571,-    SpvOpSubgroupShuffleDownINTEL = 5572,-    SpvOpSubgroupShuffleUpINTEL = 5573,-    SpvOpSubgroupShuffleXorINTEL = 5574,-    SpvOpSubgroupBlockReadINTEL = 5575,-    SpvOpSubgroupBlockWriteINTEL = 5576,-    SpvOpSubgroupImageBlockReadINTEL = 5577,-    SpvOpSubgroupImageBlockWriteINTEL = 5578,-    SpvOpSubgroupImageMediaBlockReadINTEL = 5580,-    SpvOpSubgroupImageMediaBlockWriteINTEL = 5581,-    SpvOpUCountLeadingZerosINTEL = 5585,-    SpvOpUCountTrailingZerosINTEL = 5586,-    SpvOpAbsISubINTEL = 5587,-    SpvOpAbsUSubINTEL = 5588,-    SpvOpIAddSatINTEL = 5589,-    SpvOpUAddSatINTEL = 5590,-    SpvOpIAverageINTEL = 5591,-    SpvOpUAverageINTEL = 5592,-    SpvOpIAverageRoundedINTEL = 5593,-    SpvOpUAverageRoundedINTEL = 5594,-    SpvOpISubSatINTEL = 5595,-    SpvOpUSubSatINTEL = 5596,-    SpvOpIMul32x16INTEL = 5597,-    SpvOpUMul32x16INTEL = 5598,-    SpvOpConstantFunctionPointerINTEL = 5600,-    SpvOpFunctionPointerCallINTEL = 5601,-    SpvOpAsmTargetINTEL = 5609,-    SpvOpAsmINTEL = 5610,-    SpvOpAsmCallINTEL = 5611,-    SpvOpAtomicFMinEXT = 5614,-    SpvOpAtomicFMaxEXT = 5615,-    SpvOpAssumeTrueKHR = 5630,-    SpvOpExpectKHR = 5631,-    SpvOpDecorateString = 5632,-    SpvOpDecorateStringGOOGLE = 5632,-    SpvOpMemberDecorateString = 5633,-    SpvOpMemberDecorateStringGOOGLE = 5633,-    SpvOpVmeImageINTEL = 5699,-    SpvOpTypeVmeImageINTEL = 5700,-    SpvOpTypeAvcImePayloadINTEL = 5701,-    SpvOpTypeAvcRefPayloadINTEL = 5702,-    SpvOpTypeAvcSicPayloadINTEL = 5703,-    SpvOpTypeAvcMcePayloadINTEL = 5704,-    SpvOpTypeAvcMceResultINTEL = 5705,-    SpvOpTypeAvcImeResultINTEL = 5706,-    SpvOpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,-    SpvOpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,-    SpvOpTypeAvcImeSingleReferenceStreaminINTEL = 5709,-    SpvOpTypeAvcImeDualReferenceStreaminINTEL = 5710,-    SpvOpTypeAvcRefResultINTEL = 5711,-    SpvOpTypeAvcSicResultINTEL = 5712,-    SpvOpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,-    SpvOpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,-    SpvOpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,-    SpvOpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,-    SpvOpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,-    SpvOpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,-    SpvOpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,-    SpvOpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,-    SpvOpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,-    SpvOpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,-    SpvOpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,-    SpvOpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,-    SpvOpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,-    SpvOpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,-    SpvOpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,-    SpvOpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,-    SpvOpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,-    SpvOpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,-    SpvOpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,-    SpvOpSubgroupAvcMceConvertToImePayloadINTEL = 5732,-    SpvOpSubgroupAvcMceConvertToImeResultINTEL = 5733,-    SpvOpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,-    SpvOpSubgroupAvcMceConvertToRefResultINTEL = 5735,-    SpvOpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,-    SpvOpSubgroupAvcMceConvertToSicResultINTEL = 5737,-    SpvOpSubgroupAvcMceGetMotionVectorsINTEL = 5738,-    SpvOpSubgroupAvcMceGetInterDistortionsINTEL = 5739,-    SpvOpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,-    SpvOpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,-    SpvOpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,-    SpvOpSubgroupAvcMceGetInterDirectionsINTEL = 5743,-    SpvOpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,-    SpvOpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,-    SpvOpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,-    SpvOpSubgroupAvcImeInitializeINTEL = 5747,-    SpvOpSubgroupAvcImeSetSingleReferenceINTEL = 5748,-    SpvOpSubgroupAvcImeSetDualReferenceINTEL = 5749,-    SpvOpSubgroupAvcImeRefWindowSizeINTEL = 5750,-    SpvOpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,-    SpvOpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,-    SpvOpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,-    SpvOpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,-    SpvOpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,-    SpvOpSubgroupAvcImeSetWeightedSadINTEL = 5756,-    SpvOpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,-    SpvOpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,-    SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,-    SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,-    SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,-    SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,-    SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,-    SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,-    SpvOpSubgroupAvcImeConvertToMceResultINTEL = 5765,-    SpvOpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,-    SpvOpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,-    SpvOpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,-    SpvOpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,-    SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL = 5770,-    SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL = 5771,-    SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL = 5772,-    SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL = 5773,-    SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,-    SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL = 5775,-    SpvOpSubgroupAvcImeGetBorderReachedINTEL = 5776,-    SpvOpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,-    SpvOpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,-    SpvOpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,-    SpvOpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,-    SpvOpSubgroupAvcFmeInitializeINTEL = 5781,-    SpvOpSubgroupAvcBmeInitializeINTEL = 5782,-    SpvOpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,-    SpvOpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,-    SpvOpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,-    SpvOpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,-    SpvOpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,-    SpvOpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,-    SpvOpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,-    SpvOpSubgroupAvcRefConvertToMceResultINTEL = 5790,-    SpvOpSubgroupAvcSicInitializeINTEL = 5791,-    SpvOpSubgroupAvcSicConfigureSkcINTEL = 5792,-    SpvOpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,-    SpvOpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,-    SpvOpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,-    SpvOpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,-    SpvOpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,-    SpvOpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,-    SpvOpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,-    SpvOpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,-    SpvOpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,-    SpvOpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,-    SpvOpSubgroupAvcSicEvaluateIpeINTEL = 5803,-    SpvOpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,-    SpvOpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,-    SpvOpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,-    SpvOpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,-    SpvOpSubgroupAvcSicConvertToMceResultINTEL = 5808,-    SpvOpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,-    SpvOpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,-    SpvOpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,-    SpvOpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,-    SpvOpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,-    SpvOpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,-    SpvOpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,-    SpvOpSubgroupAvcSicGetInterRawSadsINTEL = 5816,-    SpvOpVariableLengthArrayINTEL = 5818,-    SpvOpSaveMemoryINTEL = 5819,-    SpvOpRestoreMemoryINTEL = 5820,-    SpvOpArbitraryFloatSinCosPiINTEL = 5840,-    SpvOpArbitraryFloatCastINTEL = 5841,-    SpvOpArbitraryFloatCastFromIntINTEL = 5842,-    SpvOpArbitraryFloatCastToIntINTEL = 5843,-    SpvOpArbitraryFloatAddINTEL = 5846,-    SpvOpArbitraryFloatSubINTEL = 5847,-    SpvOpArbitraryFloatMulINTEL = 5848,-    SpvOpArbitraryFloatDivINTEL = 5849,-    SpvOpArbitraryFloatGTINTEL = 5850,-    SpvOpArbitraryFloatGEINTEL = 5851,-    SpvOpArbitraryFloatLTINTEL = 5852,-    SpvOpArbitraryFloatLEINTEL = 5853,-    SpvOpArbitraryFloatEQINTEL = 5854,-    SpvOpArbitraryFloatRecipINTEL = 5855,-    SpvOpArbitraryFloatRSqrtINTEL = 5856,-    SpvOpArbitraryFloatCbrtINTEL = 5857,-    SpvOpArbitraryFloatHypotINTEL = 5858,-    SpvOpArbitraryFloatSqrtINTEL = 5859,-    SpvOpArbitraryFloatLogINTEL = 5860,-    SpvOpArbitraryFloatLog2INTEL = 5861,-    SpvOpArbitraryFloatLog10INTEL = 5862,-    SpvOpArbitraryFloatLog1pINTEL = 5863,-    SpvOpArbitraryFloatExpINTEL = 5864,-    SpvOpArbitraryFloatExp2INTEL = 5865,-    SpvOpArbitraryFloatExp10INTEL = 5866,-    SpvOpArbitraryFloatExpm1INTEL = 5867,-    SpvOpArbitraryFloatSinINTEL = 5868,-    SpvOpArbitraryFloatCosINTEL = 5869,-    SpvOpArbitraryFloatSinCosINTEL = 5870,-    SpvOpArbitraryFloatSinPiINTEL = 5871,-    SpvOpArbitraryFloatCosPiINTEL = 5872,-    SpvOpArbitraryFloatASinINTEL = 5873,-    SpvOpArbitraryFloatASinPiINTEL = 5874,-    SpvOpArbitraryFloatACosINTEL = 5875,-    SpvOpArbitraryFloatACosPiINTEL = 5876,-    SpvOpArbitraryFloatATanINTEL = 5877,-    SpvOpArbitraryFloatATanPiINTEL = 5878,-    SpvOpArbitraryFloatATan2INTEL = 5879,-    SpvOpArbitraryFloatPowINTEL = 5880,-    SpvOpArbitraryFloatPowRINTEL = 5881,-    SpvOpArbitraryFloatPowNINTEL = 5882,-    SpvOpLoopControlINTEL = 5887,-    SpvOpAliasDomainDeclINTEL = 5911,-    SpvOpAliasScopeDeclINTEL = 5912,-    SpvOpAliasScopeListDeclINTEL = 5913,-    SpvOpFixedSqrtINTEL = 5923,-    SpvOpFixedRecipINTEL = 5924,-    SpvOpFixedRsqrtINTEL = 5925,-    SpvOpFixedSinINTEL = 5926,-    SpvOpFixedCosINTEL = 5927,-    SpvOpFixedSinCosINTEL = 5928,-    SpvOpFixedSinPiINTEL = 5929,-    SpvOpFixedCosPiINTEL = 5930,-    SpvOpFixedSinCosPiINTEL = 5931,-    SpvOpFixedLogINTEL = 5932,-    SpvOpFixedExpINTEL = 5933,-    SpvOpPtrCastToCrossWorkgroupINTEL = 5934,-    SpvOpCrossWorkgroupCastToPtrINTEL = 5938,-    SpvOpReadPipeBlockingINTEL = 5946,-    SpvOpWritePipeBlockingINTEL = 5947,-    SpvOpFPGARegINTEL = 5949,-    SpvOpRayQueryGetRayTMinKHR = 6016,-    SpvOpRayQueryGetRayFlagsKHR = 6017,-    SpvOpRayQueryGetIntersectionTKHR = 6018,-    SpvOpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,-    SpvOpRayQueryGetIntersectionInstanceIdKHR = 6020,-    SpvOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,-    SpvOpRayQueryGetIntersectionGeometryIndexKHR = 6022,-    SpvOpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,-    SpvOpRayQueryGetIntersectionBarycentricsKHR = 6024,-    SpvOpRayQueryGetIntersectionFrontFaceKHR = 6025,-    SpvOpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,-    SpvOpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,-    SpvOpRayQueryGetIntersectionObjectRayOriginKHR = 6028,-    SpvOpRayQueryGetWorldRayDirectionKHR = 6029,-    SpvOpRayQueryGetWorldRayOriginKHR = 6030,-    SpvOpRayQueryGetIntersectionObjectToWorldKHR = 6031,-    SpvOpRayQueryGetIntersectionWorldToObjectKHR = 6032,-    SpvOpAtomicFAddEXT = 6035,-    SpvOpTypeBufferSurfaceINTEL = 6086,-    SpvOpTypeStructContinuedINTEL = 6090,-    SpvOpConstantCompositeContinuedINTEL = 6091,-    SpvOpSpecConstantCompositeContinuedINTEL = 6092,-    SpvOpControlBarrierArriveINTEL = 6142,-    SpvOpControlBarrierWaitINTEL = 6143,-    SpvOpGroupIMulKHR = 6401,-    SpvOpGroupFMulKHR = 6402,-    SpvOpGroupBitwiseAndKHR = 6403,-    SpvOpGroupBitwiseOrKHR = 6404,-    SpvOpGroupBitwiseXorKHR = 6405,-    SpvOpGroupLogicalAndKHR = 6406,-    SpvOpGroupLogicalOrKHR = 6407,-    SpvOpGroupLogicalXorKHR = 6408,-    SpvOpMax = 0x7fffffff,-} SpvOp;--#ifdef SPV_ENABLE_UTILITY_CODE-#ifndef __cplusplus-#include <stdbool.h>-#endif-inline void SpvHasResultAndType(SpvOp opcode, bool *hasResult, bool *hasResultType) {-    *hasResult = *hasResultType = false;-    switch (opcode) {-    default: /* unknown opcode */ break;-    case SpvOpNop: *hasResult = false; *hasResultType = false; break;-    case SpvOpUndef: *hasResult = true; *hasResultType = true; break;-    case SpvOpSourceContinued: *hasResult = false; *hasResultType = false; break;-    case SpvOpSource: *hasResult = false; *hasResultType = false; break;-    case SpvOpSourceExtension: *hasResult = false; *hasResultType = false; break;-    case SpvOpName: *hasResult = false; *hasResultType = false; break;-    case SpvOpMemberName: *hasResult = false; *hasResultType = false; break;-    case SpvOpString: *hasResult = true; *hasResultType = false; break;-    case SpvOpLine: *hasResult = false; *hasResultType = false; break;-    case SpvOpExtension: *hasResult = false; *hasResultType = false; break;-    case SpvOpExtInstImport: *hasResult = true; *hasResultType = false; break;-    case SpvOpExtInst: *hasResult = true; *hasResultType = true; break;-    case SpvOpMemoryModel: *hasResult = false; *hasResultType = false; break;-    case SpvOpEntryPoint: *hasResult = false; *hasResultType = false; break;-    case SpvOpExecutionMode: *hasResult = false; *hasResultType = false; break;-    case SpvOpCapability: *hasResult = false; *hasResultType = false; break;-    case SpvOpTypeVoid: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeBool: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeInt: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeFloat: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeVector: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeMatrix: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeImage: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeSampler: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeSampledImage: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeArray: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeRuntimeArray: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeStruct: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeOpaque: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypePointer: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeFunction: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeEvent: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeDeviceEvent: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeReserveId: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeQueue: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypePipe: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeForwardPointer: *hasResult = false; *hasResultType = false; break;-    case SpvOpConstantTrue: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstantFalse: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstant: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstantComposite: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstantSampler: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstantNull: *hasResult = true; *hasResultType = true; break;-    case SpvOpSpecConstantTrue: *hasResult = true; *hasResultType = true; break;-    case SpvOpSpecConstantFalse: *hasResult = true; *hasResultType = true; break;-    case SpvOpSpecConstant: *hasResult = true; *hasResultType = true; break;-    case SpvOpSpecConstantComposite: *hasResult = true; *hasResultType = true; break;-    case SpvOpSpecConstantOp: *hasResult = true; *hasResultType = true; break;-    case SpvOpFunction: *hasResult = true; *hasResultType = true; break;-    case SpvOpFunctionParameter: *hasResult = true; *hasResultType = true; break;-    case SpvOpFunctionEnd: *hasResult = false; *hasResultType = false; break;-    case SpvOpFunctionCall: *hasResult = true; *hasResultType = true; break;-    case SpvOpVariable: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageTexelPointer: *hasResult = true; *hasResultType = true; break;-    case SpvOpLoad: *hasResult = true; *hasResultType = true; break;-    case SpvOpStore: *hasResult = false; *hasResultType = false; break;-    case SpvOpCopyMemory: *hasResult = false; *hasResultType = false; break;-    case SpvOpCopyMemorySized: *hasResult = false; *hasResultType = false; break;-    case SpvOpAccessChain: *hasResult = true; *hasResultType = true; break;-    case SpvOpInBoundsAccessChain: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrAccessChain: *hasResult = true; *hasResultType = true; break;-    case SpvOpArrayLength: *hasResult = true; *hasResultType = true; break;-    case SpvOpGenericPtrMemSemantics: *hasResult = true; *hasResultType = true; break;-    case SpvOpInBoundsPtrAccessChain: *hasResult = true; *hasResultType = true; break;-    case SpvOpDecorate: *hasResult = false; *hasResultType = false; break;-    case SpvOpMemberDecorate: *hasResult = false; *hasResultType = false; break;-    case SpvOpDecorationGroup: *hasResult = true; *hasResultType = false; break;-    case SpvOpGroupDecorate: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupMemberDecorate: *hasResult = false; *hasResultType = false; break;-    case SpvOpVectorExtractDynamic: *hasResult = true; *hasResultType = true; break;-    case SpvOpVectorInsertDynamic: *hasResult = true; *hasResultType = true; break;-    case SpvOpVectorShuffle: *hasResult = true; *hasResultType = true; break;-    case SpvOpCompositeConstruct: *hasResult = true; *hasResultType = true; break;-    case SpvOpCompositeExtract: *hasResult = true; *hasResultType = true; break;-    case SpvOpCompositeInsert: *hasResult = true; *hasResultType = true; break;-    case SpvOpCopyObject: *hasResult = true; *hasResultType = true; break;-    case SpvOpTranspose: *hasResult = true; *hasResultType = true; break;-    case SpvOpSampledImage: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageFetch: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageGather: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageDrefGather: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageRead: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageWrite: *hasResult = false; *hasResultType = false; break;-    case SpvOpImage: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQueryFormat: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQueryOrder: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQuerySizeLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQuerySize: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQueryLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQueryLevels: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageQuerySamples: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertFToU: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertFToS: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertSToF: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertUToF: *hasResult = true; *hasResultType = true; break;-    case SpvOpUConvert: *hasResult = true; *hasResultType = true; break;-    case SpvOpSConvert: *hasResult = true; *hasResultType = true; break;-    case SpvOpFConvert: *hasResult = true; *hasResultType = true; break;-    case SpvOpQuantizeToF16: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertPtrToU: *hasResult = true; *hasResultType = true; break;-    case SpvOpSatConvertSToU: *hasResult = true; *hasResultType = true; break;-    case SpvOpSatConvertUToS: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertUToPtr: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrCastToGeneric: *hasResult = true; *hasResultType = true; break;-    case SpvOpGenericCastToPtr: *hasResult = true; *hasResultType = true; break;-    case SpvOpGenericCastToPtrExplicit: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitcast: *hasResult = true; *hasResultType = true; break;-    case SpvOpSNegate: *hasResult = true; *hasResultType = true; break;-    case SpvOpFNegate: *hasResult = true; *hasResultType = true; break;-    case SpvOpIAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpFAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpISub: *hasResult = true; *hasResultType = true; break;-    case SpvOpFSub: *hasResult = true; *hasResultType = true; break;-    case SpvOpIMul: *hasResult = true; *hasResultType = true; break;-    case SpvOpFMul: *hasResult = true; *hasResultType = true; break;-    case SpvOpUDiv: *hasResult = true; *hasResultType = true; break;-    case SpvOpSDiv: *hasResult = true; *hasResultType = true; break;-    case SpvOpFDiv: *hasResult = true; *hasResultType = true; break;-    case SpvOpUMod: *hasResult = true; *hasResultType = true; break;-    case SpvOpSRem: *hasResult = true; *hasResultType = true; break;-    case SpvOpSMod: *hasResult = true; *hasResultType = true; break;-    case SpvOpFRem: *hasResult = true; *hasResultType = true; break;-    case SpvOpFMod: *hasResult = true; *hasResultType = true; break;-    case SpvOpVectorTimesScalar: *hasResult = true; *hasResultType = true; break;-    case SpvOpMatrixTimesScalar: *hasResult = true; *hasResultType = true; break;-    case SpvOpVectorTimesMatrix: *hasResult = true; *hasResultType = true; break;-    case SpvOpMatrixTimesVector: *hasResult = true; *hasResultType = true; break;-    case SpvOpMatrixTimesMatrix: *hasResult = true; *hasResultType = true; break;-    case SpvOpOuterProduct: *hasResult = true; *hasResultType = true; break;-    case SpvOpDot: *hasResult = true; *hasResultType = true; break;-    case SpvOpIAddCarry: *hasResult = true; *hasResultType = true; break;-    case SpvOpISubBorrow: *hasResult = true; *hasResultType = true; break;-    case SpvOpUMulExtended: *hasResult = true; *hasResultType = true; break;-    case SpvOpSMulExtended: *hasResult = true; *hasResultType = true; break;-    case SpvOpAny: *hasResult = true; *hasResultType = true; break;-    case SpvOpAll: *hasResult = true; *hasResultType = true; break;-    case SpvOpIsNan: *hasResult = true; *hasResultType = true; break;-    case SpvOpIsInf: *hasResult = true; *hasResultType = true; break;-    case SpvOpIsFinite: *hasResult = true; *hasResultType = true; break;-    case SpvOpIsNormal: *hasResult = true; *hasResultType = true; break;-    case SpvOpSignBitSet: *hasResult = true; *hasResultType = true; break;-    case SpvOpLessOrGreater: *hasResult = true; *hasResultType = true; break;-    case SpvOpOrdered: *hasResult = true; *hasResultType = true; break;-    case SpvOpUnordered: *hasResult = true; *hasResultType = true; break;-    case SpvOpLogicalEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpLogicalNotEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpLogicalOr: *hasResult = true; *hasResultType = true; break;-    case SpvOpLogicalAnd: *hasResult = true; *hasResultType = true; break;-    case SpvOpLogicalNot: *hasResult = true; *hasResultType = true; break;-    case SpvOpSelect: *hasResult = true; *hasResultType = true; break;-    case SpvOpIEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpINotEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpUGreaterThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpSGreaterThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpUGreaterThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpSGreaterThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpULessThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpSLessThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpULessThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpSLessThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdNotEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordNotEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdLessThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordLessThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdGreaterThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordGreaterThan: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdLessThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordLessThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFOrdGreaterThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpFUnordGreaterThanEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpShiftRightLogical: *hasResult = true; *hasResultType = true; break;-    case SpvOpShiftRightArithmetic: *hasResult = true; *hasResultType = true; break;-    case SpvOpShiftLeftLogical: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitwiseOr: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitwiseXor: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitwiseAnd: *hasResult = true; *hasResultType = true; break;-    case SpvOpNot: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitFieldInsert: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitFieldSExtract: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitFieldUExtract: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitReverse: *hasResult = true; *hasResultType = true; break;-    case SpvOpBitCount: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdx: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdy: *hasResult = true; *hasResultType = true; break;-    case SpvOpFwidth: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdxFine: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdyFine: *hasResult = true; *hasResultType = true; break;-    case SpvOpFwidthFine: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdxCoarse: *hasResult = true; *hasResultType = true; break;-    case SpvOpDPdyCoarse: *hasResult = true; *hasResultType = true; break;-    case SpvOpFwidthCoarse: *hasResult = true; *hasResultType = true; break;-    case SpvOpEmitVertex: *hasResult = false; *hasResultType = false; break;-    case SpvOpEndPrimitive: *hasResult = false; *hasResultType = false; break;-    case SpvOpEmitStreamVertex: *hasResult = false; *hasResultType = false; break;-    case SpvOpEndStreamPrimitive: *hasResult = false; *hasResultType = false; break;-    case SpvOpControlBarrier: *hasResult = false; *hasResultType = false; break;-    case SpvOpMemoryBarrier: *hasResult = false; *hasResultType = false; break;-    case SpvOpAtomicLoad: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicStore: *hasResult = false; *hasResultType = false; break;-    case SpvOpAtomicExchange: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicCompareExchange: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicCompareExchangeWeak: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicIIncrement: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicIDecrement: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicIAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicISub: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicSMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicUMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicSMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicUMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicAnd: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicOr: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicXor: *hasResult = true; *hasResultType = true; break;-    case SpvOpPhi: *hasResult = true; *hasResultType = true; break;-    case SpvOpLoopMerge: *hasResult = false; *hasResultType = false; break;-    case SpvOpSelectionMerge: *hasResult = false; *hasResultType = false; break;-    case SpvOpLabel: *hasResult = true; *hasResultType = false; break;-    case SpvOpBranch: *hasResult = false; *hasResultType = false; break;-    case SpvOpBranchConditional: *hasResult = false; *hasResultType = false; break;-    case SpvOpSwitch: *hasResult = false; *hasResultType = false; break;-    case SpvOpKill: *hasResult = false; *hasResultType = false; break;-    case SpvOpReturn: *hasResult = false; *hasResultType = false; break;-    case SpvOpReturnValue: *hasResult = false; *hasResultType = false; break;-    case SpvOpUnreachable: *hasResult = false; *hasResultType = false; break;-    case SpvOpLifetimeStart: *hasResult = false; *hasResultType = false; break;-    case SpvOpLifetimeStop: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupAsyncCopy: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupWaitEvents: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupAll: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupAny: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupBroadcast: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupIAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupUMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupSMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupUMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupSMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpReadPipe: *hasResult = true; *hasResultType = true; break;-    case SpvOpWritePipe: *hasResult = true; *hasResultType = true; break;-    case SpvOpReservedReadPipe: *hasResult = true; *hasResultType = true; break;-    case SpvOpReservedWritePipe: *hasResult = true; *hasResultType = true; break;-    case SpvOpReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpCommitReadPipe: *hasResult = false; *hasResultType = false; break;-    case SpvOpCommitWritePipe: *hasResult = false; *hasResultType = false; break;-    case SpvOpIsValidReserveId: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetNumPipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetMaxPipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupReserveReadPipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupReserveWritePipePackets: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupCommitReadPipe: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupCommitWritePipe: *hasResult = false; *hasResultType = false; break;-    case SpvOpEnqueueMarker: *hasResult = true; *hasResultType = true; break;-    case SpvOpEnqueueKernel: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelNDrangeSubGroupCount: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelNDrangeMaxSubGroupSize: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelWorkGroupSize: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelPreferredWorkGroupSizeMultiple: *hasResult = true; *hasResultType = true; break;-    case SpvOpRetainEvent: *hasResult = false; *hasResultType = false; break;-    case SpvOpReleaseEvent: *hasResult = false; *hasResultType = false; break;-    case SpvOpCreateUserEvent: *hasResult = true; *hasResultType = true; break;-    case SpvOpIsValidEvent: *hasResult = true; *hasResultType = true; break;-    case SpvOpSetUserEventStatus: *hasResult = false; *hasResultType = false; break;-    case SpvOpCaptureEventProfilingInfo: *hasResult = false; *hasResultType = false; break;-    case SpvOpGetDefaultQueue: *hasResult = true; *hasResultType = true; break;-    case SpvOpBuildNDRange: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleDrefImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleDrefExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleProjImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleProjExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleProjDrefImplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseSampleProjDrefExplicitLod: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseFetch: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseGather: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseDrefGather: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSparseTexelsResident: *hasResult = true; *hasResultType = true; break;-    case SpvOpNoLine: *hasResult = false; *hasResultType = false; break;-    case SpvOpAtomicFlagTestAndSet: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicFlagClear: *hasResult = false; *hasResultType = false; break;-    case SpvOpImageSparseRead: *hasResult = true; *hasResultType = true; break;-    case SpvOpSizeOf: *hasResult = true; *hasResultType = true; break;-    case SpvOpTypePipeStorage: *hasResult = true; *hasResultType = false; break;-    case SpvOpConstantPipeStorage: *hasResult = true; *hasResultType = true; break;-    case SpvOpCreatePipeFromPipeStorage: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelLocalSizeForSubgroupCount: *hasResult = true; *hasResultType = true; break;-    case SpvOpGetKernelMaxNumSubgroups: *hasResult = true; *hasResultType = true; break;-    case SpvOpTypeNamedBarrier: *hasResult = true; *hasResultType = false; break;-    case SpvOpNamedBarrierInitialize: *hasResult = true; *hasResultType = true; break;-    case SpvOpMemoryNamedBarrier: *hasResult = false; *hasResultType = false; break;-    case SpvOpModuleProcessed: *hasResult = false; *hasResultType = false; break;-    case SpvOpExecutionModeId: *hasResult = false; *hasResultType = false; break;-    case SpvOpDecorateId: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupNonUniformElect: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformAll: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformAny: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformAllEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBroadcast: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBroadcastFirst: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBallot: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformInverseBallot: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBallotBitExtract: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBallotBitCount: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBallotFindLSB: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBallotFindMSB: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformShuffle: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformShuffleXor: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformShuffleUp: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformShuffleDown: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformIAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformFAdd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformIMul: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformFMul: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformSMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformUMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformFMin: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformSMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformUMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformFMax: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBitwiseAnd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBitwiseOr: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformBitwiseXor: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformLogicalAnd: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformLogicalOr: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformLogicalXor: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformQuadBroadcast: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformQuadSwap: *hasResult = true; *hasResultType = true; break;-    case SpvOpCopyLogical: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrNotEqual: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrDiff: *hasResult = true; *hasResultType = true; break;-    case SpvOpTerminateInvocation: *hasResult = false; *hasResultType = false; break;-    case SpvOpSubgroupBallotKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupFirstInvocationKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAllKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAnyKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAllEqualKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformRotateKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupReadInvocationKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpTraceRayKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpExecuteCallableKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpConvertUToAccelerationStructureKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpIgnoreIntersectionKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpTerminateRayKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpSDot: *hasResult = true; *hasResultType = true; break;-    case SpvOpUDot: *hasResult = true; *hasResultType = true; break;-    case SpvOpSUDot: *hasResult = true; *hasResultType = true; break;-    case SpvOpSDotAccSat: *hasResult = true; *hasResultType = true; break;-    case SpvOpUDotAccSat: *hasResult = true; *hasResultType = true; break;-    case SpvOpSUDotAccSat: *hasResult = true; *hasResultType = true; break;-    case SpvOpTypeRayQueryKHR: *hasResult = true; *hasResultType = false; break;-    case SpvOpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupIAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFAddNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupUMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupSMinNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupUMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupSMaxNonUniformAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpFragmentMaskFetchAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpFragmentFetchAMD: *hasResult = true; *hasResultType = true; break;-    case SpvOpReadClockKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpImageSampleFootprintNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupNonUniformPartitionNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpWritePackedPrimitiveIndices4x8NV: *hasResult = false; *hasResultType = false; break;-    case SpvOpReportIntersectionNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTerminateRayNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTraceNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTraceMotionNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break;-    case SpvOpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;-    case SpvOpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpCooperativeMatrixMulAddNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpCooperativeMatrixLengthNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpBeginInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;-    case SpvOpEndInvocationInterlockEXT: *hasResult = false; *hasResultType = false; break;-    case SpvOpDemoteToHelperInvocation: *hasResult = false; *hasResultType = false; break;-    case SpvOpIsHelperInvocationEXT: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertUToImageNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertUToSamplerNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertImageToUNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertSamplerToUNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertUToSampledImageNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpConvertSampledImageToUNV: *hasResult = true; *hasResultType = true; break;-    case SpvOpSamplerImageAddressingModeNV: *hasResult = false; *hasResultType = false; break;-    case SpvOpSubgroupShuffleINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupShuffleDownINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupShuffleUpINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupShuffleXorINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupBlockReadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpSubgroupImageBlockReadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupImageBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpSubgroupImageMediaBlockReadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupImageMediaBlockWriteINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpUCountLeadingZerosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUCountTrailingZerosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAbsISubINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAbsUSubINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpIAddSatINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUAddSatINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpIAverageINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUAverageINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpIAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUAverageRoundedINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpISubSatINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUSubSatINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpIMul32x16INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpUMul32x16INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpConstantFunctionPointerINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFunctionPointerCallINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAsmTargetINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAsmINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAsmCallINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicFMinEXT: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicFMaxEXT: *hasResult = true; *hasResultType = true; break;-    case SpvOpAssumeTrueKHR: *hasResult = false; *hasResultType = false; break;-    case SpvOpExpectKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpDecorateString: *hasResult = false; *hasResultType = false; break;-    case SpvOpMemberDecorateString: *hasResult = false; *hasResultType = false; break;-    case SpvOpVmeImageINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpTypeVmeImageINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImePayloadINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcRefPayloadINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcSicPayloadINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcMcePayloadINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcMceResultINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImeResultINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImeResultSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImeResultDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImeSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcImeDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcRefResultINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeAvcSicResultINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetInterShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetInterDirectionPenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetMotionVectorCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetAcOnlyHaarINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToImePayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToImeResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToRefPayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToRefResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToSicPayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceConvertToSicResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetBestInterDistortionsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterMajorShapeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterMinorShapeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterDirectionsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeInitializeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeRefWindowSizeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeAdjustRefOffsetINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetMaxMotionVectorCountINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetUnidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeSetWeightedSadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetSingleReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetDualReferenceStreaminINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeStripSingleReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeStripDualReferenceStreamoutINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetBorderReachedINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetTruncatedSearchIndicationINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcFmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcBmeInitializeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefSetBidirectionalMixDisableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcRefConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicInitializeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicConfigureSkcINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicConfigureIpeLumaINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicConfigureIpeLumaChromaINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetMotionVectorMaskINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicConvertToMcePayloadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetBilinearFilterEnableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetSkcForwardTransformEnableINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicEvaluateIpeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicEvaluateWithSingleReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicEvaluateWithDualReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicEvaluateWithMultiReferenceINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicConvertToMceResultINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetIpeLumaShapeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetBestIpeLumaDistortionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetBestIpeChromaDistortionINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetPackedIpeLumaModesINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetIpeChromaModeINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSubgroupAvcSicGetInterRawSadsINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpVariableLengthArrayINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpSaveMemoryINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpRestoreMemoryINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpArbitraryFloatSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCastINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCastFromIntINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCastToIntINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatAddINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatSubINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatMulINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatDivINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatGTINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatGEINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLTINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLEINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatEQINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatRecipINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatRSqrtINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCbrtINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatHypotINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatSqrtINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLogINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLog2INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLog10INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatLog1pINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatExpINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatExp2INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatExp10INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatExpm1INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatSinINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatSinCosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatSinPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatCosPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatASinINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatASinPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatACosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatACosPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatATanINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatATanPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatATan2INTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatPowINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatPowRINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpArbitraryFloatPowNINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpLoopControlINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpAliasDomainDeclINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpAliasScopeDeclINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpAliasScopeListDeclINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpFixedSqrtINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedRecipINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedRsqrtINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedSinINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedCosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedSinCosINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedSinPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedCosPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedSinCosPiINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedLogINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFixedExpINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpPtrCastToCrossWorkgroupINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpCrossWorkgroupCastToPtrINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpReadPipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpWritePipeBlockingINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpFPGARegINTEL: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;-    case SpvOpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;-    case SpvOpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpSpecConstantCompositeContinuedINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpControlBarrierArriveINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpControlBarrierWaitINTEL: *hasResult = false; *hasResultType = false; break;-    case SpvOpGroupIMulKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupFMulKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupBitwiseAndKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupBitwiseOrKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupBitwiseXorKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupLogicalAndKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupLogicalOrKHR: *hasResult = true; *hasResultType = true; break;-    case SpvOpGroupLogicalXorKHR: *hasResult = true; *hasResultType = true; break;-    }+**+** Permission is hereby granted, free of charge, to any person obtaining a copy+** of this software and/or associated documentation files (the "Materials"),+** to deal in the Materials without restriction, including without limitation+** the rights to use, copy, modify, merge, publish, distribute, sublicense,+** and/or sell copies of the Materials, and to permit persons to whom the+** Materials are furnished to do so, subject to the following conditions:+**+** The above copyright notice and this permission notice shall be included in+** all copies or substantial portions of the Materials.+**+** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS+** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND+** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/+**+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS+** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL+** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING+** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS+** IN THE MATERIALS.+*/++/*+** This header is automatically generated by the same tool that creates+** the Binary Section of the SPIR-V specification.+*/++/*+** Enumeration tokens for SPIR-V, in various styles:+**   C, C++, C++11, JSON, Lua, Python, C#, D, Beef+**+** - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL+** - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL+** - C++11 will use enum classes in the spv namespace, e.g.:+*spv::SourceLanguage::GLSL+** - Lua will use tables, e.g.: spv.SourceLanguage.GLSL+** - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']+** - C# will use enum classes in the Specification class located in the "Spv"+*namespace,+**     e.g.: Spv.Specification.SourceLanguage.GLSL+** - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL+** - Beef will use enum classes in the Specification class located in the "Spv"+*namespace,+**     e.g.: Spv.Specification.SourceLanguage.GLSL+**+** Some tokens act like mask values, which can be OR'd together,+** while others are mutually exclusive.  The mask-like ones have+** "Mask" in their name, and a parallel enum that has the shift+** amount (1 << x) for each corresponding enumerant.+*/++#ifndef spirv_H+#define spirv_H++typedef unsigned int SpvId;++#define SPV_VERSION 0x10600+#define SPV_REVISION 1++static const unsigned int SpvMagicNumber = 0x07230203;+static const unsigned int SpvVersion = 0x00010600;+static const unsigned int SpvRevision = 1;+static const unsigned int SpvOpCodeMask = 0xffff;+static const unsigned int SpvWordCountShift = 16;++typedef enum SpvSourceLanguage_ {+  SpvSourceLanguageUnknown = 0,+  SpvSourceLanguageESSL = 1,+  SpvSourceLanguageGLSL = 2,+  SpvSourceLanguageOpenCL_C = 3,+  SpvSourceLanguageOpenCL_CPP = 4,+  SpvSourceLanguageHLSL = 5,+  SpvSourceLanguageCPP_for_OpenCL = 6,+  SpvSourceLanguageSYCL = 7,+  SpvSourceLanguageHERO_C = 8,+  SpvSourceLanguageNZSL = 9,+  SpvSourceLanguageMax = 0x7fffffff,+} SpvSourceLanguage;++typedef enum SpvExecutionModel_ {+  SpvExecutionModelVertex = 0,+  SpvExecutionModelTessellationControl = 1,+  SpvExecutionModelTessellationEvaluation = 2,+  SpvExecutionModelGeometry = 3,+  SpvExecutionModelFragment = 4,+  SpvExecutionModelGLCompute = 5,+  SpvExecutionModelKernel = 6,+  SpvExecutionModelTaskNV = 5267,+  SpvExecutionModelMeshNV = 5268,+  SpvExecutionModelRayGenerationKHR = 5313,+  SpvExecutionModelRayGenerationNV = 5313,+  SpvExecutionModelIntersectionKHR = 5314,+  SpvExecutionModelIntersectionNV = 5314,+  SpvExecutionModelAnyHitKHR = 5315,+  SpvExecutionModelAnyHitNV = 5315,+  SpvExecutionModelClosestHitKHR = 5316,+  SpvExecutionModelClosestHitNV = 5316,+  SpvExecutionModelMissKHR = 5317,+  SpvExecutionModelMissNV = 5317,+  SpvExecutionModelCallableKHR = 5318,+  SpvExecutionModelCallableNV = 5318,+  SpvExecutionModelTaskEXT = 5364,+  SpvExecutionModelMeshEXT = 5365,+  SpvExecutionModelMax = 0x7fffffff,+} SpvExecutionModel;++typedef enum SpvAddressingModel_ {+  SpvAddressingModelLogical = 0,+  SpvAddressingModelPhysical32 = 1,+  SpvAddressingModelPhysical64 = 2,+  SpvAddressingModelPhysicalStorageBuffer64 = 5348,+  SpvAddressingModelPhysicalStorageBuffer64EXT = 5348,+  SpvAddressingModelMax = 0x7fffffff,+} SpvAddressingModel;++typedef enum SpvMemoryModel_ {+  SpvMemoryModelSimple = 0,+  SpvMemoryModelGLSL450 = 1,+  SpvMemoryModelOpenCL = 2,+  SpvMemoryModelVulkan = 3,+  SpvMemoryModelVulkanKHR = 3,+  SpvMemoryModelMax = 0x7fffffff,+} SpvMemoryModel;++typedef enum SpvExecutionMode_ {+  SpvExecutionModeInvocations = 0,+  SpvExecutionModeSpacingEqual = 1,+  SpvExecutionModeSpacingFractionalEven = 2,+  SpvExecutionModeSpacingFractionalOdd = 3,+  SpvExecutionModeVertexOrderCw = 4,+  SpvExecutionModeVertexOrderCcw = 5,+  SpvExecutionModePixelCenterInteger = 6,+  SpvExecutionModeOriginUpperLeft = 7,+  SpvExecutionModeOriginLowerLeft = 8,+  SpvExecutionModeEarlyFragmentTests = 9,+  SpvExecutionModePointMode = 10,+  SpvExecutionModeXfb = 11,+  SpvExecutionModeDepthReplacing = 12,+  SpvExecutionModeDepthGreater = 14,+  SpvExecutionModeDepthLess = 15,+  SpvExecutionModeDepthUnchanged = 16,+  SpvExecutionModeLocalSize = 17,+  SpvExecutionModeLocalSizeHint = 18,+  SpvExecutionModeInputPoints = 19,+  SpvExecutionModeInputLines = 20,+  SpvExecutionModeInputLinesAdjacency = 21,+  SpvExecutionModeTriangles = 22,+  SpvExecutionModeInputTrianglesAdjacency = 23,+  SpvExecutionModeQuads = 24,+  SpvExecutionModeIsolines = 25,+  SpvExecutionModeOutputVertices = 26,+  SpvExecutionModeOutputPoints = 27,+  SpvExecutionModeOutputLineStrip = 28,+  SpvExecutionModeOutputTriangleStrip = 29,+  SpvExecutionModeVecTypeHint = 30,+  SpvExecutionModeContractionOff = 31,+  SpvExecutionModeInitializer = 33,+  SpvExecutionModeFinalizer = 34,+  SpvExecutionModeSubgroupSize = 35,+  SpvExecutionModeSubgroupsPerWorkgroup = 36,+  SpvExecutionModeSubgroupsPerWorkgroupId = 37,+  SpvExecutionModeLocalSizeId = 38,+  SpvExecutionModeLocalSizeHintId = 39,+  SpvExecutionModeNonCoherentColorAttachmentReadEXT = 4169,+  SpvExecutionModeNonCoherentDepthAttachmentReadEXT = 4170,+  SpvExecutionModeNonCoherentStencilAttachmentReadEXT = 4171,+  SpvExecutionModeSubgroupUniformControlFlowKHR = 4421,+  SpvExecutionModePostDepthCoverage = 4446,+  SpvExecutionModeDenormPreserve = 4459,+  SpvExecutionModeDenormFlushToZero = 4460,+  SpvExecutionModeSignedZeroInfNanPreserve = 4461,+  SpvExecutionModeRoundingModeRTE = 4462,+  SpvExecutionModeRoundingModeRTZ = 4463,+  SpvExecutionModeEarlyAndLateFragmentTestsAMD = 5017,+  SpvExecutionModeStencilRefReplacingEXT = 5027,+  SpvExecutionModeStencilRefUnchangedFrontAMD = 5079,+  SpvExecutionModeStencilRefGreaterFrontAMD = 5080,+  SpvExecutionModeStencilRefLessFrontAMD = 5081,+  SpvExecutionModeStencilRefUnchangedBackAMD = 5082,+  SpvExecutionModeStencilRefGreaterBackAMD = 5083,+  SpvExecutionModeStencilRefLessBackAMD = 5084,+  SpvExecutionModeOutputLinesEXT = 5269,+  SpvExecutionModeOutputLinesNV = 5269,+  SpvExecutionModeOutputPrimitivesEXT = 5270,+  SpvExecutionModeOutputPrimitivesNV = 5270,+  SpvExecutionModeDerivativeGroupQuadsNV = 5289,+  SpvExecutionModeDerivativeGroupLinearNV = 5290,+  SpvExecutionModeOutputTrianglesEXT = 5298,+  SpvExecutionModeOutputTrianglesNV = 5298,+  SpvExecutionModePixelInterlockOrderedEXT = 5366,+  SpvExecutionModePixelInterlockUnorderedEXT = 5367,+  SpvExecutionModeSampleInterlockOrderedEXT = 5368,+  SpvExecutionModeSampleInterlockUnorderedEXT = 5369,+  SpvExecutionModeShadingRateInterlockOrderedEXT = 5370,+  SpvExecutionModeShadingRateInterlockUnorderedEXT = 5371,+  SpvExecutionModeSharedLocalMemorySizeINTEL = 5618,+  SpvExecutionModeRoundingModeRTPINTEL = 5620,+  SpvExecutionModeRoundingModeRTNINTEL = 5621,+  SpvExecutionModeFloatingPointModeALTINTEL = 5622,+  SpvExecutionModeFloatingPointModeIEEEINTEL = 5623,+  SpvExecutionModeMaxWorkgroupSizeINTEL = 5893,+  SpvExecutionModeMaxWorkDimINTEL = 5894,+  SpvExecutionModeNoGlobalOffsetINTEL = 5895,+  SpvExecutionModeNumSIMDWorkitemsINTEL = 5896,+  SpvExecutionModeSchedulerTargetFmaxMhzINTEL = 5903,+  SpvExecutionModeStreamingInterfaceINTEL = 6154,+  SpvExecutionModeRegisterMapInterfaceINTEL = 6160,+  SpvExecutionModeNamedBarrierCountINTEL = 6417,+  SpvExecutionModeMax = 0x7fffffff,+} SpvExecutionMode;++typedef enum SpvStorageClass_ {+  SpvStorageClassUniformConstant = 0,+  SpvStorageClassInput = 1,+  SpvStorageClassUniform = 2,+  SpvStorageClassOutput = 3,+  SpvStorageClassWorkgroup = 4,+  SpvStorageClassCrossWorkgroup = 5,+  SpvStorageClassPrivate = 6,+  SpvStorageClassFunction = 7,+  SpvStorageClassGeneric = 8,+  SpvStorageClassPushConstant = 9,+  SpvStorageClassAtomicCounter = 10,+  SpvStorageClassImage = 11,+  SpvStorageClassStorageBuffer = 12,+  SpvStorageClassTileImageEXT = 4172,+  SpvStorageClassCallableDataKHR = 5328,+  SpvStorageClassCallableDataNV = 5328,+  SpvStorageClassIncomingCallableDataKHR = 5329,+  SpvStorageClassIncomingCallableDataNV = 5329,+  SpvStorageClassRayPayloadKHR = 5338,+  SpvStorageClassRayPayloadNV = 5338,+  SpvStorageClassHitAttributeKHR = 5339,+  SpvStorageClassHitAttributeNV = 5339,+  SpvStorageClassIncomingRayPayloadKHR = 5342,+  SpvStorageClassIncomingRayPayloadNV = 5342,+  SpvStorageClassShaderRecordBufferKHR = 5343,+  SpvStorageClassShaderRecordBufferNV = 5343,+  SpvStorageClassPhysicalStorageBuffer = 5349,+  SpvStorageClassPhysicalStorageBufferEXT = 5349,+  SpvStorageClassHitObjectAttributeNV = 5385,+  SpvStorageClassTaskPayloadWorkgroupEXT = 5402,+  SpvStorageClassCodeSectionINTEL = 5605,+  SpvStorageClassDeviceOnlyINTEL = 5936,+  SpvStorageClassHostOnlyINTEL = 5937,+  SpvStorageClassMax = 0x7fffffff,+} SpvStorageClass;++typedef enum SpvDim_ {+  SpvDim1D = 0,+  SpvDim2D = 1,+  SpvDim3D = 2,+  SpvDimCube = 3,+  SpvDimRect = 4,+  SpvDimBuffer = 5,+  SpvDimSubpassData = 6,+  SpvDimTileImageDataEXT = 4173,+  SpvDimMax = 0x7fffffff,+} SpvDim;++typedef enum SpvSamplerAddressingMode_ {+  SpvSamplerAddressingModeNone = 0,+  SpvSamplerAddressingModeClampToEdge = 1,+  SpvSamplerAddressingModeClamp = 2,+  SpvSamplerAddressingModeRepeat = 3,+  SpvSamplerAddressingModeRepeatMirrored = 4,+  SpvSamplerAddressingModeMax = 0x7fffffff,+} SpvSamplerAddressingMode;++typedef enum SpvSamplerFilterMode_ {+  SpvSamplerFilterModeNearest = 0,+  SpvSamplerFilterModeLinear = 1,+  SpvSamplerFilterModeMax = 0x7fffffff,+} SpvSamplerFilterMode;++typedef enum SpvImageFormat_ {+  SpvImageFormatUnknown = 0,+  SpvImageFormatRgba32f = 1,+  SpvImageFormatRgba16f = 2,+  SpvImageFormatR32f = 3,+  SpvImageFormatRgba8 = 4,+  SpvImageFormatRgba8Snorm = 5,+  SpvImageFormatRg32f = 6,+  SpvImageFormatRg16f = 7,+  SpvImageFormatR11fG11fB10f = 8,+  SpvImageFormatR16f = 9,+  SpvImageFormatRgba16 = 10,+  SpvImageFormatRgb10A2 = 11,+  SpvImageFormatRg16 = 12,+  SpvImageFormatRg8 = 13,+  SpvImageFormatR16 = 14,+  SpvImageFormatR8 = 15,+  SpvImageFormatRgba16Snorm = 16,+  SpvImageFormatRg16Snorm = 17,+  SpvImageFormatRg8Snorm = 18,+  SpvImageFormatR16Snorm = 19,+  SpvImageFormatR8Snorm = 20,+  SpvImageFormatRgba32i = 21,+  SpvImageFormatRgba16i = 22,+  SpvImageFormatRgba8i = 23,+  SpvImageFormatR32i = 24,+  SpvImageFormatRg32i = 25,+  SpvImageFormatRg16i = 26,+  SpvImageFormatRg8i = 27,+  SpvImageFormatR16i = 28,+  SpvImageFormatR8i = 29,+  SpvImageFormatRgba32ui = 30,+  SpvImageFormatRgba16ui = 31,+  SpvImageFormatRgba8ui = 32,+  SpvImageFormatR32ui = 33,+  SpvImageFormatRgb10a2ui = 34,+  SpvImageFormatRg32ui = 35,+  SpvImageFormatRg16ui = 36,+  SpvImageFormatRg8ui = 37,+  SpvImageFormatR16ui = 38,+  SpvImageFormatR8ui = 39,+  SpvImageFormatR64ui = 40,+  SpvImageFormatR64i = 41,+  SpvImageFormatMax = 0x7fffffff,+} SpvImageFormat;++typedef enum SpvImageChannelOrder_ {+  SpvImageChannelOrderR = 0,+  SpvImageChannelOrderA = 1,+  SpvImageChannelOrderRG = 2,+  SpvImageChannelOrderRA = 3,+  SpvImageChannelOrderRGB = 4,+  SpvImageChannelOrderRGBA = 5,+  SpvImageChannelOrderBGRA = 6,+  SpvImageChannelOrderARGB = 7,+  SpvImageChannelOrderIntensity = 8,+  SpvImageChannelOrderLuminance = 9,+  SpvImageChannelOrderRx = 10,+  SpvImageChannelOrderRGx = 11,+  SpvImageChannelOrderRGBx = 12,+  SpvImageChannelOrderDepth = 13,+  SpvImageChannelOrderDepthStencil = 14,+  SpvImageChannelOrdersRGB = 15,+  SpvImageChannelOrdersRGBx = 16,+  SpvImageChannelOrdersRGBA = 17,+  SpvImageChannelOrdersBGRA = 18,+  SpvImageChannelOrderABGR = 19,+  SpvImageChannelOrderMax = 0x7fffffff,+} SpvImageChannelOrder;++typedef enum SpvImageChannelDataType_ {+  SpvImageChannelDataTypeSnormInt8 = 0,+  SpvImageChannelDataTypeSnormInt16 = 1,+  SpvImageChannelDataTypeUnormInt8 = 2,+  SpvImageChannelDataTypeUnormInt16 = 3,+  SpvImageChannelDataTypeUnormShort565 = 4,+  SpvImageChannelDataTypeUnormShort555 = 5,+  SpvImageChannelDataTypeUnormInt101010 = 6,+  SpvImageChannelDataTypeSignedInt8 = 7,+  SpvImageChannelDataTypeSignedInt16 = 8,+  SpvImageChannelDataTypeSignedInt32 = 9,+  SpvImageChannelDataTypeUnsignedInt8 = 10,+  SpvImageChannelDataTypeUnsignedInt16 = 11,+  SpvImageChannelDataTypeUnsignedInt32 = 12,+  SpvImageChannelDataTypeHalfFloat = 13,+  SpvImageChannelDataTypeFloat = 14,+  SpvImageChannelDataTypeUnormInt24 = 15,+  SpvImageChannelDataTypeUnormInt101010_2 = 16,+  SpvImageChannelDataTypeUnsignedIntRaw10EXT = 19,+  SpvImageChannelDataTypeUnsignedIntRaw12EXT = 20,+  SpvImageChannelDataTypeMax = 0x7fffffff,+} SpvImageChannelDataType;++typedef enum SpvImageOperandsShift_ {+  SpvImageOperandsBiasShift = 0,+  SpvImageOperandsLodShift = 1,+  SpvImageOperandsGradShift = 2,+  SpvImageOperandsConstOffsetShift = 3,+  SpvImageOperandsOffsetShift = 4,+  SpvImageOperandsConstOffsetsShift = 5,+  SpvImageOperandsSampleShift = 6,+  SpvImageOperandsMinLodShift = 7,+  SpvImageOperandsMakeTexelAvailableShift = 8,+  SpvImageOperandsMakeTexelAvailableKHRShift = 8,+  SpvImageOperandsMakeTexelVisibleShift = 9,+  SpvImageOperandsMakeTexelVisibleKHRShift = 9,+  SpvImageOperandsNonPrivateTexelShift = 10,+  SpvImageOperandsNonPrivateTexelKHRShift = 10,+  SpvImageOperandsVolatileTexelShift = 11,+  SpvImageOperandsVolatileTexelKHRShift = 11,+  SpvImageOperandsSignExtendShift = 12,+  SpvImageOperandsZeroExtendShift = 13,+  SpvImageOperandsNontemporalShift = 14,+  SpvImageOperandsOffsetsShift = 16,+  SpvImageOperandsMax = 0x7fffffff,+} SpvImageOperandsShift;++typedef enum SpvImageOperandsMask_ {+  SpvImageOperandsMaskNone = 0,+  SpvImageOperandsBiasMask = 0x00000001,+  SpvImageOperandsLodMask = 0x00000002,+  SpvImageOperandsGradMask = 0x00000004,+  SpvImageOperandsConstOffsetMask = 0x00000008,+  SpvImageOperandsOffsetMask = 0x00000010,+  SpvImageOperandsConstOffsetsMask = 0x00000020,+  SpvImageOperandsSampleMask = 0x00000040,+  SpvImageOperandsMinLodMask = 0x00000080,+  SpvImageOperandsMakeTexelAvailableMask = 0x00000100,+  SpvImageOperandsMakeTexelAvailableKHRMask = 0x00000100,+  SpvImageOperandsMakeTexelVisibleMask = 0x00000200,+  SpvImageOperandsMakeTexelVisibleKHRMask = 0x00000200,+  SpvImageOperandsNonPrivateTexelMask = 0x00000400,+  SpvImageOperandsNonPrivateTexelKHRMask = 0x00000400,+  SpvImageOperandsVolatileTexelMask = 0x00000800,+  SpvImageOperandsVolatileTexelKHRMask = 0x00000800,+  SpvImageOperandsSignExtendMask = 0x00001000,+  SpvImageOperandsZeroExtendMask = 0x00002000,+  SpvImageOperandsNontemporalMask = 0x00004000,+  SpvImageOperandsOffsetsMask = 0x00010000,+} SpvImageOperandsMask;++typedef enum SpvFPFastMathModeShift_ {+  SpvFPFastMathModeNotNaNShift = 0,+  SpvFPFastMathModeNotInfShift = 1,+  SpvFPFastMathModeNSZShift = 2,+  SpvFPFastMathModeAllowRecipShift = 3,+  SpvFPFastMathModeFastShift = 4,+  SpvFPFastMathModeAllowContractFastINTELShift = 16,+  SpvFPFastMathModeAllowReassocINTELShift = 17,+  SpvFPFastMathModeMax = 0x7fffffff,+} SpvFPFastMathModeShift;++typedef enum SpvFPFastMathModeMask_ {+  SpvFPFastMathModeMaskNone = 0,+  SpvFPFastMathModeNotNaNMask = 0x00000001,+  SpvFPFastMathModeNotInfMask = 0x00000002,+  SpvFPFastMathModeNSZMask = 0x00000004,+  SpvFPFastMathModeAllowRecipMask = 0x00000008,+  SpvFPFastMathModeFastMask = 0x00000010,+  SpvFPFastMathModeAllowContractFastINTELMask = 0x00010000,+  SpvFPFastMathModeAllowReassocINTELMask = 0x00020000,+} SpvFPFastMathModeMask;++typedef enum SpvFPRoundingMode_ {+  SpvFPRoundingModeRTE = 0,+  SpvFPRoundingModeRTZ = 1,+  SpvFPRoundingModeRTP = 2,+  SpvFPRoundingModeRTN = 3,+  SpvFPRoundingModeMax = 0x7fffffff,+} SpvFPRoundingMode;++typedef enum SpvLinkageType_ {+  SpvLinkageTypeExport = 0,+  SpvLinkageTypeImport = 1,+  SpvLinkageTypeLinkOnceODR = 2,+  SpvLinkageTypeMax = 0x7fffffff,+} SpvLinkageType;++typedef enum SpvAccessQualifier_ {+  SpvAccessQualifierReadOnly = 0,+  SpvAccessQualifierWriteOnly = 1,+  SpvAccessQualifierReadWrite = 2,+  SpvAccessQualifierMax = 0x7fffffff,+} SpvAccessQualifier;++typedef enum SpvFunctionParameterAttribute_ {+  SpvFunctionParameterAttributeZext = 0,+  SpvFunctionParameterAttributeSext = 1,+  SpvFunctionParameterAttributeByVal = 2,+  SpvFunctionParameterAttributeSret = 3,+  SpvFunctionParameterAttributeNoAlias = 4,+  SpvFunctionParameterAttributeNoCapture = 5,+  SpvFunctionParameterAttributeNoWrite = 6,+  SpvFunctionParameterAttributeNoReadWrite = 7,+  SpvFunctionParameterAttributeRuntimeAlignedINTEL = 5940,+  SpvFunctionParameterAttributeMax = 0x7fffffff,+} SpvFunctionParameterAttribute;++typedef enum SpvDecoration_ {+  SpvDecorationRelaxedPrecision = 0,+  SpvDecorationSpecId = 1,+  SpvDecorationBlock = 2,+  SpvDecorationBufferBlock = 3,+  SpvDecorationRowMajor = 4,+  SpvDecorationColMajor = 5,+  SpvDecorationArrayStride = 6,+  SpvDecorationMatrixStride = 7,+  SpvDecorationGLSLShared = 8,+  SpvDecorationGLSLPacked = 9,+  SpvDecorationCPacked = 10,+  SpvDecorationBuiltIn = 11,+  SpvDecorationNoPerspective = 13,+  SpvDecorationFlat = 14,+  SpvDecorationPatch = 15,+  SpvDecorationCentroid = 16,+  SpvDecorationSample = 17,+  SpvDecorationInvariant = 18,+  SpvDecorationRestrict = 19,+  SpvDecorationAliased = 20,+  SpvDecorationVolatile = 21,+  SpvDecorationConstant = 22,+  SpvDecorationCoherent = 23,+  SpvDecorationNonWritable = 24,+  SpvDecorationNonReadable = 25,+  SpvDecorationUniform = 26,+  SpvDecorationUniformId = 27,+  SpvDecorationSaturatedConversion = 28,+  SpvDecorationStream = 29,+  SpvDecorationLocation = 30,+  SpvDecorationComponent = 31,+  SpvDecorationIndex = 32,+  SpvDecorationBinding = 33,+  SpvDecorationDescriptorSet = 34,+  SpvDecorationOffset = 35,+  SpvDecorationXfbBuffer = 36,+  SpvDecorationXfbStride = 37,+  SpvDecorationFuncParamAttr = 38,+  SpvDecorationFPRoundingMode = 39,+  SpvDecorationFPFastMathMode = 40,+  SpvDecorationLinkageAttributes = 41,+  SpvDecorationNoContraction = 42,+  SpvDecorationInputAttachmentIndex = 43,+  SpvDecorationAlignment = 44,+  SpvDecorationMaxByteOffset = 45,+  SpvDecorationAlignmentId = 46,+  SpvDecorationMaxByteOffsetId = 47,+  SpvDecorationNoSignedWrap = 4469,+  SpvDecorationNoUnsignedWrap = 4470,+  SpvDecorationWeightTextureQCOM = 4487,+  SpvDecorationBlockMatchTextureQCOM = 4488,+  SpvDecorationExplicitInterpAMD = 4999,+  SpvDecorationOverrideCoverageNV = 5248,+  SpvDecorationPassthroughNV = 5250,+  SpvDecorationViewportRelativeNV = 5252,+  SpvDecorationSecondaryViewportRelativeNV = 5256,+  SpvDecorationPerPrimitiveEXT = 5271,+  SpvDecorationPerPrimitiveNV = 5271,+  SpvDecorationPerViewNV = 5272,+  SpvDecorationPerTaskNV = 5273,+  SpvDecorationPerVertexKHR = 5285,+  SpvDecorationPerVertexNV = 5285,+  SpvDecorationNonUniform = 5300,+  SpvDecorationNonUniformEXT = 5300,+  SpvDecorationRestrictPointer = 5355,+  SpvDecorationRestrictPointerEXT = 5355,+  SpvDecorationAliasedPointer = 5356,+  SpvDecorationAliasedPointerEXT = 5356,+  SpvDecorationHitObjectShaderRecordBufferNV = 5386,+  SpvDecorationBindlessSamplerNV = 5398,+  SpvDecorationBindlessImageNV = 5399,+  SpvDecorationBoundSamplerNV = 5400,+  SpvDecorationBoundImageNV = 5401,+  SpvDecorationSIMTCallINTEL = 5599,+  SpvDecorationReferencedIndirectlyINTEL = 5602,+  SpvDecorationClobberINTEL = 5607,+  SpvDecorationSideEffectsINTEL = 5608,+  SpvDecorationVectorComputeVariableINTEL = 5624,+  SpvDecorationFuncParamIOKindINTEL = 5625,+  SpvDecorationVectorComputeFunctionINTEL = 5626,+  SpvDecorationStackCallINTEL = 5627,+  SpvDecorationGlobalVariableOffsetINTEL = 5628,+  SpvDecorationCounterBuffer = 5634,+  SpvDecorationHlslCounterBufferGOOGLE = 5634,+  SpvDecorationHlslSemanticGOOGLE = 5635,+  SpvDecorationUserSemantic = 5635,+  SpvDecorationUserTypeGOOGLE = 5636,+  SpvDecorationFunctionRoundingModeINTEL = 5822,+  SpvDecorationFunctionDenormModeINTEL = 5823,+  SpvDecorationRegisterINTEL = 5825,+  SpvDecorationMemoryINTEL = 5826,+  SpvDecorationNumbanksINTEL = 5827,+  SpvDecorationBankwidthINTEL = 5828,+  SpvDecorationMaxPrivateCopiesINTEL = 5829,+  SpvDecorationSinglepumpINTEL = 5830,+  SpvDecorationDoublepumpINTEL = 5831,+  SpvDecorationMaxReplicatesINTEL = 5832,+  SpvDecorationSimpleDualPortINTEL = 5833,+  SpvDecorationMergeINTEL = 5834,+  SpvDecorationBankBitsINTEL = 5835,+  SpvDecorationForcePow2DepthINTEL = 5836,+  SpvDecorationBurstCoalesceINTEL = 5899,+  SpvDecorationCacheSizeINTEL = 5900,+  SpvDecorationDontStaticallyCoalesceINTEL = 5901,+  SpvDecorationPrefetchINTEL = 5902,+  SpvDecorationStallEnableINTEL = 5905,+  SpvDecorationFuseLoopsInFunctionINTEL = 5907,+  SpvDecorationMathOpDSPModeINTEL = 5909,+  SpvDecorationAliasScopeINTEL = 5914,+  SpvDecorationNoAliasINTEL = 5915,+  SpvDecorationInitiationIntervalINTEL = 5917,+  SpvDecorationMaxConcurrencyINTEL = 5918,+  SpvDecorationPipelineEnableINTEL = 5919,+  SpvDecorationBufferLocationINTEL = 5921,+  SpvDecorationIOPipeStorageINTEL = 5944,+  SpvDecorationFunctionFloatingPointModeINTEL = 6080,+  SpvDecorationSingleElementVectorINTEL = 6085,+  SpvDecorationVectorComputeCallableFunctionINTEL = 6087,+  SpvDecorationMediaBlockIOINTEL = 6140,+  SpvDecorationLatencyControlLabelINTEL = 6172,+  SpvDecorationLatencyControlConstraintINTEL = 6173,+  SpvDecorationConduitKernelArgumentINTEL = 6175,+  SpvDecorationRegisterMapKernelArgumentINTEL = 6176,+  SpvDecorationMMHostInterfaceAddressWidthINTEL = 6177,+  SpvDecorationMMHostInterfaceDataWidthINTEL = 6178,+  SpvDecorationMMHostInterfaceLatencyINTEL = 6179,+  SpvDecorationMMHostInterfaceReadWriteModeINTEL = 6180,+  SpvDecorationMMHostInterfaceMaxBurstINTEL = 6181,+  SpvDecorationMMHostInterfaceWaitRequestINTEL = 6182,+  SpvDecorationStableKernelArgumentINTEL = 6183,+  SpvDecorationMax = 0x7fffffff,+} SpvDecoration;++typedef enum SpvBuiltIn_ {+  SpvBuiltInPosition = 0,+  SpvBuiltInPointSize = 1,+  SpvBuiltInClipDistance = 3,+  SpvBuiltInCullDistance = 4,+  SpvBuiltInVertexId = 5,+  SpvBuiltInInstanceId = 6,+  SpvBuiltInPrimitiveId = 7,+  SpvBuiltInInvocationId = 8,+  SpvBuiltInLayer = 9,+  SpvBuiltInViewportIndex = 10,+  SpvBuiltInTessLevelOuter = 11,+  SpvBuiltInTessLevelInner = 12,+  SpvBuiltInTessCoord = 13,+  SpvBuiltInPatchVertices = 14,+  SpvBuiltInFragCoord = 15,+  SpvBuiltInPointCoord = 16,+  SpvBuiltInFrontFacing = 17,+  SpvBuiltInSampleId = 18,+  SpvBuiltInSamplePosition = 19,+  SpvBuiltInSampleMask = 20,+  SpvBuiltInFragDepth = 22,+  SpvBuiltInHelperInvocation = 23,+  SpvBuiltInNumWorkgroups = 24,+  SpvBuiltInWorkgroupSize = 25,+  SpvBuiltInWorkgroupId = 26,+  SpvBuiltInLocalInvocationId = 27,+  SpvBuiltInGlobalInvocationId = 28,+  SpvBuiltInLocalInvocationIndex = 29,+  SpvBuiltInWorkDim = 30,+  SpvBuiltInGlobalSize = 31,+  SpvBuiltInEnqueuedWorkgroupSize = 32,+  SpvBuiltInGlobalOffset = 33,+  SpvBuiltInGlobalLinearId = 34,+  SpvBuiltInSubgroupSize = 36,+  SpvBuiltInSubgroupMaxSize = 37,+  SpvBuiltInNumSubgroups = 38,+  SpvBuiltInNumEnqueuedSubgroups = 39,+  SpvBuiltInSubgroupId = 40,+  SpvBuiltInSubgroupLocalInvocationId = 41,+  SpvBuiltInVertexIndex = 42,+  SpvBuiltInInstanceIndex = 43,+  SpvBuiltInCoreIDARM = 4160,+  SpvBuiltInCoreCountARM = 4161,+  SpvBuiltInCoreMaxIDARM = 4162,+  SpvBuiltInWarpIDARM = 4163,+  SpvBuiltInWarpMaxIDARM = 4164,+  SpvBuiltInSubgroupEqMask = 4416,+  SpvBuiltInSubgroupEqMaskKHR = 4416,+  SpvBuiltInSubgroupGeMask = 4417,+  SpvBuiltInSubgroupGeMaskKHR = 4417,+  SpvBuiltInSubgroupGtMask = 4418,+  SpvBuiltInSubgroupGtMaskKHR = 4418,+  SpvBuiltInSubgroupLeMask = 4419,+  SpvBuiltInSubgroupLeMaskKHR = 4419,+  SpvBuiltInSubgroupLtMask = 4420,+  SpvBuiltInSubgroupLtMaskKHR = 4420,+  SpvBuiltInBaseVertex = 4424,+  SpvBuiltInBaseInstance = 4425,+  SpvBuiltInDrawIndex = 4426,+  SpvBuiltInPrimitiveShadingRateKHR = 4432,+  SpvBuiltInDeviceIndex = 4438,+  SpvBuiltInViewIndex = 4440,+  SpvBuiltInShadingRateKHR = 4444,+  SpvBuiltInBaryCoordNoPerspAMD = 4992,+  SpvBuiltInBaryCoordNoPerspCentroidAMD = 4993,+  SpvBuiltInBaryCoordNoPerspSampleAMD = 4994,+  SpvBuiltInBaryCoordSmoothAMD = 4995,+  SpvBuiltInBaryCoordSmoothCentroidAMD = 4996,+  SpvBuiltInBaryCoordSmoothSampleAMD = 4997,+  SpvBuiltInBaryCoordPullModelAMD = 4998,+  SpvBuiltInFragStencilRefEXT = 5014,+  SpvBuiltInViewportMaskNV = 5253,+  SpvBuiltInSecondaryPositionNV = 5257,+  SpvBuiltInSecondaryViewportMaskNV = 5258,+  SpvBuiltInPositionPerViewNV = 5261,+  SpvBuiltInViewportMaskPerViewNV = 5262,+  SpvBuiltInFullyCoveredEXT = 5264,+  SpvBuiltInTaskCountNV = 5274,+  SpvBuiltInPrimitiveCountNV = 5275,+  SpvBuiltInPrimitiveIndicesNV = 5276,+  SpvBuiltInClipDistancePerViewNV = 5277,+  SpvBuiltInCullDistancePerViewNV = 5278,+  SpvBuiltInLayerPerViewNV = 5279,+  SpvBuiltInMeshViewCountNV = 5280,+  SpvBuiltInMeshViewIndicesNV = 5281,+  SpvBuiltInBaryCoordKHR = 5286,+  SpvBuiltInBaryCoordNV = 5286,+  SpvBuiltInBaryCoordNoPerspKHR = 5287,+  SpvBuiltInBaryCoordNoPerspNV = 5287,+  SpvBuiltInFragSizeEXT = 5292,+  SpvBuiltInFragmentSizeNV = 5292,+  SpvBuiltInFragInvocationCountEXT = 5293,+  SpvBuiltInInvocationsPerPixelNV = 5293,+  SpvBuiltInPrimitivePointIndicesEXT = 5294,+  SpvBuiltInPrimitiveLineIndicesEXT = 5295,+  SpvBuiltInPrimitiveTriangleIndicesEXT = 5296,+  SpvBuiltInCullPrimitiveEXT = 5299,+  SpvBuiltInLaunchIdKHR = 5319,+  SpvBuiltInLaunchIdNV = 5319,+  SpvBuiltInLaunchSizeKHR = 5320,+  SpvBuiltInLaunchSizeNV = 5320,+  SpvBuiltInWorldRayOriginKHR = 5321,+  SpvBuiltInWorldRayOriginNV = 5321,+  SpvBuiltInWorldRayDirectionKHR = 5322,+  SpvBuiltInWorldRayDirectionNV = 5322,+  SpvBuiltInObjectRayOriginKHR = 5323,+  SpvBuiltInObjectRayOriginNV = 5323,+  SpvBuiltInObjectRayDirectionKHR = 5324,+  SpvBuiltInObjectRayDirectionNV = 5324,+  SpvBuiltInRayTminKHR = 5325,+  SpvBuiltInRayTminNV = 5325,+  SpvBuiltInRayTmaxKHR = 5326,+  SpvBuiltInRayTmaxNV = 5326,+  SpvBuiltInInstanceCustomIndexKHR = 5327,+  SpvBuiltInInstanceCustomIndexNV = 5327,+  SpvBuiltInObjectToWorldKHR = 5330,+  SpvBuiltInObjectToWorldNV = 5330,+  SpvBuiltInWorldToObjectKHR = 5331,+  SpvBuiltInWorldToObjectNV = 5331,+  SpvBuiltInHitTNV = 5332,+  SpvBuiltInHitKindKHR = 5333,+  SpvBuiltInHitKindNV = 5333,+  SpvBuiltInCurrentRayTimeNV = 5334,+  SpvBuiltInHitTriangleVertexPositionsKHR = 5335,+  SpvBuiltInIncomingRayFlagsKHR = 5351,+  SpvBuiltInIncomingRayFlagsNV = 5351,+  SpvBuiltInRayGeometryIndexKHR = 5352,+  SpvBuiltInWarpsPerSMNV = 5374,+  SpvBuiltInSMCountNV = 5375,+  SpvBuiltInWarpIDNV = 5376,+  SpvBuiltInSMIDNV = 5377,+  SpvBuiltInCullMaskKHR = 6021,+  SpvBuiltInMax = 0x7fffffff,+} SpvBuiltIn;++typedef enum SpvSelectionControlShift_ {+  SpvSelectionControlFlattenShift = 0,+  SpvSelectionControlDontFlattenShift = 1,+  SpvSelectionControlMax = 0x7fffffff,+} SpvSelectionControlShift;++typedef enum SpvSelectionControlMask_ {+  SpvSelectionControlMaskNone = 0,+  SpvSelectionControlFlattenMask = 0x00000001,+  SpvSelectionControlDontFlattenMask = 0x00000002,+} SpvSelectionControlMask;++typedef enum SpvLoopControlShift_ {+  SpvLoopControlUnrollShift = 0,+  SpvLoopControlDontUnrollShift = 1,+  SpvLoopControlDependencyInfiniteShift = 2,+  SpvLoopControlDependencyLengthShift = 3,+  SpvLoopControlMinIterationsShift = 4,+  SpvLoopControlMaxIterationsShift = 5,+  SpvLoopControlIterationMultipleShift = 6,+  SpvLoopControlPeelCountShift = 7,+  SpvLoopControlPartialCountShift = 8,+  SpvLoopControlInitiationIntervalINTELShift = 16,+  SpvLoopControlMaxConcurrencyINTELShift = 17,+  SpvLoopControlDependencyArrayINTELShift = 18,+  SpvLoopControlPipelineEnableINTELShift = 19,+  SpvLoopControlLoopCoalesceINTELShift = 20,+  SpvLoopControlMaxInterleavingINTELShift = 21,+  SpvLoopControlSpeculatedIterationsINTELShift = 22,+  SpvLoopControlNoFusionINTELShift = 23,+  SpvLoopControlLoopCountINTELShift = 24,+  SpvLoopControlMaxReinvocationDelayINTELShift = 25,+  SpvLoopControlMax = 0x7fffffff,+} SpvLoopControlShift;++typedef enum SpvLoopControlMask_ {+  SpvLoopControlMaskNone = 0,+  SpvLoopControlUnrollMask = 0x00000001,+  SpvLoopControlDontUnrollMask = 0x00000002,+  SpvLoopControlDependencyInfiniteMask = 0x00000004,+  SpvLoopControlDependencyLengthMask = 0x00000008,+  SpvLoopControlMinIterationsMask = 0x00000010,+  SpvLoopControlMaxIterationsMask = 0x00000020,+  SpvLoopControlIterationMultipleMask = 0x00000040,+  SpvLoopControlPeelCountMask = 0x00000080,+  SpvLoopControlPartialCountMask = 0x00000100,+  SpvLoopControlInitiationIntervalINTELMask = 0x00010000,+  SpvLoopControlMaxConcurrencyINTELMask = 0x00020000,+  SpvLoopControlDependencyArrayINTELMask = 0x00040000,+  SpvLoopControlPipelineEnableINTELMask = 0x00080000,+  SpvLoopControlLoopCoalesceINTELMask = 0x00100000,+  SpvLoopControlMaxInterleavingINTELMask = 0x00200000,+  SpvLoopControlSpeculatedIterationsINTELMask = 0x00400000,+  SpvLoopControlNoFusionINTELMask = 0x00800000,+  SpvLoopControlLoopCountINTELMask = 0x01000000,+  SpvLoopControlMaxReinvocationDelayINTELMask = 0x02000000,+} SpvLoopControlMask;++typedef enum SpvFunctionControlShift_ {+  SpvFunctionControlInlineShift = 0,+  SpvFunctionControlDontInlineShift = 1,+  SpvFunctionControlPureShift = 2,+  SpvFunctionControlConstShift = 3,+  SpvFunctionControlOptNoneINTELShift = 16,+  SpvFunctionControlMax = 0x7fffffff,+} SpvFunctionControlShift;++typedef enum SpvFunctionControlMask_ {+  SpvFunctionControlMaskNone = 0,+  SpvFunctionControlInlineMask = 0x00000001,+  SpvFunctionControlDontInlineMask = 0x00000002,+  SpvFunctionControlPureMask = 0x00000004,+  SpvFunctionControlConstMask = 0x00000008,+  SpvFunctionControlOptNoneINTELMask = 0x00010000,+} SpvFunctionControlMask;++typedef enum SpvMemorySemanticsShift_ {+  SpvMemorySemanticsAcquireShift = 1,+  SpvMemorySemanticsReleaseShift = 2,+  SpvMemorySemanticsAcquireReleaseShift = 3,+  SpvMemorySemanticsSequentiallyConsistentShift = 4,+  SpvMemorySemanticsUniformMemoryShift = 6,+  SpvMemorySemanticsSubgroupMemoryShift = 7,+  SpvMemorySemanticsWorkgroupMemoryShift = 8,+  SpvMemorySemanticsCrossWorkgroupMemoryShift = 9,+  SpvMemorySemanticsAtomicCounterMemoryShift = 10,+  SpvMemorySemanticsImageMemoryShift = 11,+  SpvMemorySemanticsOutputMemoryShift = 12,+  SpvMemorySemanticsOutputMemoryKHRShift = 12,+  SpvMemorySemanticsMakeAvailableShift = 13,+  SpvMemorySemanticsMakeAvailableKHRShift = 13,+  SpvMemorySemanticsMakeVisibleShift = 14,+  SpvMemorySemanticsMakeVisibleKHRShift = 14,+  SpvMemorySemanticsVolatileShift = 15,+  SpvMemorySemanticsMax = 0x7fffffff,+} SpvMemorySemanticsShift;++typedef enum SpvMemorySemanticsMask_ {+  SpvMemorySemanticsMaskNone = 0,+  SpvMemorySemanticsAcquireMask = 0x00000002,+  SpvMemorySemanticsReleaseMask = 0x00000004,+  SpvMemorySemanticsAcquireReleaseMask = 0x00000008,+  SpvMemorySemanticsSequentiallyConsistentMask = 0x00000010,+  SpvMemorySemanticsUniformMemoryMask = 0x00000040,+  SpvMemorySemanticsSubgroupMemoryMask = 0x00000080,+  SpvMemorySemanticsWorkgroupMemoryMask = 0x00000100,+  SpvMemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,+  SpvMemorySemanticsAtomicCounterMemoryMask = 0x00000400,+  SpvMemorySemanticsImageMemoryMask = 0x00000800,+  SpvMemorySemanticsOutputMemoryMask = 0x00001000,+  SpvMemorySemanticsOutputMemoryKHRMask = 0x00001000,+  SpvMemorySemanticsMakeAvailableMask = 0x00002000,+  SpvMemorySemanticsMakeAvailableKHRMask = 0x00002000,+  SpvMemorySemanticsMakeVisibleMask = 0x00004000,+  SpvMemorySemanticsMakeVisibleKHRMask = 0x00004000,+  SpvMemorySemanticsVolatileMask = 0x00008000,+} SpvMemorySemanticsMask;++typedef enum SpvMemoryAccessShift_ {+  SpvMemoryAccessVolatileShift = 0,+  SpvMemoryAccessAlignedShift = 1,+  SpvMemoryAccessNontemporalShift = 2,+  SpvMemoryAccessMakePointerAvailableShift = 3,+  SpvMemoryAccessMakePointerAvailableKHRShift = 3,+  SpvMemoryAccessMakePointerVisibleShift = 4,+  SpvMemoryAccessMakePointerVisibleKHRShift = 4,+  SpvMemoryAccessNonPrivatePointerShift = 5,+  SpvMemoryAccessNonPrivatePointerKHRShift = 5,+  SpvMemoryAccessAliasScopeINTELMaskShift = 16,+  SpvMemoryAccessNoAliasINTELMaskShift = 17,+  SpvMemoryAccessMax = 0x7fffffff,+} SpvMemoryAccessShift;++typedef enum SpvMemoryAccessMask_ {+  SpvMemoryAccessMaskNone = 0,+  SpvMemoryAccessVolatileMask = 0x00000001,+  SpvMemoryAccessAlignedMask = 0x00000002,+  SpvMemoryAccessNontemporalMask = 0x00000004,+  SpvMemoryAccessMakePointerAvailableMask = 0x00000008,+  SpvMemoryAccessMakePointerAvailableKHRMask = 0x00000008,+  SpvMemoryAccessMakePointerVisibleMask = 0x00000010,+  SpvMemoryAccessMakePointerVisibleKHRMask = 0x00000010,+  SpvMemoryAccessNonPrivatePointerMask = 0x00000020,+  SpvMemoryAccessNonPrivatePointerKHRMask = 0x00000020,+  SpvMemoryAccessAliasScopeINTELMaskMask = 0x00010000,+  SpvMemoryAccessNoAliasINTELMaskMask = 0x00020000,+} SpvMemoryAccessMask;++typedef enum SpvScope_ {+  SpvScopeCrossDevice = 0,+  SpvScopeDevice = 1,+  SpvScopeWorkgroup = 2,+  SpvScopeSubgroup = 3,+  SpvScopeInvocation = 4,+  SpvScopeQueueFamily = 5,+  SpvScopeQueueFamilyKHR = 5,+  SpvScopeShaderCallKHR = 6,+  SpvScopeMax = 0x7fffffff,+} SpvScope;++typedef enum SpvGroupOperation_ {+  SpvGroupOperationReduce = 0,+  SpvGroupOperationInclusiveScan = 1,+  SpvGroupOperationExclusiveScan = 2,+  SpvGroupOperationClusteredReduce = 3,+  SpvGroupOperationPartitionedReduceNV = 6,+  SpvGroupOperationPartitionedInclusiveScanNV = 7,+  SpvGroupOperationPartitionedExclusiveScanNV = 8,+  SpvGroupOperationMax = 0x7fffffff,+} SpvGroupOperation;++typedef enum SpvKernelEnqueueFlags_ {+  SpvKernelEnqueueFlagsNoWait = 0,+  SpvKernelEnqueueFlagsWaitKernel = 1,+  SpvKernelEnqueueFlagsWaitWorkGroup = 2,+  SpvKernelEnqueueFlagsMax = 0x7fffffff,+} SpvKernelEnqueueFlags;++typedef enum SpvKernelProfilingInfoShift_ {+  SpvKernelProfilingInfoCmdExecTimeShift = 0,+  SpvKernelProfilingInfoMax = 0x7fffffff,+} SpvKernelProfilingInfoShift;++typedef enum SpvKernelProfilingInfoMask_ {+  SpvKernelProfilingInfoMaskNone = 0,+  SpvKernelProfilingInfoCmdExecTimeMask = 0x00000001,+} SpvKernelProfilingInfoMask;++typedef enum SpvCapability_ {+  SpvCapabilityMatrix = 0,+  SpvCapabilityShader = 1,+  SpvCapabilityGeometry = 2,+  SpvCapabilityTessellation = 3,+  SpvCapabilityAddresses = 4,+  SpvCapabilityLinkage = 5,+  SpvCapabilityKernel = 6,+  SpvCapabilityVector16 = 7,+  SpvCapabilityFloat16Buffer = 8,+  SpvCapabilityFloat16 = 9,+  SpvCapabilityFloat64 = 10,+  SpvCapabilityInt64 = 11,+  SpvCapabilityInt64Atomics = 12,+  SpvCapabilityImageBasic = 13,+  SpvCapabilityImageReadWrite = 14,+  SpvCapabilityImageMipmap = 15,+  SpvCapabilityPipes = 17,+  SpvCapabilityGroups = 18,+  SpvCapabilityDeviceEnqueue = 19,+  SpvCapabilityLiteralSampler = 20,+  SpvCapabilityAtomicStorage = 21,+  SpvCapabilityInt16 = 22,+  SpvCapabilityTessellationPointSize = 23,+  SpvCapabilityGeometryPointSize = 24,+  SpvCapabilityImageGatherExtended = 25,+  SpvCapabilityStorageImageMultisample = 27,+  SpvCapabilityUniformBufferArrayDynamicIndexing = 28,+  SpvCapabilitySampledImageArrayDynamicIndexing = 29,+  SpvCapabilityStorageBufferArrayDynamicIndexing = 30,+  SpvCapabilityStorageImageArrayDynamicIndexing = 31,+  SpvCapabilityClipDistance = 32,+  SpvCapabilityCullDistance = 33,+  SpvCapabilityImageCubeArray = 34,+  SpvCapabilitySampleRateShading = 35,+  SpvCapabilityImageRect = 36,+  SpvCapabilitySampledRect = 37,+  SpvCapabilityGenericPointer = 38,+  SpvCapabilityInt8 = 39,+  SpvCapabilityInputAttachment = 40,+  SpvCapabilitySparseResidency = 41,+  SpvCapabilityMinLod = 42,+  SpvCapabilitySampled1D = 43,+  SpvCapabilityImage1D = 44,+  SpvCapabilitySampledCubeArray = 45,+  SpvCapabilitySampledBuffer = 46,+  SpvCapabilityImageBuffer = 47,+  SpvCapabilityImageMSArray = 48,+  SpvCapabilityStorageImageExtendedFormats = 49,+  SpvCapabilityImageQuery = 50,+  SpvCapabilityDerivativeControl = 51,+  SpvCapabilityInterpolationFunction = 52,+  SpvCapabilityTransformFeedback = 53,+  SpvCapabilityGeometryStreams = 54,+  SpvCapabilityStorageImageReadWithoutFormat = 55,+  SpvCapabilityStorageImageWriteWithoutFormat = 56,+  SpvCapabilityMultiViewport = 57,+  SpvCapabilitySubgroupDispatch = 58,+  SpvCapabilityNamedBarrier = 59,+  SpvCapabilityPipeStorage = 60,+  SpvCapabilityGroupNonUniform = 61,+  SpvCapabilityGroupNonUniformVote = 62,+  SpvCapabilityGroupNonUniformArithmetic = 63,+  SpvCapabilityGroupNonUniformBallot = 64,+  SpvCapabilityGroupNonUniformShuffle = 65,+  SpvCapabilityGroupNonUniformShuffleRelative = 66,+  SpvCapabilityGroupNonUniformClustered = 67,+  SpvCapabilityGroupNonUniformQuad = 68,+  SpvCapabilityShaderLayer = 69,+  SpvCapabilityShaderViewportIndex = 70,+  SpvCapabilityUniformDecoration = 71,+  SpvCapabilityCoreBuiltinsARM = 4165,+  SpvCapabilityTileImageColorReadAccessEXT = 4166,+  SpvCapabilityTileImageDepthReadAccessEXT = 4167,+  SpvCapabilityTileImageStencilReadAccessEXT = 4168,+  SpvCapabilityFragmentShadingRateKHR = 4422,+  SpvCapabilitySubgroupBallotKHR = 4423,+  SpvCapabilityDrawParameters = 4427,+  SpvCapabilityWorkgroupMemoryExplicitLayoutKHR = 4428,+  SpvCapabilityWorkgroupMemoryExplicitLayout8BitAccessKHR = 4429,+  SpvCapabilityWorkgroupMemoryExplicitLayout16BitAccessKHR = 4430,+  SpvCapabilitySubgroupVoteKHR = 4431,+  SpvCapabilityStorageBuffer16BitAccess = 4433,+  SpvCapabilityStorageUniformBufferBlock16 = 4433,+  SpvCapabilityStorageUniform16 = 4434,+  SpvCapabilityUniformAndStorageBuffer16BitAccess = 4434,+  SpvCapabilityStoragePushConstant16 = 4435,+  SpvCapabilityStorageInputOutput16 = 4436,+  SpvCapabilityDeviceGroup = 4437,+  SpvCapabilityMultiView = 4439,+  SpvCapabilityVariablePointersStorageBuffer = 4441,+  SpvCapabilityVariablePointers = 4442,+  SpvCapabilityAtomicStorageOps = 4445,+  SpvCapabilitySampleMaskPostDepthCoverage = 4447,+  SpvCapabilityStorageBuffer8BitAccess = 4448,+  SpvCapabilityUniformAndStorageBuffer8BitAccess = 4449,+  SpvCapabilityStoragePushConstant8 = 4450,+  SpvCapabilityDenormPreserve = 4464,+  SpvCapabilityDenormFlushToZero = 4465,+  SpvCapabilitySignedZeroInfNanPreserve = 4466,+  SpvCapabilityRoundingModeRTE = 4467,+  SpvCapabilityRoundingModeRTZ = 4468,+  SpvCapabilityRayQueryProvisionalKHR = 4471,+  SpvCapabilityRayQueryKHR = 4472,+  SpvCapabilityRayTraversalPrimitiveCullingKHR = 4478,+  SpvCapabilityRayTracingKHR = 4479,+  SpvCapabilityTextureSampleWeightedQCOM = 4484,+  SpvCapabilityTextureBoxFilterQCOM = 4485,+  SpvCapabilityTextureBlockMatchQCOM = 4486,+  SpvCapabilityFloat16ImageAMD = 5008,+  SpvCapabilityImageGatherBiasLodAMD = 5009,+  SpvCapabilityFragmentMaskAMD = 5010,+  SpvCapabilityStencilExportEXT = 5013,+  SpvCapabilityImageReadWriteLodAMD = 5015,+  SpvCapabilityInt64ImageEXT = 5016,+  SpvCapabilityShaderClockKHR = 5055,+  SpvCapabilitySampleMaskOverrideCoverageNV = 5249,+  SpvCapabilityGeometryShaderPassthroughNV = 5251,+  SpvCapabilityShaderViewportIndexLayerEXT = 5254,+  SpvCapabilityShaderViewportIndexLayerNV = 5254,+  SpvCapabilityShaderViewportMaskNV = 5255,+  SpvCapabilityShaderStereoViewNV = 5259,+  SpvCapabilityPerViewAttributesNV = 5260,+  SpvCapabilityFragmentFullyCoveredEXT = 5265,+  SpvCapabilityMeshShadingNV = 5266,+  SpvCapabilityImageFootprintNV = 5282,+  SpvCapabilityMeshShadingEXT = 5283,+  SpvCapabilityFragmentBarycentricKHR = 5284,+  SpvCapabilityFragmentBarycentricNV = 5284,+  SpvCapabilityComputeDerivativeGroupQuadsNV = 5288,+  SpvCapabilityFragmentDensityEXT = 5291,+  SpvCapabilityShadingRateNV = 5291,+  SpvCapabilityGroupNonUniformPartitionedNV = 5297,+  SpvCapabilityShaderNonUniform = 5301,+  SpvCapabilityShaderNonUniformEXT = 5301,+  SpvCapabilityRuntimeDescriptorArray = 5302,+  SpvCapabilityRuntimeDescriptorArrayEXT = 5302,+  SpvCapabilityInputAttachmentArrayDynamicIndexing = 5303,+  SpvCapabilityInputAttachmentArrayDynamicIndexingEXT = 5303,+  SpvCapabilityUniformTexelBufferArrayDynamicIndexing = 5304,+  SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT = 5304,+  SpvCapabilityStorageTexelBufferArrayDynamicIndexing = 5305,+  SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT = 5305,+  SpvCapabilityUniformBufferArrayNonUniformIndexing = 5306,+  SpvCapabilityUniformBufferArrayNonUniformIndexingEXT = 5306,+  SpvCapabilitySampledImageArrayNonUniformIndexing = 5307,+  SpvCapabilitySampledImageArrayNonUniformIndexingEXT = 5307,+  SpvCapabilityStorageBufferArrayNonUniformIndexing = 5308,+  SpvCapabilityStorageBufferArrayNonUniformIndexingEXT = 5308,+  SpvCapabilityStorageImageArrayNonUniformIndexing = 5309,+  SpvCapabilityStorageImageArrayNonUniformIndexingEXT = 5309,+  SpvCapabilityInputAttachmentArrayNonUniformIndexing = 5310,+  SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310,+  SpvCapabilityUniformTexelBufferArrayNonUniformIndexing = 5311,+  SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311,+  SpvCapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,+  SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,+  SpvCapabilityRayTracingPositionFetchKHR = 5336,+  SpvCapabilityRayTracingNV = 5340,+  SpvCapabilityRayTracingMotionBlurNV = 5341,+  SpvCapabilityVulkanMemoryModel = 5345,+  SpvCapabilityVulkanMemoryModelKHR = 5345,+  SpvCapabilityVulkanMemoryModelDeviceScope = 5346,+  SpvCapabilityVulkanMemoryModelDeviceScopeKHR = 5346,+  SpvCapabilityPhysicalStorageBufferAddresses = 5347,+  SpvCapabilityPhysicalStorageBufferAddressesEXT = 5347,+  SpvCapabilityComputeDerivativeGroupLinearNV = 5350,+  SpvCapabilityRayTracingProvisionalKHR = 5353,+  SpvCapabilityCooperativeMatrixNV = 5357,+  SpvCapabilityFragmentShaderSampleInterlockEXT = 5363,+  SpvCapabilityFragmentShaderShadingRateInterlockEXT = 5372,+  SpvCapabilityShaderSMBuiltinsNV = 5373,+  SpvCapabilityFragmentShaderPixelInterlockEXT = 5378,+  SpvCapabilityDemoteToHelperInvocation = 5379,+  SpvCapabilityDemoteToHelperInvocationEXT = 5379,+  SpvCapabilityRayTracingOpacityMicromapEXT = 5381,+  SpvCapabilityShaderInvocationReorderNV = 5383,+  SpvCapabilityBindlessTextureNV = 5390,+  SpvCapabilityRayQueryPositionFetchKHR = 5391,+  SpvCapabilitySubgroupShuffleINTEL = 5568,+  SpvCapabilitySubgroupBufferBlockIOINTEL = 5569,+  SpvCapabilitySubgroupImageBlockIOINTEL = 5570,+  SpvCapabilitySubgroupImageMediaBlockIOINTEL = 5579,+  SpvCapabilityRoundToInfinityINTEL = 5582,+  SpvCapabilityFloatingPointModeINTEL = 5583,+  SpvCapabilityIntegerFunctions2INTEL = 5584,+  SpvCapabilityFunctionPointersINTEL = 5603,+  SpvCapabilityIndirectReferencesINTEL = 5604,+  SpvCapabilityAsmINTEL = 5606,+  SpvCapabilityAtomicFloat32MinMaxEXT = 5612,+  SpvCapabilityAtomicFloat64MinMaxEXT = 5613,+  SpvCapabilityAtomicFloat16MinMaxEXT = 5616,+  SpvCapabilityVectorComputeINTEL = 5617,+  SpvCapabilityVectorAnyINTEL = 5619,+  SpvCapabilityExpectAssumeKHR = 5629,+  SpvCapabilitySubgroupAvcMotionEstimationINTEL = 5696,+  SpvCapabilitySubgroupAvcMotionEstimationIntraINTEL = 5697,+  SpvCapabilitySubgroupAvcMotionEstimationChromaINTEL = 5698,+  SpvCapabilityVariableLengthArrayINTEL = 5817,+  SpvCapabilityFunctionFloatControlINTEL = 5821,+  SpvCapabilityFPGAMemoryAttributesINTEL = 5824,+  SpvCapabilityFPFastMathModeINTEL = 5837,+  SpvCapabilityArbitraryPrecisionIntegersINTEL = 5844,+  SpvCapabilityArbitraryPrecisionFloatingPointINTEL = 5845,+  SpvCapabilityUnstructuredLoopControlsINTEL = 5886,+  SpvCapabilityFPGALoopControlsINTEL = 5888,+  SpvCapabilityKernelAttributesINTEL = 5892,+  SpvCapabilityFPGAKernelAttributesINTEL = 5897,+  SpvCapabilityFPGAMemoryAccessesINTEL = 5898,+  SpvCapabilityFPGAClusterAttributesINTEL = 5904,+  SpvCapabilityLoopFuseINTEL = 5906,+  SpvCapabilityFPGADSPControlINTEL = 5908,+  SpvCapabilityMemoryAccessAliasingINTEL = 5910,+  SpvCapabilityFPGAInvocationPipeliningAttributesINTEL = 5916,+  SpvCapabilityFPGABufferLocationINTEL = 5920,+  SpvCapabilityArbitraryPrecisionFixedPointINTEL = 5922,+  SpvCapabilityUSMStorageClassesINTEL = 5935,+  SpvCapabilityRuntimeAlignedAttributeINTEL = 5939,+  SpvCapabilityIOPipesINTEL = 5943,+  SpvCapabilityBlockingPipesINTEL = 5945,+  SpvCapabilityFPGARegINTEL = 5948,+  SpvCapabilityDotProductInputAll = 6016,+  SpvCapabilityDotProductInputAllKHR = 6016,+  SpvCapabilityDotProductInput4x8Bit = 6017,+  SpvCapabilityDotProductInput4x8BitKHR = 6017,+  SpvCapabilityDotProductInput4x8BitPacked = 6018,+  SpvCapabilityDotProductInput4x8BitPackedKHR = 6018,+  SpvCapabilityDotProduct = 6019,+  SpvCapabilityDotProductKHR = 6019,+  SpvCapabilityRayCullMaskKHR = 6020,+  SpvCapabilityCooperativeMatrixKHR = 6022,+  SpvCapabilityBitInstructions = 6025,+  SpvCapabilityGroupNonUniformRotateKHR = 6026,+  SpvCapabilityAtomicFloat32AddEXT = 6033,+  SpvCapabilityAtomicFloat64AddEXT = 6034,+  SpvCapabilityLongConstantCompositeINTEL = 6089,+  SpvCapabilityOptNoneINTEL = 6094,+  SpvCapabilityAtomicFloat16AddEXT = 6095,+  SpvCapabilityDebugInfoModuleINTEL = 6114,+  SpvCapabilityBFloat16ConversionINTEL = 6115,+  SpvCapabilitySplitBarrierINTEL = 6141,+  SpvCapabilityFPGAKernelAttributesv2INTEL = 6161,+  SpvCapabilityFPGALatencyControlINTEL = 6171,+  SpvCapabilityFPGAArgumentInterfacesINTEL = 6174,+  SpvCapabilityGroupUniformArithmeticKHR = 6400,+  SpvCapabilityMax = 0x7fffffff,+} SpvCapability;++typedef enum SpvRayFlagsShift_ {+  SpvRayFlagsOpaqueKHRShift = 0,+  SpvRayFlagsNoOpaqueKHRShift = 1,+  SpvRayFlagsTerminateOnFirstHitKHRShift = 2,+  SpvRayFlagsSkipClosestHitShaderKHRShift = 3,+  SpvRayFlagsCullBackFacingTrianglesKHRShift = 4,+  SpvRayFlagsCullFrontFacingTrianglesKHRShift = 5,+  SpvRayFlagsCullOpaqueKHRShift = 6,+  SpvRayFlagsCullNoOpaqueKHRShift = 7,+  SpvRayFlagsSkipTrianglesKHRShift = 8,+  SpvRayFlagsSkipAABBsKHRShift = 9,+  SpvRayFlagsForceOpacityMicromap2StateEXTShift = 10,+  SpvRayFlagsMax = 0x7fffffff,+} SpvRayFlagsShift;++typedef enum SpvRayFlagsMask_ {+  SpvRayFlagsMaskNone = 0,+  SpvRayFlagsOpaqueKHRMask = 0x00000001,+  SpvRayFlagsNoOpaqueKHRMask = 0x00000002,+  SpvRayFlagsTerminateOnFirstHitKHRMask = 0x00000004,+  SpvRayFlagsSkipClosestHitShaderKHRMask = 0x00000008,+  SpvRayFlagsCullBackFacingTrianglesKHRMask = 0x00000010,+  SpvRayFlagsCullFrontFacingTrianglesKHRMask = 0x00000020,+  SpvRayFlagsCullOpaqueKHRMask = 0x00000040,+  SpvRayFlagsCullNoOpaqueKHRMask = 0x00000080,+  SpvRayFlagsSkipTrianglesKHRMask = 0x00000100,+  SpvRayFlagsSkipAABBsKHRMask = 0x00000200,+  SpvRayFlagsForceOpacityMicromap2StateEXTMask = 0x00000400,+} SpvRayFlagsMask;++typedef enum SpvRayQueryIntersection_ {+  SpvRayQueryIntersectionRayQueryCandidateIntersectionKHR = 0,+  SpvRayQueryIntersectionRayQueryCommittedIntersectionKHR = 1,+  SpvRayQueryIntersectionMax = 0x7fffffff,+} SpvRayQueryIntersection;++typedef enum SpvRayQueryCommittedIntersectionType_ {+  SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionNoneKHR = 0,+  SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionTriangleKHR =+      1,+  SpvRayQueryCommittedIntersectionTypeRayQueryCommittedIntersectionGeneratedKHR =+      2,+  SpvRayQueryCommittedIntersectionTypeMax = 0x7fffffff,+} SpvRayQueryCommittedIntersectionType;++typedef enum SpvRayQueryCandidateIntersectionType_ {+  SpvRayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionTriangleKHR =+      0,+  SpvRayQueryCandidateIntersectionTypeRayQueryCandidateIntersectionAABBKHR = 1,+  SpvRayQueryCandidateIntersectionTypeMax = 0x7fffffff,+} SpvRayQueryCandidateIntersectionType;++typedef enum SpvFragmentShadingRateShift_ {+  SpvFragmentShadingRateVertical2PixelsShift = 0,+  SpvFragmentShadingRateVertical4PixelsShift = 1,+  SpvFragmentShadingRateHorizontal2PixelsShift = 2,+  SpvFragmentShadingRateHorizontal4PixelsShift = 3,+  SpvFragmentShadingRateMax = 0x7fffffff,+} SpvFragmentShadingRateShift;++typedef enum SpvFragmentShadingRateMask_ {+  SpvFragmentShadingRateMaskNone = 0,+  SpvFragmentShadingRateVertical2PixelsMask = 0x00000001,+  SpvFragmentShadingRateVertical4PixelsMask = 0x00000002,+  SpvFragmentShadingRateHorizontal2PixelsMask = 0x00000004,+  SpvFragmentShadingRateHorizontal4PixelsMask = 0x00000008,+} SpvFragmentShadingRateMask;++typedef enum SpvFPDenormMode_ {+  SpvFPDenormModePreserve = 0,+  SpvFPDenormModeFlushToZero = 1,+  SpvFPDenormModeMax = 0x7fffffff,+} SpvFPDenormMode;++typedef enum SpvFPOperationMode_ {+  SpvFPOperationModeIEEE = 0,+  SpvFPOperationModeALT = 1,+  SpvFPOperationModeMax = 0x7fffffff,+} SpvFPOperationMode;++typedef enum SpvQuantizationModes_ {+  SpvQuantizationModesTRN = 0,+  SpvQuantizationModesTRN_ZERO = 1,+  SpvQuantizationModesRND = 2,+  SpvQuantizationModesRND_ZERO = 3,+  SpvQuantizationModesRND_INF = 4,+  SpvQuantizationModesRND_MIN_INF = 5,+  SpvQuantizationModesRND_CONV = 6,+  SpvQuantizationModesRND_CONV_ODD = 7,+  SpvQuantizationModesMax = 0x7fffffff,+} SpvQuantizationModes;++typedef enum SpvOverflowModes_ {+  SpvOverflowModesWRAP = 0,+  SpvOverflowModesSAT = 1,+  SpvOverflowModesSAT_ZERO = 2,+  SpvOverflowModesSAT_SYM = 3,+  SpvOverflowModesMax = 0x7fffffff,+} SpvOverflowModes;++typedef enum SpvPackedVectorFormat_ {+  SpvPackedVectorFormatPackedVectorFormat4x8Bit = 0,+  SpvPackedVectorFormatPackedVectorFormat4x8BitKHR = 0,+  SpvPackedVectorFormatMax = 0x7fffffff,+} SpvPackedVectorFormat;++typedef enum SpvCooperativeMatrixOperandsShift_ {+  SpvCooperativeMatrixOperandsMatrixASignedComponentsShift = 0,+  SpvCooperativeMatrixOperandsMatrixBSignedComponentsShift = 1,+  SpvCooperativeMatrixOperandsMatrixCSignedComponentsShift = 2,+  SpvCooperativeMatrixOperandsMatrixResultSignedComponentsShift = 3,+  SpvCooperativeMatrixOperandsSaturatingAccumulationShift = 4,+  SpvCooperativeMatrixOperandsMax = 0x7fffffff,+} SpvCooperativeMatrixOperandsShift;++typedef enum SpvCooperativeMatrixOperandsMask_ {+  SpvCooperativeMatrixOperandsMaskNone = 0,+  SpvCooperativeMatrixOperandsMatrixASignedComponentsMask = 0x00000001,+  SpvCooperativeMatrixOperandsMatrixBSignedComponentsMask = 0x00000002,+  SpvCooperativeMatrixOperandsMatrixCSignedComponentsMask = 0x00000004,+  SpvCooperativeMatrixOperandsMatrixResultSignedComponentsMask = 0x00000008,+  SpvCooperativeMatrixOperandsSaturatingAccumulationMask = 0x00000010,+} SpvCooperativeMatrixOperandsMask;++typedef enum SpvCooperativeMatrixLayout_ {+  SpvCooperativeMatrixLayoutRowMajorKHR = 0,+  SpvCooperativeMatrixLayoutColumnMajorKHR = 1,+  SpvCooperativeMatrixLayoutMax = 0x7fffffff,+} SpvCooperativeMatrixLayout;++typedef enum SpvCooperativeMatrixUse_ {+  SpvCooperativeMatrixUseMatrixAKHR = 0,+  SpvCooperativeMatrixUseMatrixBKHR = 1,+  SpvCooperativeMatrixUseMatrixAccumulatorKHR = 2,+  SpvCooperativeMatrixUseMax = 0x7fffffff,+} SpvCooperativeMatrixUse;++typedef enum SpvOp_ {+  SpvOpNop = 0,+  SpvOpUndef = 1,+  SpvOpSourceContinued = 2,+  SpvOpSource = 3,+  SpvOpSourceExtension = 4,+  SpvOpName = 5,+  SpvOpMemberName = 6,+  SpvOpString = 7,+  SpvOpLine = 8,+  SpvOpExtension = 10,+  SpvOpExtInstImport = 11,+  SpvOpExtInst = 12,+  SpvOpMemoryModel = 14,+  SpvOpEntryPoint = 15,+  SpvOpExecutionMode = 16,+  SpvOpCapability = 17,+  SpvOpTypeVoid = 19,+  SpvOpTypeBool = 20,+  SpvOpTypeInt = 21,+  SpvOpTypeFloat = 22,+  SpvOpTypeVector = 23,+  SpvOpTypeMatrix = 24,+  SpvOpTypeImage = 25,+  SpvOpTypeSampler = 26,+  SpvOpTypeSampledImage = 27,+  SpvOpTypeArray = 28,+  SpvOpTypeRuntimeArray = 29,+  SpvOpTypeStruct = 30,+  SpvOpTypeOpaque = 31,+  SpvOpTypePointer = 32,+  SpvOpTypeFunction = 33,+  SpvOpTypeEvent = 34,+  SpvOpTypeDeviceEvent = 35,+  SpvOpTypeReserveId = 36,+  SpvOpTypeQueue = 37,+  SpvOpTypePipe = 38,+  SpvOpTypeForwardPointer = 39,+  SpvOpConstantTrue = 41,+  SpvOpConstantFalse = 42,+  SpvOpConstant = 43,+  SpvOpConstantComposite = 44,+  SpvOpConstantSampler = 45,+  SpvOpConstantNull = 46,+  SpvOpSpecConstantTrue = 48,+  SpvOpSpecConstantFalse = 49,+  SpvOpSpecConstant = 50,+  SpvOpSpecConstantComposite = 51,+  SpvOpSpecConstantOp = 52,+  SpvOpFunction = 54,+  SpvOpFunctionParameter = 55,+  SpvOpFunctionEnd = 56,+  SpvOpFunctionCall = 57,+  SpvOpVariable = 59,+  SpvOpImageTexelPointer = 60,+  SpvOpLoad = 61,+  SpvOpStore = 62,+  SpvOpCopyMemory = 63,+  SpvOpCopyMemorySized = 64,+  SpvOpAccessChain = 65,+  SpvOpInBoundsAccessChain = 66,+  SpvOpPtrAccessChain = 67,+  SpvOpArrayLength = 68,+  SpvOpGenericPtrMemSemantics = 69,+  SpvOpInBoundsPtrAccessChain = 70,+  SpvOpDecorate = 71,+  SpvOpMemberDecorate = 72,+  SpvOpDecorationGroup = 73,+  SpvOpGroupDecorate = 74,+  SpvOpGroupMemberDecorate = 75,+  SpvOpVectorExtractDynamic = 77,+  SpvOpVectorInsertDynamic = 78,+  SpvOpVectorShuffle = 79,+  SpvOpCompositeConstruct = 80,+  SpvOpCompositeExtract = 81,+  SpvOpCompositeInsert = 82,+  SpvOpCopyObject = 83,+  SpvOpTranspose = 84,+  SpvOpSampledImage = 86,+  SpvOpImageSampleImplicitLod = 87,+  SpvOpImageSampleExplicitLod = 88,+  SpvOpImageSampleDrefImplicitLod = 89,+  SpvOpImageSampleDrefExplicitLod = 90,+  SpvOpImageSampleProjImplicitLod = 91,+  SpvOpImageSampleProjExplicitLod = 92,+  SpvOpImageSampleProjDrefImplicitLod = 93,+  SpvOpImageSampleProjDrefExplicitLod = 94,+  SpvOpImageFetch = 95,+  SpvOpImageGather = 96,+  SpvOpImageDrefGather = 97,+  SpvOpImageRead = 98,+  SpvOpImageWrite = 99,+  SpvOpImage = 100,+  SpvOpImageQueryFormat = 101,+  SpvOpImageQueryOrder = 102,+  SpvOpImageQuerySizeLod = 103,+  SpvOpImageQuerySize = 104,+  SpvOpImageQueryLod = 105,+  SpvOpImageQueryLevels = 106,+  SpvOpImageQuerySamples = 107,+  SpvOpConvertFToU = 109,+  SpvOpConvertFToS = 110,+  SpvOpConvertSToF = 111,+  SpvOpConvertUToF = 112,+  SpvOpUConvert = 113,+  SpvOpSConvert = 114,+  SpvOpFConvert = 115,+  SpvOpQuantizeToF16 = 116,+  SpvOpConvertPtrToU = 117,+  SpvOpSatConvertSToU = 118,+  SpvOpSatConvertUToS = 119,+  SpvOpConvertUToPtr = 120,+  SpvOpPtrCastToGeneric = 121,+  SpvOpGenericCastToPtr = 122,+  SpvOpGenericCastToPtrExplicit = 123,+  SpvOpBitcast = 124,+  SpvOpSNegate = 126,+  SpvOpFNegate = 127,+  SpvOpIAdd = 128,+  SpvOpFAdd = 129,+  SpvOpISub = 130,+  SpvOpFSub = 131,+  SpvOpIMul = 132,+  SpvOpFMul = 133,+  SpvOpUDiv = 134,+  SpvOpSDiv = 135,+  SpvOpFDiv = 136,+  SpvOpUMod = 137,+  SpvOpSRem = 138,+  SpvOpSMod = 139,+  SpvOpFRem = 140,+  SpvOpFMod = 141,+  SpvOpVectorTimesScalar = 142,+  SpvOpMatrixTimesScalar = 143,+  SpvOpVectorTimesMatrix = 144,+  SpvOpMatrixTimesVector = 145,+  SpvOpMatrixTimesMatrix = 146,+  SpvOpOuterProduct = 147,+  SpvOpDot = 148,+  SpvOpIAddCarry = 149,+  SpvOpISubBorrow = 150,+  SpvOpUMulExtended = 151,+  SpvOpSMulExtended = 152,+  SpvOpAny = 154,+  SpvOpAll = 155,+  SpvOpIsNan = 156,+  SpvOpIsInf = 157,+  SpvOpIsFinite = 158,+  SpvOpIsNormal = 159,+  SpvOpSignBitSet = 160,+  SpvOpLessOrGreater = 161,+  SpvOpOrdered = 162,+  SpvOpUnordered = 163,+  SpvOpLogicalEqual = 164,+  SpvOpLogicalNotEqual = 165,+  SpvOpLogicalOr = 166,+  SpvOpLogicalAnd = 167,+  SpvOpLogicalNot = 168,+  SpvOpSelect = 169,+  SpvOpIEqual = 170,+  SpvOpINotEqual = 171,+  SpvOpUGreaterThan = 172,+  SpvOpSGreaterThan = 173,+  SpvOpUGreaterThanEqual = 174,+  SpvOpSGreaterThanEqual = 175,+  SpvOpULessThan = 176,+  SpvOpSLessThan = 177,+  SpvOpULessThanEqual = 178,+  SpvOpSLessThanEqual = 179,+  SpvOpFOrdEqual = 180,+  SpvOpFUnordEqual = 181,+  SpvOpFOrdNotEqual = 182,+  SpvOpFUnordNotEqual = 183,+  SpvOpFOrdLessThan = 184,+  SpvOpFUnordLessThan = 185,+  SpvOpFOrdGreaterThan = 186,+  SpvOpFUnordGreaterThan = 187,+  SpvOpFOrdLessThanEqual = 188,+  SpvOpFUnordLessThanEqual = 189,+  SpvOpFOrdGreaterThanEqual = 190,+  SpvOpFUnordGreaterThanEqual = 191,+  SpvOpShiftRightLogical = 194,+  SpvOpShiftRightArithmetic = 195,+  SpvOpShiftLeftLogical = 196,+  SpvOpBitwiseOr = 197,+  SpvOpBitwiseXor = 198,+  SpvOpBitwiseAnd = 199,+  SpvOpNot = 200,+  SpvOpBitFieldInsert = 201,+  SpvOpBitFieldSExtract = 202,+  SpvOpBitFieldUExtract = 203,+  SpvOpBitReverse = 204,+  SpvOpBitCount = 205,+  SpvOpDPdx = 207,+  SpvOpDPdy = 208,+  SpvOpFwidth = 209,+  SpvOpDPdxFine = 210,+  SpvOpDPdyFine = 211,+  SpvOpFwidthFine = 212,+  SpvOpDPdxCoarse = 213,+  SpvOpDPdyCoarse = 214,+  SpvOpFwidthCoarse = 215,+  SpvOpEmitVertex = 218,+  SpvOpEndPrimitive = 219,+  SpvOpEmitStreamVertex = 220,+  SpvOpEndStreamPrimitive = 221,+  SpvOpControlBarrier = 224,+  SpvOpMemoryBarrier = 225,+  SpvOpAtomicLoad = 227,+  SpvOpAtomicStore = 228,+  SpvOpAtomicExchange = 229,+  SpvOpAtomicCompareExchange = 230,+  SpvOpAtomicCompareExchangeWeak = 231,+  SpvOpAtomicIIncrement = 232,+  SpvOpAtomicIDecrement = 233,+  SpvOpAtomicIAdd = 234,+  SpvOpAtomicISub = 235,+  SpvOpAtomicSMin = 236,+  SpvOpAtomicUMin = 237,+  SpvOpAtomicSMax = 238,+  SpvOpAtomicUMax = 239,+  SpvOpAtomicAnd = 240,+  SpvOpAtomicOr = 241,+  SpvOpAtomicXor = 242,+  SpvOpPhi = 245,+  SpvOpLoopMerge = 246,+  SpvOpSelectionMerge = 247,+  SpvOpLabel = 248,+  SpvOpBranch = 249,+  SpvOpBranchConditional = 250,+  SpvOpSwitch = 251,+  SpvOpKill = 252,+  SpvOpReturn = 253,+  SpvOpReturnValue = 254,+  SpvOpUnreachable = 255,+  SpvOpLifetimeStart = 256,+  SpvOpLifetimeStop = 257,+  SpvOpGroupAsyncCopy = 259,+  SpvOpGroupWaitEvents = 260,+  SpvOpGroupAll = 261,+  SpvOpGroupAny = 262,+  SpvOpGroupBroadcast = 263,+  SpvOpGroupIAdd = 264,+  SpvOpGroupFAdd = 265,+  SpvOpGroupFMin = 266,+  SpvOpGroupUMin = 267,+  SpvOpGroupSMin = 268,+  SpvOpGroupFMax = 269,+  SpvOpGroupUMax = 270,+  SpvOpGroupSMax = 271,+  SpvOpReadPipe = 274,+  SpvOpWritePipe = 275,+  SpvOpReservedReadPipe = 276,+  SpvOpReservedWritePipe = 277,+  SpvOpReserveReadPipePackets = 278,+  SpvOpReserveWritePipePackets = 279,+  SpvOpCommitReadPipe = 280,+  SpvOpCommitWritePipe = 281,+  SpvOpIsValidReserveId = 282,+  SpvOpGetNumPipePackets = 283,+  SpvOpGetMaxPipePackets = 284,+  SpvOpGroupReserveReadPipePackets = 285,+  SpvOpGroupReserveWritePipePackets = 286,+  SpvOpGroupCommitReadPipe = 287,+  SpvOpGroupCommitWritePipe = 288,+  SpvOpEnqueueMarker = 291,+  SpvOpEnqueueKernel = 292,+  SpvOpGetKernelNDrangeSubGroupCount = 293,+  SpvOpGetKernelNDrangeMaxSubGroupSize = 294,+  SpvOpGetKernelWorkGroupSize = 295,+  SpvOpGetKernelPreferredWorkGroupSizeMultiple = 296,+  SpvOpRetainEvent = 297,+  SpvOpReleaseEvent = 298,+  SpvOpCreateUserEvent = 299,+  SpvOpIsValidEvent = 300,+  SpvOpSetUserEventStatus = 301,+  SpvOpCaptureEventProfilingInfo = 302,+  SpvOpGetDefaultQueue = 303,+  SpvOpBuildNDRange = 304,+  SpvOpImageSparseSampleImplicitLod = 305,+  SpvOpImageSparseSampleExplicitLod = 306,+  SpvOpImageSparseSampleDrefImplicitLod = 307,+  SpvOpImageSparseSampleDrefExplicitLod = 308,+  SpvOpImageSparseSampleProjImplicitLod = 309,+  SpvOpImageSparseSampleProjExplicitLod = 310,+  SpvOpImageSparseSampleProjDrefImplicitLod = 311,+  SpvOpImageSparseSampleProjDrefExplicitLod = 312,+  SpvOpImageSparseFetch = 313,+  SpvOpImageSparseGather = 314,+  SpvOpImageSparseDrefGather = 315,+  SpvOpImageSparseTexelsResident = 316,+  SpvOpNoLine = 317,+  SpvOpAtomicFlagTestAndSet = 318,+  SpvOpAtomicFlagClear = 319,+  SpvOpImageSparseRead = 320,+  SpvOpSizeOf = 321,+  SpvOpTypePipeStorage = 322,+  SpvOpConstantPipeStorage = 323,+  SpvOpCreatePipeFromPipeStorage = 324,+  SpvOpGetKernelLocalSizeForSubgroupCount = 325,+  SpvOpGetKernelMaxNumSubgroups = 326,+  SpvOpTypeNamedBarrier = 327,+  SpvOpNamedBarrierInitialize = 328,+  SpvOpMemoryNamedBarrier = 329,+  SpvOpModuleProcessed = 330,+  SpvOpExecutionModeId = 331,+  SpvOpDecorateId = 332,+  SpvOpGroupNonUniformElect = 333,+  SpvOpGroupNonUniformAll = 334,+  SpvOpGroupNonUniformAny = 335,+  SpvOpGroupNonUniformAllEqual = 336,+  SpvOpGroupNonUniformBroadcast = 337,+  SpvOpGroupNonUniformBroadcastFirst = 338,+  SpvOpGroupNonUniformBallot = 339,+  SpvOpGroupNonUniformInverseBallot = 340,+  SpvOpGroupNonUniformBallotBitExtract = 341,+  SpvOpGroupNonUniformBallotBitCount = 342,+  SpvOpGroupNonUniformBallotFindLSB = 343,+  SpvOpGroupNonUniformBallotFindMSB = 344,+  SpvOpGroupNonUniformShuffle = 345,+  SpvOpGroupNonUniformShuffleXor = 346,+  SpvOpGroupNonUniformShuffleUp = 347,+  SpvOpGroupNonUniformShuffleDown = 348,+  SpvOpGroupNonUniformIAdd = 349,+  SpvOpGroupNonUniformFAdd = 350,+  SpvOpGroupNonUniformIMul = 351,+  SpvOpGroupNonUniformFMul = 352,+  SpvOpGroupNonUniformSMin = 353,+  SpvOpGroupNonUniformUMin = 354,+  SpvOpGroupNonUniformFMin = 355,+  SpvOpGroupNonUniformSMax = 356,+  SpvOpGroupNonUniformUMax = 357,+  SpvOpGroupNonUniformFMax = 358,+  SpvOpGroupNonUniformBitwiseAnd = 359,+  SpvOpGroupNonUniformBitwiseOr = 360,+  SpvOpGroupNonUniformBitwiseXor = 361,+  SpvOpGroupNonUniformLogicalAnd = 362,+  SpvOpGroupNonUniformLogicalOr = 363,+  SpvOpGroupNonUniformLogicalXor = 364,+  SpvOpGroupNonUniformQuadBroadcast = 365,+  SpvOpGroupNonUniformQuadSwap = 366,+  SpvOpCopyLogical = 400,+  SpvOpPtrEqual = 401,+  SpvOpPtrNotEqual = 402,+  SpvOpPtrDiff = 403,+  SpvOpColorAttachmentReadEXT = 4160,+  SpvOpDepthAttachmentReadEXT = 4161,+  SpvOpStencilAttachmentReadEXT = 4162,+  SpvOpTerminateInvocation = 4416,+  SpvOpSubgroupBallotKHR = 4421,+  SpvOpSubgroupFirstInvocationKHR = 4422,+  SpvOpSubgroupAllKHR = 4428,+  SpvOpSubgroupAnyKHR = 4429,+  SpvOpSubgroupAllEqualKHR = 4430,+  SpvOpGroupNonUniformRotateKHR = 4431,+  SpvOpSubgroupReadInvocationKHR = 4432,+  SpvOpTraceRayKHR = 4445,+  SpvOpExecuteCallableKHR = 4446,+  SpvOpConvertUToAccelerationStructureKHR = 4447,+  SpvOpIgnoreIntersectionKHR = 4448,+  SpvOpTerminateRayKHR = 4449,+  SpvOpSDot = 4450,+  SpvOpSDotKHR = 4450,+  SpvOpUDot = 4451,+  SpvOpUDotKHR = 4451,+  SpvOpSUDot = 4452,+  SpvOpSUDotKHR = 4452,+  SpvOpSDotAccSat = 4453,+  SpvOpSDotAccSatKHR = 4453,+  SpvOpUDotAccSat = 4454,+  SpvOpUDotAccSatKHR = 4454,+  SpvOpSUDotAccSat = 4455,+  SpvOpSUDotAccSatKHR = 4455,+  SpvOpTypeCooperativeMatrixKHR = 4456,+  SpvOpCooperativeMatrixLoadKHR = 4457,+  SpvOpCooperativeMatrixStoreKHR = 4458,+  SpvOpCooperativeMatrixMulAddKHR = 4459,+  SpvOpCooperativeMatrixLengthKHR = 4460,+  SpvOpTypeRayQueryKHR = 4472,+  SpvOpRayQueryInitializeKHR = 4473,+  SpvOpRayQueryTerminateKHR = 4474,+  SpvOpRayQueryGenerateIntersectionKHR = 4475,+  SpvOpRayQueryConfirmIntersectionKHR = 4476,+  SpvOpRayQueryProceedKHR = 4477,+  SpvOpRayQueryGetIntersectionTypeKHR = 4479,+  SpvOpImageSampleWeightedQCOM = 4480,+  SpvOpImageBoxFilterQCOM = 4481,+  SpvOpImageBlockMatchSSDQCOM = 4482,+  SpvOpImageBlockMatchSADQCOM = 4483,+  SpvOpGroupIAddNonUniformAMD = 5000,+  SpvOpGroupFAddNonUniformAMD = 5001,+  SpvOpGroupFMinNonUniformAMD = 5002,+  SpvOpGroupUMinNonUniformAMD = 5003,+  SpvOpGroupSMinNonUniformAMD = 5004,+  SpvOpGroupFMaxNonUniformAMD = 5005,+  SpvOpGroupUMaxNonUniformAMD = 5006,+  SpvOpGroupSMaxNonUniformAMD = 5007,+  SpvOpFragmentMaskFetchAMD = 5011,+  SpvOpFragmentFetchAMD = 5012,+  SpvOpReadClockKHR = 5056,+  SpvOpHitObjectRecordHitMotionNV = 5249,+  SpvOpHitObjectRecordHitWithIndexMotionNV = 5250,+  SpvOpHitObjectRecordMissMotionNV = 5251,+  SpvOpHitObjectGetWorldToObjectNV = 5252,+  SpvOpHitObjectGetObjectToWorldNV = 5253,+  SpvOpHitObjectGetObjectRayDirectionNV = 5254,+  SpvOpHitObjectGetObjectRayOriginNV = 5255,+  SpvOpHitObjectTraceRayMotionNV = 5256,+  SpvOpHitObjectGetShaderRecordBufferHandleNV = 5257,+  SpvOpHitObjectGetShaderBindingTableRecordIndexNV = 5258,+  SpvOpHitObjectRecordEmptyNV = 5259,+  SpvOpHitObjectTraceRayNV = 5260,+  SpvOpHitObjectRecordHitNV = 5261,+  SpvOpHitObjectRecordHitWithIndexNV = 5262,+  SpvOpHitObjectRecordMissNV = 5263,+  SpvOpHitObjectExecuteShaderNV = 5264,+  SpvOpHitObjectGetCurrentTimeNV = 5265,+  SpvOpHitObjectGetAttributesNV = 5266,+  SpvOpHitObjectGetHitKindNV = 5267,+  SpvOpHitObjectGetPrimitiveIndexNV = 5268,+  SpvOpHitObjectGetGeometryIndexNV = 5269,+  SpvOpHitObjectGetInstanceIdNV = 5270,+  SpvOpHitObjectGetInstanceCustomIndexNV = 5271,+  SpvOpHitObjectGetWorldRayDirectionNV = 5272,+  SpvOpHitObjectGetWorldRayOriginNV = 5273,+  SpvOpHitObjectGetRayTMaxNV = 5274,+  SpvOpHitObjectGetRayTMinNV = 5275,+  SpvOpHitObjectIsEmptyNV = 5276,+  SpvOpHitObjectIsHitNV = 5277,+  SpvOpHitObjectIsMissNV = 5278,+  SpvOpReorderThreadWithHitObjectNV = 5279,+  SpvOpReorderThreadWithHintNV = 5280,+  SpvOpTypeHitObjectNV = 5281,+  SpvOpImageSampleFootprintNV = 5283,+  SpvOpEmitMeshTasksEXT = 5294,+  SpvOpSetMeshOutputsEXT = 5295,+  SpvOpGroupNonUniformPartitionNV = 5296,+  SpvOpWritePackedPrimitiveIndices4x8NV = 5299,+  SpvOpReportIntersectionKHR = 5334,+  SpvOpReportIntersectionNV = 5334,+  SpvOpIgnoreIntersectionNV = 5335,+  SpvOpTerminateRayNV = 5336,+  SpvOpTraceNV = 5337,+  SpvOpTraceMotionNV = 5338,+  SpvOpTraceRayMotionNV = 5339,+  SpvOpRayQueryGetIntersectionTriangleVertexPositionsKHR = 5340,+  SpvOpTypeAccelerationStructureKHR = 5341,+  SpvOpTypeAccelerationStructureNV = 5341,+  SpvOpExecuteCallableNV = 5344,+  SpvOpTypeCooperativeMatrixNV = 5358,+  SpvOpCooperativeMatrixLoadNV = 5359,+  SpvOpCooperativeMatrixStoreNV = 5360,+  SpvOpCooperativeMatrixMulAddNV = 5361,+  SpvOpCooperativeMatrixLengthNV = 5362,+  SpvOpBeginInvocationInterlockEXT = 5364,+  SpvOpEndInvocationInterlockEXT = 5365,+  SpvOpDemoteToHelperInvocation = 5380,+  SpvOpDemoteToHelperInvocationEXT = 5380,+  SpvOpIsHelperInvocationEXT = 5381,+  SpvOpConvertUToImageNV = 5391,+  SpvOpConvertUToSamplerNV = 5392,+  SpvOpConvertImageToUNV = 5393,+  SpvOpConvertSamplerToUNV = 5394,+  SpvOpConvertUToSampledImageNV = 5395,+  SpvOpConvertSampledImageToUNV = 5396,+  SpvOpSamplerImageAddressingModeNV = 5397,+  SpvOpSubgroupShuffleINTEL = 5571,+  SpvOpSubgroupShuffleDownINTEL = 5572,+  SpvOpSubgroupShuffleUpINTEL = 5573,+  SpvOpSubgroupShuffleXorINTEL = 5574,+  SpvOpSubgroupBlockReadINTEL = 5575,+  SpvOpSubgroupBlockWriteINTEL = 5576,+  SpvOpSubgroupImageBlockReadINTEL = 5577,+  SpvOpSubgroupImageBlockWriteINTEL = 5578,+  SpvOpSubgroupImageMediaBlockReadINTEL = 5580,+  SpvOpSubgroupImageMediaBlockWriteINTEL = 5581,+  SpvOpUCountLeadingZerosINTEL = 5585,+  SpvOpUCountTrailingZerosINTEL = 5586,+  SpvOpAbsISubINTEL = 5587,+  SpvOpAbsUSubINTEL = 5588,+  SpvOpIAddSatINTEL = 5589,+  SpvOpUAddSatINTEL = 5590,+  SpvOpIAverageINTEL = 5591,+  SpvOpUAverageINTEL = 5592,+  SpvOpIAverageRoundedINTEL = 5593,+  SpvOpUAverageRoundedINTEL = 5594,+  SpvOpISubSatINTEL = 5595,+  SpvOpUSubSatINTEL = 5596,+  SpvOpIMul32x16INTEL = 5597,+  SpvOpUMul32x16INTEL = 5598,+  SpvOpConstantFunctionPointerINTEL = 5600,+  SpvOpFunctionPointerCallINTEL = 5601,+  SpvOpAsmTargetINTEL = 5609,+  SpvOpAsmINTEL = 5610,+  SpvOpAsmCallINTEL = 5611,+  SpvOpAtomicFMinEXT = 5614,+  SpvOpAtomicFMaxEXT = 5615,+  SpvOpAssumeTrueKHR = 5630,+  SpvOpExpectKHR = 5631,+  SpvOpDecorateString = 5632,+  SpvOpDecorateStringGOOGLE = 5632,+  SpvOpMemberDecorateString = 5633,+  SpvOpMemberDecorateStringGOOGLE = 5633,+  SpvOpVmeImageINTEL = 5699,+  SpvOpTypeVmeImageINTEL = 5700,+  SpvOpTypeAvcImePayloadINTEL = 5701,+  SpvOpTypeAvcRefPayloadINTEL = 5702,+  SpvOpTypeAvcSicPayloadINTEL = 5703,+  SpvOpTypeAvcMcePayloadINTEL = 5704,+  SpvOpTypeAvcMceResultINTEL = 5705,+  SpvOpTypeAvcImeResultINTEL = 5706,+  SpvOpTypeAvcImeResultSingleReferenceStreamoutINTEL = 5707,+  SpvOpTypeAvcImeResultDualReferenceStreamoutINTEL = 5708,+  SpvOpTypeAvcImeSingleReferenceStreaminINTEL = 5709,+  SpvOpTypeAvcImeDualReferenceStreaminINTEL = 5710,+  SpvOpTypeAvcRefResultINTEL = 5711,+  SpvOpTypeAvcSicResultINTEL = 5712,+  SpvOpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL = 5713,+  SpvOpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL = 5714,+  SpvOpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL = 5715,+  SpvOpSubgroupAvcMceSetInterShapePenaltyINTEL = 5716,+  SpvOpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL = 5717,+  SpvOpSubgroupAvcMceSetInterDirectionPenaltyINTEL = 5718,+  SpvOpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL = 5719,+  SpvOpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL = 5720,+  SpvOpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL = 5721,+  SpvOpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL = 5722,+  SpvOpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL = 5723,+  SpvOpSubgroupAvcMceSetMotionVectorCostFunctionINTEL = 5724,+  SpvOpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL = 5725,+  SpvOpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL = 5726,+  SpvOpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL = 5727,+  SpvOpSubgroupAvcMceSetAcOnlyHaarINTEL = 5728,+  SpvOpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL = 5729,+  SpvOpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL = 5730,+  SpvOpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL = 5731,+  SpvOpSubgroupAvcMceConvertToImePayloadINTEL = 5732,+  SpvOpSubgroupAvcMceConvertToImeResultINTEL = 5733,+  SpvOpSubgroupAvcMceConvertToRefPayloadINTEL = 5734,+  SpvOpSubgroupAvcMceConvertToRefResultINTEL = 5735,+  SpvOpSubgroupAvcMceConvertToSicPayloadINTEL = 5736,+  SpvOpSubgroupAvcMceConvertToSicResultINTEL = 5737,+  SpvOpSubgroupAvcMceGetMotionVectorsINTEL = 5738,+  SpvOpSubgroupAvcMceGetInterDistortionsINTEL = 5739,+  SpvOpSubgroupAvcMceGetBestInterDistortionsINTEL = 5740,+  SpvOpSubgroupAvcMceGetInterMajorShapeINTEL = 5741,+  SpvOpSubgroupAvcMceGetInterMinorShapeINTEL = 5742,+  SpvOpSubgroupAvcMceGetInterDirectionsINTEL = 5743,+  SpvOpSubgroupAvcMceGetInterMotionVectorCountINTEL = 5744,+  SpvOpSubgroupAvcMceGetInterReferenceIdsINTEL = 5745,+  SpvOpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL = 5746,+  SpvOpSubgroupAvcImeInitializeINTEL = 5747,+  SpvOpSubgroupAvcImeSetSingleReferenceINTEL = 5748,+  SpvOpSubgroupAvcImeSetDualReferenceINTEL = 5749,+  SpvOpSubgroupAvcImeRefWindowSizeINTEL = 5750,+  SpvOpSubgroupAvcImeAdjustRefOffsetINTEL = 5751,+  SpvOpSubgroupAvcImeConvertToMcePayloadINTEL = 5752,+  SpvOpSubgroupAvcImeSetMaxMotionVectorCountINTEL = 5753,+  SpvOpSubgroupAvcImeSetUnidirectionalMixDisableINTEL = 5754,+  SpvOpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL = 5755,+  SpvOpSubgroupAvcImeSetWeightedSadINTEL = 5756,+  SpvOpSubgroupAvcImeEvaluateWithSingleReferenceINTEL = 5757,+  SpvOpSubgroupAvcImeEvaluateWithDualReferenceINTEL = 5758,+  SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL = 5759,+  SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL = 5760,+  SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL = 5761,+  SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL = 5762,+  SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL = 5763,+  SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL = 5764,+  SpvOpSubgroupAvcImeConvertToMceResultINTEL = 5765,+  SpvOpSubgroupAvcImeGetSingleReferenceStreaminINTEL = 5766,+  SpvOpSubgroupAvcImeGetDualReferenceStreaminINTEL = 5767,+  SpvOpSubgroupAvcImeStripSingleReferenceStreamoutINTEL = 5768,+  SpvOpSubgroupAvcImeStripDualReferenceStreamoutINTEL = 5769,+  SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL =+      5770,+  SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL =+      5771,+  SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL =+      5772,+  SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL =+      5773,+  SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL = 5774,+  SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL =+      5775,+  SpvOpSubgroupAvcImeGetBorderReachedINTEL = 5776,+  SpvOpSubgroupAvcImeGetTruncatedSearchIndicationINTEL = 5777,+  SpvOpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL = 5778,+  SpvOpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL = 5779,+  SpvOpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL = 5780,+  SpvOpSubgroupAvcFmeInitializeINTEL = 5781,+  SpvOpSubgroupAvcBmeInitializeINTEL = 5782,+  SpvOpSubgroupAvcRefConvertToMcePayloadINTEL = 5783,+  SpvOpSubgroupAvcRefSetBidirectionalMixDisableINTEL = 5784,+  SpvOpSubgroupAvcRefSetBilinearFilterEnableINTEL = 5785,+  SpvOpSubgroupAvcRefEvaluateWithSingleReferenceINTEL = 5786,+  SpvOpSubgroupAvcRefEvaluateWithDualReferenceINTEL = 5787,+  SpvOpSubgroupAvcRefEvaluateWithMultiReferenceINTEL = 5788,+  SpvOpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL = 5789,+  SpvOpSubgroupAvcRefConvertToMceResultINTEL = 5790,+  SpvOpSubgroupAvcSicInitializeINTEL = 5791,+  SpvOpSubgroupAvcSicConfigureSkcINTEL = 5792,+  SpvOpSubgroupAvcSicConfigureIpeLumaINTEL = 5793,+  SpvOpSubgroupAvcSicConfigureIpeLumaChromaINTEL = 5794,+  SpvOpSubgroupAvcSicGetMotionVectorMaskINTEL = 5795,+  SpvOpSubgroupAvcSicConvertToMcePayloadINTEL = 5796,+  SpvOpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL = 5797,+  SpvOpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL = 5798,+  SpvOpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL = 5799,+  SpvOpSubgroupAvcSicSetBilinearFilterEnableINTEL = 5800,+  SpvOpSubgroupAvcSicSetSkcForwardTransformEnableINTEL = 5801,+  SpvOpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL = 5802,+  SpvOpSubgroupAvcSicEvaluateIpeINTEL = 5803,+  SpvOpSubgroupAvcSicEvaluateWithSingleReferenceINTEL = 5804,+  SpvOpSubgroupAvcSicEvaluateWithDualReferenceINTEL = 5805,+  SpvOpSubgroupAvcSicEvaluateWithMultiReferenceINTEL = 5806,+  SpvOpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL = 5807,+  SpvOpSubgroupAvcSicConvertToMceResultINTEL = 5808,+  SpvOpSubgroupAvcSicGetIpeLumaShapeINTEL = 5809,+  SpvOpSubgroupAvcSicGetBestIpeLumaDistortionINTEL = 5810,+  SpvOpSubgroupAvcSicGetBestIpeChromaDistortionINTEL = 5811,+  SpvOpSubgroupAvcSicGetPackedIpeLumaModesINTEL = 5812,+  SpvOpSubgroupAvcSicGetIpeChromaModeINTEL = 5813,+  SpvOpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL = 5814,+  SpvOpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL = 5815,+  SpvOpSubgroupAvcSicGetInterRawSadsINTEL = 5816,+  SpvOpVariableLengthArrayINTEL = 5818,+  SpvOpSaveMemoryINTEL = 5819,+  SpvOpRestoreMemoryINTEL = 5820,+  SpvOpArbitraryFloatSinCosPiINTEL = 5840,+  SpvOpArbitraryFloatCastINTEL = 5841,+  SpvOpArbitraryFloatCastFromIntINTEL = 5842,+  SpvOpArbitraryFloatCastToIntINTEL = 5843,+  SpvOpArbitraryFloatAddINTEL = 5846,+  SpvOpArbitraryFloatSubINTEL = 5847,+  SpvOpArbitraryFloatMulINTEL = 5848,+  SpvOpArbitraryFloatDivINTEL = 5849,+  SpvOpArbitraryFloatGTINTEL = 5850,+  SpvOpArbitraryFloatGEINTEL = 5851,+  SpvOpArbitraryFloatLTINTEL = 5852,+  SpvOpArbitraryFloatLEINTEL = 5853,+  SpvOpArbitraryFloatEQINTEL = 5854,+  SpvOpArbitraryFloatRecipINTEL = 5855,+  SpvOpArbitraryFloatRSqrtINTEL = 5856,+  SpvOpArbitraryFloatCbrtINTEL = 5857,+  SpvOpArbitraryFloatHypotINTEL = 5858,+  SpvOpArbitraryFloatSqrtINTEL = 5859,+  SpvOpArbitraryFloatLogINTEL = 5860,+  SpvOpArbitraryFloatLog2INTEL = 5861,+  SpvOpArbitraryFloatLog10INTEL = 5862,+  SpvOpArbitraryFloatLog1pINTEL = 5863,+  SpvOpArbitraryFloatExpINTEL = 5864,+  SpvOpArbitraryFloatExp2INTEL = 5865,+  SpvOpArbitraryFloatExp10INTEL = 5866,+  SpvOpArbitraryFloatExpm1INTEL = 5867,+  SpvOpArbitraryFloatSinINTEL = 5868,+  SpvOpArbitraryFloatCosINTEL = 5869,+  SpvOpArbitraryFloatSinCosINTEL = 5870,+  SpvOpArbitraryFloatSinPiINTEL = 5871,+  SpvOpArbitraryFloatCosPiINTEL = 5872,+  SpvOpArbitraryFloatASinINTEL = 5873,+  SpvOpArbitraryFloatASinPiINTEL = 5874,+  SpvOpArbitraryFloatACosINTEL = 5875,+  SpvOpArbitraryFloatACosPiINTEL = 5876,+  SpvOpArbitraryFloatATanINTEL = 5877,+  SpvOpArbitraryFloatATanPiINTEL = 5878,+  SpvOpArbitraryFloatATan2INTEL = 5879,+  SpvOpArbitraryFloatPowINTEL = 5880,+  SpvOpArbitraryFloatPowRINTEL = 5881,+  SpvOpArbitraryFloatPowNINTEL = 5882,+  SpvOpLoopControlINTEL = 5887,+  SpvOpAliasDomainDeclINTEL = 5911,+  SpvOpAliasScopeDeclINTEL = 5912,+  SpvOpAliasScopeListDeclINTEL = 5913,+  SpvOpFixedSqrtINTEL = 5923,+  SpvOpFixedRecipINTEL = 5924,+  SpvOpFixedRsqrtINTEL = 5925,+  SpvOpFixedSinINTEL = 5926,+  SpvOpFixedCosINTEL = 5927,+  SpvOpFixedSinCosINTEL = 5928,+  SpvOpFixedSinPiINTEL = 5929,+  SpvOpFixedCosPiINTEL = 5930,+  SpvOpFixedSinCosPiINTEL = 5931,+  SpvOpFixedLogINTEL = 5932,+  SpvOpFixedExpINTEL = 5933,+  SpvOpPtrCastToCrossWorkgroupINTEL = 5934,+  SpvOpCrossWorkgroupCastToPtrINTEL = 5938,+  SpvOpReadPipeBlockingINTEL = 5946,+  SpvOpWritePipeBlockingINTEL = 5947,+  SpvOpFPGARegINTEL = 5949,+  SpvOpRayQueryGetRayTMinKHR = 6016,+  SpvOpRayQueryGetRayFlagsKHR = 6017,+  SpvOpRayQueryGetIntersectionTKHR = 6018,+  SpvOpRayQueryGetIntersectionInstanceCustomIndexKHR = 6019,+  SpvOpRayQueryGetIntersectionInstanceIdKHR = 6020,+  SpvOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR = 6021,+  SpvOpRayQueryGetIntersectionGeometryIndexKHR = 6022,+  SpvOpRayQueryGetIntersectionPrimitiveIndexKHR = 6023,+  SpvOpRayQueryGetIntersectionBarycentricsKHR = 6024,+  SpvOpRayQueryGetIntersectionFrontFaceKHR = 6025,+  SpvOpRayQueryGetIntersectionCandidateAABBOpaqueKHR = 6026,+  SpvOpRayQueryGetIntersectionObjectRayDirectionKHR = 6027,+  SpvOpRayQueryGetIntersectionObjectRayOriginKHR = 6028,+  SpvOpRayQueryGetWorldRayDirectionKHR = 6029,+  SpvOpRayQueryGetWorldRayOriginKHR = 6030,+  SpvOpRayQueryGetIntersectionObjectToWorldKHR = 6031,+  SpvOpRayQueryGetIntersectionWorldToObjectKHR = 6032,+  SpvOpAtomicFAddEXT = 6035,+  SpvOpTypeBufferSurfaceINTEL = 6086,+  SpvOpTypeStructContinuedINTEL = 6090,+  SpvOpConstantCompositeContinuedINTEL = 6091,+  SpvOpSpecConstantCompositeContinuedINTEL = 6092,+  SpvOpConvertFToBF16INTEL = 6116,+  SpvOpConvertBF16ToFINTEL = 6117,+  SpvOpControlBarrierArriveINTEL = 6142,+  SpvOpControlBarrierWaitINTEL = 6143,+  SpvOpGroupIMulKHR = 6401,+  SpvOpGroupFMulKHR = 6402,+  SpvOpGroupBitwiseAndKHR = 6403,+  SpvOpGroupBitwiseOrKHR = 6404,+  SpvOpGroupBitwiseXorKHR = 6405,+  SpvOpGroupLogicalAndKHR = 6406,+  SpvOpGroupLogicalOrKHR = 6407,+  SpvOpGroupLogicalXorKHR = 6408,+  SpvOpMax = 0x7fffffff,+} SpvOp;++#ifdef SPV_ENABLE_UTILITY_CODE+#ifndef __cplusplus+#include <stdbool.h>+#endif+inline void SpvHasResultAndType(SpvOp opcode, bool* hasResult,+                                bool* hasResultType) {+  *hasResult = *hasResultType = false;+  switch (opcode) {+    default: /* unknown opcode */+      break;+    case SpvOpNop:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpUndef:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSourceContinued:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSource:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSourceExtension:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpName:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpMemberName:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpString:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpLine:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExtension:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExtInstImport:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpExtInst:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpMemoryModel:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEntryPoint:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExecutionMode:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCapability:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTypeVoid:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeBool:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeInt:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeFloat:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeVector:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeMatrix:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeImage:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeSampler:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeSampledImage:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeArray:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeRuntimeArray:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeStruct:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeOpaque:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypePointer:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeFunction:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeEvent:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeDeviceEvent:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeReserveId:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeQueue:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypePipe:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeForwardPointer:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpConstantTrue:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstantFalse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstant:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstantComposite:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstantSampler:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstantNull:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSpecConstantTrue:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSpecConstantFalse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSpecConstant:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSpecConstantComposite:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSpecConstantOp:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFunction:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFunctionParameter:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFunctionEnd:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpFunctionCall:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVariable:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageTexelPointer:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLoad:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpStore:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCopyMemory:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCopyMemorySized:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpAccessChain:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpInBoundsAccessChain:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrAccessChain:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArrayLength:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGenericPtrMemSemantics:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpInBoundsPtrAccessChain:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDecorate:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpMemberDecorate:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpDecorationGroup:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpGroupDecorate:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupMemberDecorate:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpVectorExtractDynamic:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVectorInsertDynamic:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVectorShuffle:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCompositeConstruct:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCompositeExtract:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCompositeInsert:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCopyObject:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTranspose:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSampledImage:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleDrefImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleDrefExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleProjImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleProjExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleProjDrefImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleProjDrefExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageFetch:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageGather:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageDrefGather:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageRead:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageWrite:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpImage:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQueryFormat:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQueryOrder:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQuerySizeLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQuerySize:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQueryLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQueryLevels:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageQuerySamples:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertFToU:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertFToS:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertSToF:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertUToF:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUConvert:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSConvert:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFConvert:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpQuantizeToF16:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertPtrToU:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSatConvertSToU:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSatConvertUToS:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertUToPtr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrCastToGeneric:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGenericCastToPtr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGenericCastToPtrExplicit:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitcast:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSNegate:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFNegate:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpISub:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFSub:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIMul:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFMul:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUDiv:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSDiv:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFDiv:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUMod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSRem:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSMod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFRem:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFMod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVectorTimesScalar:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpMatrixTimesScalar:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVectorTimesMatrix:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpMatrixTimesVector:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpMatrixTimesMatrix:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpOuterProduct:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIAddCarry:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpISubBorrow:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUMulExtended:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSMulExtended:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAny:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAll:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIsNan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIsInf:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIsFinite:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIsNormal:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSignBitSet:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLessOrGreater:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpOrdered:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUnordered:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLogicalEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLogicalNotEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLogicalOr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLogicalAnd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLogicalNot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSelect:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpINotEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUGreaterThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSGreaterThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUGreaterThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSGreaterThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpULessThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSLessThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpULessThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSLessThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdNotEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordNotEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdLessThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordLessThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdGreaterThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordGreaterThan:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdLessThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordLessThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFOrdGreaterThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFUnordGreaterThanEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpShiftRightLogical:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpShiftRightArithmetic:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpShiftLeftLogical:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitwiseOr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitwiseXor:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitwiseAnd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpNot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitFieldInsert:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitFieldSExtract:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitFieldUExtract:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitReverse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBitCount:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdx:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdy:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFwidth:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdxFine:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdyFine:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFwidthFine:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdxCoarse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDPdyCoarse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFwidthCoarse:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpEmitVertex:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEndPrimitive:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEmitStreamVertex:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEndStreamPrimitive:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpControlBarrier:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpMemoryBarrier:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpAtomicLoad:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicStore:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpAtomicExchange:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicCompareExchange:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicCompareExchangeWeak:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicIIncrement:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicIDecrement:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicIAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicISub:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicSMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicUMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicSMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicUMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicAnd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicOr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicXor:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPhi:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLoopMerge:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSelectionMerge:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpLabel:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpBranch:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpBranchConditional:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSwitch:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpKill:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpReturn:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpReturnValue:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpUnreachable:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpLifetimeStart:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpLifetimeStop:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupAsyncCopy:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupWaitEvents:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupAll:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupAny:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupBroadcast:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupIAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupUMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupSMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupUMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupSMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReadPipe:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpWritePipe:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReservedReadPipe:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReservedWritePipe:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReserveReadPipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReserveWritePipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCommitReadPipe:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCommitWritePipe:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpIsValidReserveId:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetNumPipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetMaxPipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupReserveReadPipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupReserveWritePipePackets:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupCommitReadPipe:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupCommitWritePipe:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEnqueueMarker:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpEnqueueKernel:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelNDrangeSubGroupCount:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelNDrangeMaxSubGroupSize:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelWorkGroupSize:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelPreferredWorkGroupSizeMultiple:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRetainEvent:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpReleaseEvent:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCreateUserEvent:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIsValidEvent:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSetUserEventStatus:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCaptureEventProfilingInfo:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGetDefaultQueue:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBuildNDRange:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleDrefImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleDrefExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleProjImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleProjExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleProjDrefImplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseSampleProjDrefExplicitLod:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseFetch:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseGather:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseDrefGather:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSparseTexelsResident:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpNoLine:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpAtomicFlagTestAndSet:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicFlagClear:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpImageSparseRead:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSizeOf:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypePipeStorage:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpConstantPipeStorage:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCreatePipeFromPipeStorage:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelLocalSizeForSubgroupCount:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGetKernelMaxNumSubgroups:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeNamedBarrier:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpNamedBarrierInitialize:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpMemoryNamedBarrier:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpModuleProcessed:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExecutionModeId:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpDecorateId:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupNonUniformElect:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformAll:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformAny:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformAllEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBroadcast:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBroadcastFirst:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBallot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformInverseBallot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBallotBitExtract:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBallotBitCount:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBallotFindLSB:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBallotFindMSB:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformShuffle:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformShuffleXor:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformShuffleUp:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformShuffleDown:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformIAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformFAdd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformIMul:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformFMul:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformSMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformUMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformFMin:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformSMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformUMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformFMax:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBitwiseAnd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBitwiseOr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformBitwiseXor:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformLogicalAnd:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformLogicalOr:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformLogicalXor:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformQuadBroadcast:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformQuadSwap:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCopyLogical:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrNotEqual:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrDiff:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpColorAttachmentReadEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDepthAttachmentReadEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpStencilAttachmentReadEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTerminateInvocation:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSubgroupBallotKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupFirstInvocationKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAllKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAnyKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAllEqualKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupNonUniformRotateKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupReadInvocationKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTraceRayKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExecuteCallableKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpConvertUToAccelerationStructureKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIgnoreIntersectionKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTerminateRayKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSDot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUDot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSUDot:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSDotAccSat:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUDotAccSat:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSUDotAccSat:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeCooperativeMatrixKHR:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpCooperativeMatrixLoadKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCooperativeMatrixStoreKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCooperativeMatrixMulAddKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCooperativeMatrixLengthKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeRayQueryKHR:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpRayQueryInitializeKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpRayQueryTerminateKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpRayQueryGenerateIntersectionKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpRayQueryConfirmIntersectionKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpRayQueryProceedKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionTypeKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageSampleWeightedQCOM:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageBoxFilterQCOM:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageBlockMatchSSDQCOM:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpImageBlockMatchSADQCOM:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupIAddNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFAddNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFMinNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupUMinNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupSMinNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFMaxNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupUMaxNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupSMaxNonUniformAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFragmentMaskFetchAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFragmentFetchAMD:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReadClockKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectRecordHitMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectRecordHitWithIndexMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectRecordMissMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectGetWorldToObjectNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetObjectToWorldNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetObjectRayDirectionNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetObjectRayOriginNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectTraceRayMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectGetShaderRecordBufferHandleNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetShaderBindingTableRecordIndexNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectRecordEmptyNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectTraceRayNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectRecordHitNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectRecordHitWithIndexNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectRecordMissNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectExecuteShaderNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectGetCurrentTimeNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetAttributesNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpHitObjectGetHitKindNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetPrimitiveIndexNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetGeometryIndexNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetInstanceIdNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetInstanceCustomIndexNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetWorldRayDirectionNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetWorldRayOriginNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetRayTMaxNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectGetRayTMinNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectIsEmptyNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectIsHitNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpHitObjectIsMissNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReorderThreadWithHitObjectNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpReorderThreadWithHintNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTypeHitObjectNV:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpImageSampleFootprintNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpEmitMeshTasksEXT:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSetMeshOutputsEXT:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupNonUniformPartitionNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpWritePackedPrimitiveIndices4x8NV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpReportIntersectionNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIgnoreIntersectionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTerminateRayNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTraceNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTraceMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTraceRayMotionNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpRayQueryGetIntersectionTriangleVertexPositionsKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeAccelerationStructureNV:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpExecuteCallableNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpTypeCooperativeMatrixNV:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpCooperativeMatrixLoadNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCooperativeMatrixStoreNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpCooperativeMatrixMulAddNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCooperativeMatrixLengthNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpBeginInvocationInterlockEXT:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpEndInvocationInterlockEXT:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpDemoteToHelperInvocation:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpIsHelperInvocationEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertUToImageNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertUToSamplerNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertImageToUNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertSamplerToUNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertUToSampledImageNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertSampledImageToUNV:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSamplerImageAddressingModeNV:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSubgroupShuffleINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupShuffleDownINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupShuffleUpINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupShuffleXorINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupBlockReadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupBlockWriteINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSubgroupImageBlockReadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupImageBlockWriteINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSubgroupImageMediaBlockReadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupImageMediaBlockWriteINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpUCountLeadingZerosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUCountTrailingZerosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAbsISubINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAbsUSubINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIAddSatINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUAddSatINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIAverageINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUAverageINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIAverageRoundedINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUAverageRoundedINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpISubSatINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUSubSatINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpIMul32x16INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpUMul32x16INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConstantFunctionPointerINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFunctionPointerCallINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAsmTargetINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAsmINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAsmCallINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicFMinEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicFMaxEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAssumeTrueKHR:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpExpectKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpDecorateString:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpMemberDecorateString:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpVmeImageINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeVmeImageINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImePayloadINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcRefPayloadINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcSicPayloadINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcMcePayloadINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcMceResultINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImeResultINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImeResultSingleReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImeResultDualReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImeSingleReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcImeDualReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcRefResultINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeAvcSicResultINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpSubgroupAvcMceGetDefaultInterBaseMultiReferencePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetInterBaseMultiReferencePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultInterShapePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetInterShapePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultInterDirectionPenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetInterDirectionPenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultIntraLumaShapePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultInterMotionVectorCostTableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultHighPenaltyCostTableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultMediumPenaltyCostTableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultLowPenaltyCostTableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetMotionVectorCostFunctionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultIntraLumaModePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultNonDcLumaIntraPenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetDefaultIntraChromaModeBasePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetAcOnlyHaarINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetSourceInterlacedFieldPolarityINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetSingleReferenceInterlacedFieldPolarityINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceSetDualReferenceInterlacedFieldPolaritiesINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToImePayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToImeResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToRefPayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToRefResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToSicPayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceConvertToSicResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetMotionVectorsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterDistortionsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetBestInterDistortionsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterMajorShapeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterMinorShapeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterDirectionsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterMotionVectorCountINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterReferenceIdsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcMceGetInterReferenceInterlacedFieldPolaritiesINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeInitializeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetSingleReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetDualReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeRefWindowSizeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeAdjustRefOffsetINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeConvertToMcePayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetMaxMotionVectorCountINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetUnidirectionalMixDisableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetEarlySearchTerminationThresholdINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeSetWeightedSadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithSingleReferenceStreaminoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeEvaluateWithDualReferenceStreaminoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeConvertToMceResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetSingleReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetDualReferenceStreaminINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeStripSingleReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeStripDualReferenceStreamoutINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeMotionVectorsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeDistortionsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutSingleReferenceMajorShapeReferenceIdsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeMotionVectorsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeDistortionsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetStreamoutDualReferenceMajorShapeReferenceIdsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetBorderReachedINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetTruncatedSearchIndicationINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetUnidirectionalEarlySearchTerminationINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetWeightingPatternMinimumMotionVectorINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcImeGetWeightingPatternMinimumDistortionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcFmeInitializeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcBmeInitializeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefConvertToMcePayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefSetBidirectionalMixDisableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefSetBilinearFilterEnableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefEvaluateWithSingleReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefEvaluateWithDualReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefEvaluateWithMultiReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefEvaluateWithMultiReferenceInterlacedINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcRefConvertToMceResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicInitializeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicConfigureSkcINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicConfigureIpeLumaINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicConfigureIpeLumaChromaINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetMotionVectorMaskINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicConvertToMcePayloadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetIntraLumaShapePenaltyINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetIntraLumaModeCostFunctionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetIntraChromaModeCostFunctionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetBilinearFilterEnableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetSkcForwardTransformEnableINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicSetBlockBasedRawSkipSadINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicEvaluateIpeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicEvaluateWithSingleReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicEvaluateWithDualReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicEvaluateWithMultiReferenceINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicConvertToMceResultINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetIpeLumaShapeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetBestIpeLumaDistortionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetBestIpeChromaDistortionINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetPackedIpeLumaModesINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetIpeChromaModeINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetPackedSkcLumaCountThresholdINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetPackedSkcLumaSumThresholdINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSubgroupAvcSicGetInterRawSadsINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpVariableLengthArrayINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpSaveMemoryINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRestoreMemoryINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpArbitraryFloatSinCosPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCastINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCastFromIntINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCastToIntINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatAddINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatSubINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatMulINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatDivINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatGTINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatGEINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLTINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLEINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatEQINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatRecipINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatRSqrtINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCbrtINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatHypotINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatSqrtINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLogINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLog2INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLog10INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatLog1pINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatExpINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatExp2INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatExp10INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatExpm1INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatSinINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatSinCosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatSinPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatCosPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatASinINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatASinPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatACosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatACosPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatATanINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatATanPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatATan2INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatPowINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatPowRINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpArbitraryFloatPowNINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpLoopControlINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpAliasDomainDeclINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpAliasScopeDeclINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpAliasScopeListDeclINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpFixedSqrtINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedRecipINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedRsqrtINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedSinINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedCosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedSinCosINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedSinPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedCosPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedSinCosPiINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedLogINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFixedExpINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpPtrCastToCrossWorkgroupINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpCrossWorkgroupCastToPtrINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpReadPipeBlockingINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpWritePipeBlockingINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpFPGARegINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetRayTMinKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetRayFlagsKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionTKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionInstanceCustomIndexKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionInstanceIdKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionGeometryIndexKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionPrimitiveIndexKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionBarycentricsKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionFrontFaceKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionCandidateAABBOpaqueKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionObjectRayDirectionKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionObjectRayOriginKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetWorldRayDirectionKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetWorldRayOriginKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionObjectToWorldKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpRayQueryGetIntersectionWorldToObjectKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpAtomicFAddEXT:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpTypeBufferSurfaceINTEL:+      *hasResult = true;+      *hasResultType = false;+      break;+    case SpvOpTypeStructContinuedINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpConstantCompositeContinuedINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpSpecConstantCompositeContinuedINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpConvertFToBF16INTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpConvertBF16ToFINTEL:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpControlBarrierArriveINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpControlBarrierWaitINTEL:+      *hasResult = false;+      *hasResultType = false;+      break;+    case SpvOpGroupIMulKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupFMulKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupBitwiseAndKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupBitwiseOrKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupBitwiseXorKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupLogicalAndKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupLogicalOrKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+    case SpvOpGroupLogicalXorKHR:+      *hasResult = true;+      *hasResultType = true;+      break;+  } } #endif /* SPV_ENABLE_UTILITY_CODE */ 
cbits/spirv_reflect.c view
@@ -15,5083 +15,5468 @@ */  #include "spirv_reflect.h"-#include <assert.h>-#include <stdbool.h>-#include <string.h>--#if defined(WIN32)-  #define _CRTDBG_MAP_ALLOC-  #include <stdlib.h>-  #include <crtdbg.h>-#else-  #include <stdlib.h>-#endif--#if defined(SPIRV_REFLECT_ENABLE_ASSERTS)-  #define SPV_REFLECT_ASSERT(COND) \-    assert(COND);-#else-#define SPV_REFLECT_ASSERT(COND)-#endif--// Temporary enums until these make it into SPIR-V/Vulkan-// clang-format off-enum {-  SpvReflectOpDecorateId                      = 332,-  SpvReflectOpDecorateStringGOOGLE            = 5632,-  SpvReflectOpMemberDecorateStringGOOGLE      = 5633,-  SpvReflectDecorationHlslCounterBufferGOOGLE = 5634,-  SpvReflectDecorationHlslSemanticGOOGLE      = 5635-};-// clang-format on--// clang-format off-enum {-  SPIRV_STARTING_WORD_INDEX       = 5,-  SPIRV_WORD_SIZE                 = sizeof(uint32_t),-  SPIRV_BYTE_WIDTH                = 8,-  SPIRV_MINIMUM_FILE_SIZE         = SPIRV_STARTING_WORD_INDEX * SPIRV_WORD_SIZE,-  SPIRV_DATA_ALIGNMENT            = 4 * SPIRV_WORD_SIZE, // 16-  SPIRV_ACCESS_CHAIN_INDEX_OFFSET = 4,-};-// clang-format on--// clang-format off-enum {-  INVALID_VALUE  = 0xFFFFFFFF,-};-// clang-format on--// clang-format off-enum {-  MAX_NODE_NAME_LENGTH      = 1024,-};-// clang-format on--// clang-format off-enum {-  IMAGE_SAMPLED = 1,-  IMAGE_STORAGE = 2-};-// clang-format on--// clang-format off-typedef struct SpvReflectPrvArrayTraits {-  uint32_t                        element_type_id;-  uint32_t                        length_id;-} SpvReflectPrvArrayTraits;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvImageTraits {-  uint32_t                        sampled_type_id;-  SpvDim                          dim;-  uint32_t                        depth;-  uint32_t                        arrayed;-  uint32_t                        ms;-  uint32_t                        sampled;-  SpvImageFormat                  image_format;-} SpvReflectPrvImageTraits;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvNumberDecoration {-  uint32_t                        word_offset;-  uint32_t                        value;-} SpvReflectPrvNumberDecoration;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvStringDecoration {-  uint32_t                        word_offset;-  const char*                     value;-} SpvReflectPrvStringDecoration;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvDecorations {-  bool                            is_relaxed_precision;-  bool                            is_block;-  bool                            is_buffer_block;-  bool                            is_row_major;-  bool                            is_column_major;-  bool                            is_built_in;-  bool                            is_noperspective;-  bool                            is_flat;-  bool                            is_non_writable;-  bool                            is_non_readable;-  SpvReflectPrvNumberDecoration   set;-  SpvReflectPrvNumberDecoration   binding;-  SpvReflectPrvNumberDecoration   input_attachment_index;-  SpvReflectPrvNumberDecoration   location;-  SpvReflectPrvNumberDecoration   offset;-  SpvReflectPrvNumberDecoration   uav_counter_buffer;-  SpvReflectPrvStringDecoration   semantic;-  uint32_t                        array_stride;-  uint32_t                        matrix_stride;-  SpvBuiltIn                      built_in;-} SpvReflectPrvDecorations;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvNode {-  uint32_t                        result_id;-  SpvOp                           op;-  uint32_t                        result_type_id;-  uint32_t                        type_id;-  SpvCapability                   capability;-  SpvStorageClass                 storage_class;-  uint32_t                        word_offset;-  uint32_t                        word_count;-  bool                            is_type;--  SpvReflectPrvArrayTraits        array_traits;-  SpvReflectPrvImageTraits        image_traits;-  uint32_t                        image_type_id;--  const char*                     name;-  SpvReflectPrvDecorations        decorations;-  uint32_t                        member_count;-  const char**                    member_names;-  SpvReflectPrvDecorations*       member_decorations;-} SpvReflectPrvNode;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvString {-  uint32_t                        result_id;-  const char*                     string;-} SpvReflectPrvString;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvFunction {-  uint32_t                        id;-  uint32_t                        callee_count;-  uint32_t*                       callees;-  struct SpvReflectPrvFunction**  callee_ptrs;-  uint32_t                        accessed_ptr_count;-  uint32_t*                       accessed_ptrs;-} SpvReflectPrvFunction;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvAccessChain {-  uint32_t                        result_id;-  uint32_t                        result_type_id;-  //-  // Pointing to the base of a composite object.-  // Generally the id of descriptor block variable-  uint32_t                        base_id;-  // -  // From spec:-  //   The first index in Indexes will select the -  //   top-level member/element/component/element -  //   of the base composite-  uint32_t                        index_count;-  uint32_t*                       indexes;-} SpvReflectPrvAccessChain;-// clang-format on--// clang-format off-typedef struct SpvReflectPrvParser {-  size_t                          spirv_word_count;-  uint32_t*                       spirv_code;-  uint32_t                        string_count;-  SpvReflectPrvString*            strings;-  SpvSourceLanguage               source_language;-  uint32_t                        source_language_version;-  uint32_t                        source_file_id;-  const char*                     source_embedded;-  size_t                          node_count;-  SpvReflectPrvNode*              nodes;-  uint32_t                        entry_point_count;-  uint32_t                        capability_count;-  uint32_t                        function_count;-  SpvReflectPrvFunction*          functions;-  uint32_t                        access_chain_count;-  SpvReflectPrvAccessChain*       access_chains;--  uint32_t                        type_count;-  uint32_t                        descriptor_count;-  uint32_t                        push_constant_count;-} SpvReflectPrvParser;-// clang-format on--static uint32_t Max(-   uint32_t a, -   uint32_t b)-{-  return a > b ? a : b;-}--static uint32_t RoundUp(-   uint32_t value,-   uint32_t multiple)-{-  assert(multiple && ((multiple & (multiple - 1)) == 0));-  return (value + multiple - 1) & ~(multiple - 1);-}--#define IsNull(ptr) \-  (ptr == NULL)--#define IsNotNull(ptr) \-  (ptr != NULL)--#define SafeFree(ptr)  \-  {                    \-     free((void*)ptr); \-     ptr = NULL;       \-  }--static int SortCompareUint32(-  const void* a, -  const void* b)-{-  const uint32_t* p_a = (const uint32_t*)a;-  const uint32_t* p_b = (const uint32_t*)b;--  return (int)*p_a - (int)*p_b;-}--//-// De-duplicates a sorted array and returns the new size.-//-// Note: The array doesn't actually need to be sorted, just-// arranged into "runs" so that all the entries with one-// value are adjacent.-//-static size_t DedupSortedUint32(uint32_t* arr, size_t size)-{-  if (size == 0) {-    return 0;-  }-  size_t dedup_idx = 0;-  for (size_t i = 0; i < size; ++i) {-    if (arr[dedup_idx] != arr[i]) {-      ++dedup_idx;-      arr[dedup_idx] = arr[i];-    }-  }-  return dedup_idx+1;-}--static bool SearchSortedUint32(-  const uint32_t* arr, -  size_t          size, -  uint32_t        target)-{-  size_t lo = 0;-  size_t hi = size;-  while (lo < hi) {-    size_t mid = (hi - lo) / 2 + lo;-    if (arr[mid] == target) {-      return true;-    } else if (arr[mid] < target) {-      lo = mid+1;-    } else {-      hi = mid;-    }-  }-  return false;-}--static SpvReflectResult IntersectSortedUint32(-  const uint32_t* p_arr0, -  size_t          arr0_size,-  const uint32_t* p_arr1, -  size_t          arr1_size,-  uint32_t**      pp_res,-  size_t*         res_size-)-{-  *pp_res = NULL;-  *res_size = 0;-  if (IsNull(p_arr0) || IsNull(p_arr1)) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  const uint32_t* arr0_end = p_arr0 + arr0_size;-  const uint32_t* arr1_end = p_arr1 + arr1_size;--  const uint32_t* idx0 = p_arr0;-  const uint32_t* idx1 = p_arr1;-  while (idx0 != arr0_end && idx1 != arr1_end) {-    if (*idx0 < *idx1) {-      ++idx0;-    } else if (*idx0 > *idx1) {-      ++idx1;-    } else {-      ++*res_size;-      ++idx0;-      ++idx1;-    }-  }--  if (*res_size > 0) {-    *pp_res = (uint32_t*)calloc(*res_size, sizeof(**pp_res));-    if (IsNull(*pp_res)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-    uint32_t* idxr = *pp_res;-    idx0 = p_arr0;-    idx1 = p_arr1;-    while (idx0 != arr0_end && idx1 != arr1_end) {-      if (*idx0 < *idx1) {-        ++idx0;-      } else if (*idx0 > *idx1) {-        ++idx1;-      } else {-        *(idxr++) = *idx0;-        ++idx0;-        ++idx1;-      }-    }-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}---static bool InRange(-  const SpvReflectPrvParser* p_parser, -  uint32_t                   index)-{-  bool in_range = false;-  if (IsNotNull(p_parser)) {-    in_range = (index < p_parser->spirv_word_count);-  }-  return in_range;-}--static SpvReflectResult ReadU32(-  SpvReflectPrvParser* p_parser,-  uint32_t             word_offset,-  uint32_t*            p_value)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(InRange(p_parser, word_offset));-  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;-  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && InRange(p_parser, word_offset)) {-    *p_value = *(p_parser->spirv_code + word_offset);-    result = SPV_REFLECT_RESULT_SUCCESS;-  }-  return result;-}--#define CHECKED_READU32(parser, word_offset, value)                                      \-  {                                                                                      \-    SpvReflectResult checked_readu32_result = ReadU32(parser,                            \-                                                      word_offset, (uint32_t*)&(value)); \-    if (checked_readu32_result != SPV_REFLECT_RESULT_SUCCESS) {                          \-      return checked_readu32_result;                                                     \-    }                                                                                    \-  }--#define CHECKED_READU32_CAST(parser, word_offset, cast_to_type, value)         \-  {                                                                            \-    uint32_t checked_readu32_cast_u32 = UINT32_MAX;                            \-    SpvReflectResult checked_readu32_cast_result = ReadU32(parser,             \-                                      word_offset,                             \-                                      (uint32_t*)&(checked_readu32_cast_u32)); \-    if (checked_readu32_cast_result != SPV_REFLECT_RESULT_SUCCESS) {           \-      return checked_readu32_cast_result;                                      \-    }                                                                          \-    value = (cast_to_type)checked_readu32_cast_u32;                            \-  }--#define IF_READU32(result, parser, word_offset, value)          \-  if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                 \-    result = ReadU32(parser, word_offset, (uint32_t*)&(value)); \-  }--#define IF_READU32_CAST(result, parser, word_offset, cast_to_type, value) \-  if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                           \-    uint32_t if_readu32_cast_u32 = UINT32_MAX;                            \-    result = ReadU32(parser, word_offset, &if_readu32_cast_u32);          \-    if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                         \-      value = (cast_to_type)if_readu32_cast_u32;                          \-    }                                                                     \-  }--static SpvReflectResult ReadStr(-  SpvReflectPrvParser* p_parser, -  uint32_t             word_offset, -  uint32_t             word_index, -  uint32_t             word_count,-  uint32_t*            p_buf_size, -  char*                p_buf-)-{-  uint32_t limit = (word_offset + word_count);-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(InRange(p_parser, limit));-  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;-  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && InRange(p_parser, limit)) {-    const char* c_str = (const char*)(p_parser->spirv_code + word_offset + word_index);-    uint32_t n = word_count * SPIRV_WORD_SIZE;-    uint32_t length_with_terminator = 0;-    for (uint32_t i = 0; i < n; ++i) {-      char c = *(c_str + i);-      if (c == 0) {-        length_with_terminator = i + 1;-        break;-      }-    }--    if (length_with_terminator > 0) {-      result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-      if (IsNotNull(p_buf_size) && IsNotNull(p_buf)) {-        result = SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;-        if (length_with_terminator <= *p_buf_size) {-          memset(p_buf, 0, *p_buf_size);-          memcpy(p_buf, c_str, length_with_terminator);-          result = SPV_REFLECT_RESULT_SUCCESS;-        }-      }-      else {-        if (IsNotNull(p_buf_size)) {-          *p_buf_size = length_with_terminator;-          result = SPV_REFLECT_RESULT_SUCCESS;-        }-      }-    }-  }-  return result;-}--static SpvReflectDecorationFlags ApplyDecorations(const SpvReflectPrvDecorations* p_decoration_fields)-{-  SpvReflectDecorationFlags decorations = SPV_REFLECT_DECORATION_NONE;-  if (p_decoration_fields->is_relaxed_precision) {-    decorations |= SPV_REFLECT_DECORATION_RELAXED_PRECISION;-  }-  if (p_decoration_fields->is_block) {-    decorations |= SPV_REFLECT_DECORATION_BLOCK;-  }-  if (p_decoration_fields->is_buffer_block) {-    decorations |= SPV_REFLECT_DECORATION_BUFFER_BLOCK;-  }-  if (p_decoration_fields->is_row_major) {-    decorations |= SPV_REFLECT_DECORATION_ROW_MAJOR;-  }-  if (p_decoration_fields->is_column_major) {-    decorations |= SPV_REFLECT_DECORATION_COLUMN_MAJOR;-  }-  if (p_decoration_fields->is_built_in) {-    decorations |= SPV_REFLECT_DECORATION_BUILT_IN;-  }-  if (p_decoration_fields->is_noperspective) {-    decorations |= SPV_REFLECT_DECORATION_NOPERSPECTIVE;-  }-  if (p_decoration_fields->is_flat) {-    decorations |= SPV_REFLECT_DECORATION_FLAT;-  }-  if (p_decoration_fields->is_non_writable) {-    decorations |= SPV_REFLECT_DECORATION_NON_WRITABLE;-  }-  if (p_decoration_fields->is_non_readable) {-    decorations |= SPV_REFLECT_DECORATION_NON_READABLE;-  }-  return decorations;-}--static void ApplyNumericTraits(const SpvReflectTypeDescription* p_type, SpvReflectNumericTraits* p_numeric_traits)-{-  memcpy(p_numeric_traits, &p_type->traits.numeric, sizeof(p_type->traits.numeric));-}--static void ApplyArrayTraits(const SpvReflectTypeDescription* p_type, SpvReflectArrayTraits* p_array_traits)-{-  memcpy(p_array_traits, &p_type->traits.array, sizeof(p_type->traits.array));-}--static SpvReflectPrvNode* FindNode(-  SpvReflectPrvParser* p_parser,-  uint32_t             result_id)-{-  SpvReflectPrvNode* p_node = NULL;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_elem = &(p_parser->nodes[i]);-    if (p_elem->result_id == result_id) {-      p_node = p_elem;-      break;-    }-  }-  return p_node;-}--static SpvReflectTypeDescription* FindType(SpvReflectShaderModule* p_module, uint32_t type_id)-{-  SpvReflectTypeDescription* p_type = NULL;-  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {-    SpvReflectTypeDescription* p_elem = &(p_module->_internal->type_descriptions[i]);-    if (p_elem->id == type_id) {-      p_type = p_elem;-      break;-    }-  }-  return p_type;-}--static SpvReflectResult CreateParser(-  size_t               size, -  void*                p_code, -  SpvReflectPrvParser* p_parser)-{-  if (p_code == NULL) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (size < SPIRV_MINIMUM_FILE_SIZE) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_CODE_SIZE;-  }-  if ((size % 4) != 0) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_CODE_SIZE;-  }--  p_parser->spirv_word_count = size / SPIRV_WORD_SIZE;-  p_parser->spirv_code = (uint32_t*)p_code;--  if (p_parser->spirv_code[0] != SpvMagicNumber) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_MAGIC_NUMBER;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static void DestroyParser(SpvReflectPrvParser* p_parser)-{-  if (!IsNull(p_parser->nodes)) {-    // Free nodes-    for (size_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if (IsNotNull(p_node->member_names)) {-        SafeFree(p_node->member_names);-      }-      if (IsNotNull(p_node->member_decorations)) {-        SafeFree(p_node->member_decorations);-      }-    }--    // Free functions-    for (size_t i = 0; i < p_parser->function_count; ++i) {-      SafeFree(p_parser->functions[i].callees);-      SafeFree(p_parser->functions[i].callee_ptrs);-      SafeFree(p_parser->functions[i].accessed_ptrs);-    }--    // Free access chains-    for (uint32_t i = 0; i < p_parser->access_chain_count; ++i) {-      SafeFree(p_parser->access_chains[i].indexes);-    }--    SafeFree(p_parser->nodes);-    SafeFree(p_parser->strings);-    SafeFree(p_parser->source_embedded);-    SafeFree(p_parser->functions);-    SafeFree(p_parser->access_chains);-    p_parser->node_count = 0;-  }-}--static SpvReflectResult ParseNodes(SpvReflectPrvParser* p_parser)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));--  uint32_t* p_spirv = p_parser->spirv_code;-  uint32_t spirv_word_index = SPIRV_STARTING_WORD_INDEX;--  // Count nodes-  uint32_t node_count = 0;-  while (spirv_word_index < p_parser->spirv_word_count) {-    uint32_t word = p_spirv[spirv_word_index];-    SpvOp op = (SpvOp)(word & 0xFFFF);-    uint32_t node_word_count = (word >> 16) & 0xFFFF;-    if (node_word_count == 0) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_INSTRUCTION;-    }-    if (op == SpvOpAccessChain) {-      ++(p_parser->access_chain_count);-    }-    spirv_word_index += node_word_count;-    ++node_count;-  }--  if (node_count == 0) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;-  }--  // Allocate nodes-  p_parser->node_count = node_count;-  p_parser->nodes = (SpvReflectPrvNode*)calloc(p_parser->node_count, sizeof(*(p_parser->nodes)));-  if (IsNull(p_parser->nodes)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }-  // Mark all nodes with an invalid state-  for (uint32_t i = 0; i < node_count; ++i) {-    p_parser->nodes[i].op = (SpvOp)INVALID_VALUE;-    p_parser->nodes[i].storage_class = (SpvStorageClass)INVALID_VALUE;-    p_parser->nodes[i].decorations.set.value = (uint32_t)INVALID_VALUE;-    p_parser->nodes[i].decorations.binding.value = (uint32_t)INVALID_VALUE;-    p_parser->nodes[i].decorations.location.value = (uint32_t)INVALID_VALUE;-    p_parser->nodes[i].decorations.offset.value = (uint32_t)INVALID_VALUE;-    p_parser->nodes[i].decorations.uav_counter_buffer.value = (uint32_t)INVALID_VALUE;-    p_parser->nodes[i].decorations.built_in = (SpvBuiltIn)INVALID_VALUE;-  }-  // Mark source file id node-  p_parser->source_file_id = (uint32_t)INVALID_VALUE;-  p_parser->source_embedded = NULL;--  // Function node-  uint32_t function_node = (uint32_t)INVALID_VALUE;--  // Allocate access chain-  if (p_parser->access_chain_count > 0) {-    p_parser->access_chains = (SpvReflectPrvAccessChain*)calloc(p_parser->access_chain_count, sizeof(*(p_parser->access_chains)));-    if (IsNull(p_parser->access_chains)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  // Parse nodes-  uint32_t node_index = 0;-  uint32_t access_chain_index = 0;-  spirv_word_index = SPIRV_STARTING_WORD_INDEX;-  while (spirv_word_index < p_parser->spirv_word_count) {-    uint32_t word = p_spirv[spirv_word_index];-    SpvOp op = (SpvOp)(word & 0xFFFF);-    uint32_t node_word_count = (word >> 16) & 0xFFFF;--    SpvReflectPrvNode* p_node = &(p_parser->nodes[node_index]);-    p_node->op = op;-    p_node->word_offset = spirv_word_index;-    p_node->word_count = node_word_count;--    switch (p_node->op) {-      default: break;--      case SpvOpString: {-        ++(p_parser->string_count);-      }-      break;--      case SpvOpSource: {-        CHECKED_READU32_CAST(p_parser, p_node->word_offset + 1, SpvSourceLanguage, p_parser->source_language);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_parser->source_language_version);-        if (p_node->word_count >= 4) {-          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_parser->source_file_id);-        }-        if (p_node->word_count >= 5) {-          const char* p_source = (const char*)(p_parser->spirv_code + p_node->word_offset + 4);--          const size_t source_len = strlen(p_source);-          char* p_source_temp = (char*)calloc(source_len + 1, sizeof(char*));--          if (IsNull(p_source_temp)) {-            return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-          }--      #ifdef _WIN32-          strcpy_s(p_source_temp, source_len + 1, p_source);-      #else-          strcpy(p_source_temp, p_source);-      #endif--          p_parser->source_embedded = p_source_temp;-        }-      }-      break;--      case SpvOpSourceContinued: {-        const char* p_source = (const char*)(p_parser->spirv_code + p_node->word_offset + 1);--        const size_t source_len = strlen(p_source);-        const size_t embedded_source_len = strlen(p_parser->source_embedded); -        char* p_continued_source = (char*)calloc(source_len + embedded_source_len + 1, sizeof(char*));--        if (IsNull(p_continued_source)) {-          return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-        }--    #ifdef _WIN32-        strcpy_s(p_continued_source, embedded_source_len + 1, p_parser->source_embedded);-        strcat_s(p_continued_source, source_len + 1, p_source);-    #else-        strcpy(p_continued_source, p_parser->source_embedded);-        strcat(p_continued_source, p_source);-    #endif--        SafeFree(p_parser->source_embedded);-        p_parser->source_embedded = p_continued_source;-      }-      break;--      case SpvOpEntryPoint: {-        ++(p_parser->entry_point_count);-      }-      break;--      case SpvOpCapability: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->capability);-        ++(p_parser->capability_count);-      }-      break;--      case SpvOpName:-      case SpvOpMemberName:-      {-        uint32_t member_offset = (p_node->op == SpvOpMemberName) ? 1 : 0;-        uint32_t name_start = p_node->word_offset + member_offset + 2;-        p_node->name = (const char*)(p_parser->spirv_code + name_start);-      }-      break;--      case SpvOpTypeStruct:-      {-        p_node->member_count = p_node->word_count - 2;-      } // Fall through-      case SpvOpTypeVoid:-      case SpvOpTypeBool:-      case SpvOpTypeInt:-      case SpvOpTypeFloat:-      case SpvOpTypeVector:-      case SpvOpTypeMatrix:-      case SpvOpTypeSampler:-      case SpvOpTypeOpaque:-      case SpvOpTypeFunction:-      case SpvOpTypeEvent:-      case SpvOpTypeDeviceEvent:-      case SpvOpTypeReserveId:-      case SpvOpTypeQueue:-      case SpvOpTypePipe:-      case SpvOpTypeAccelerationStructureKHR:-      case SpvOpTypeRayQueryKHR:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypeImage: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->image_traits.sampled_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->image_traits.dim);-        CHECKED_READU32(p_parser, p_node->word_offset + 4, p_node->image_traits.depth);-        CHECKED_READU32(p_parser, p_node->word_offset + 5, p_node->image_traits.arrayed);-        CHECKED_READU32(p_parser, p_node->word_offset + 6, p_node->image_traits.ms);-        CHECKED_READU32(p_parser, p_node->word_offset + 7, p_node->image_traits.sampled);-        CHECKED_READU32(p_parser, p_node->word_offset + 8, p_node->image_traits.image_format);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypeSampledImage: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->image_type_id);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypeArray:  {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->array_traits.element_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->array_traits.length_id);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypeRuntimeArray:  {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->array_traits.element_type_id);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypePointer: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->storage_class);-        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->type_id);-        p_node->is_type = true;-      }-      break;--      case SpvOpTypeForwardPointer:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->storage_class);-        p_node->is_type = true;-      }-      break;--      case SpvOpConstantTrue:-      case SpvOpConstantFalse:-      case SpvOpConstant:-      case SpvOpConstantComposite:-      case SpvOpConstantSampler:-      case SpvOpConstantNull: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);-      }-      break;--      case SpvOpSpecConstantTrue:-      case SpvOpSpecConstantFalse:-      case SpvOpSpecConstant:-      case SpvOpSpecConstantComposite:-      case SpvOpSpecConstantOp: {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);-      }-      break;--      case SpvOpVariable:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->storage_class);-      }-      break;--      case SpvOpLoad:-      {-        // Only load enough so OpDecorate can reference the node, skip the remaining operands.-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);-      }-      break;--      case SpvOpAccessChain:-      {-        SpvReflectPrvAccessChain* p_access_chain = &(p_parser->access_chains[access_chain_index]);-        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_access_chain->result_type_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_access_chain->result_id);-        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_access_chain->base_id);-        //-        // SPIRV_ACCESS_CHAIN_INDEX_OFFSET (4) is the number of words up until the first index:-        //   [Node, Result Type Id, Result Id, Base Id, <Indexes>]-        //-        p_access_chain->index_count = (node_word_count - SPIRV_ACCESS_CHAIN_INDEX_OFFSET);-        if (p_access_chain->index_count > 0) {-          p_access_chain->indexes = (uint32_t*)calloc(p_access_chain->index_count, sizeof(*(p_access_chain->indexes)));-          if (IsNull( p_access_chain->indexes)) {-            return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-          }-          // Parse any index values for access chain-          for (uint32_t index_index = 0; index_index < p_access_chain->index_count; ++index_index) {-            // Read index id-            uint32_t index_id = 0;-            CHECKED_READU32(p_parser, p_node->word_offset + SPIRV_ACCESS_CHAIN_INDEX_OFFSET + index_index, index_id);-            // Find OpConstant node that contains index value-            SpvReflectPrvNode* p_index_value_node = FindNode(p_parser, index_id);-            if ((p_index_value_node != NULL) && (p_index_value_node->op == SpvOpConstant)) {-              // Read index value-              uint32_t index_value = UINT32_MAX;-              CHECKED_READU32(p_parser, p_index_value_node->word_offset + 3, index_value);-              assert(index_value != UINT32_MAX);-              // Write index value to array-              p_access_chain->indexes[index_index] = index_value;-            }-          }-        }-        ++access_chain_index;-      }-      break;--      case SpvOpFunction:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);-        // Count function definitions, not function declarations.  To determine-        // the difference, set an in-function variable, and then if an OpLabel-        // is reached before the end of the function increment the function-        // count.-        function_node = node_index;-      }-      break;--      case SpvOpLabel:-      {-        if (function_node != (uint32_t)INVALID_VALUE) {-          SpvReflectPrvNode* p_func_node = &(p_parser->nodes[function_node]);-          CHECKED_READU32(p_parser, p_func_node->word_offset + 2, p_func_node->result_id);-          ++(p_parser->function_count);-        }-      } // Fall through--      case SpvOpFunctionEnd:-      {-        function_node = (uint32_t)INVALID_VALUE;-      }-      break;-    }--    if (p_node->is_type) {-      ++(p_parser->type_count);-    }--    spirv_word_index += node_word_count;-    ++node_index;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseStrings(SpvReflectPrvParser* p_parser)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(IsNotNull(p_parser->nodes));--  // Early out-  if (p_parser->string_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {-    // Allocate string storage-    p_parser->strings = (SpvReflectPrvString*)calloc(p_parser->string_count, sizeof(*(p_parser->strings)));  --    uint32_t string_index = 0;-    for (size_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if (p_node->op != SpvOpString) {-        continue;-      }--      // Paranoid check against string count-      assert(string_index < p_parser->string_count);-      if (string_index >= p_parser->string_count) {-        return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-      }--      // Result id-      SpvReflectPrvString* p_string = &(p_parser->strings[string_index]);-      CHECKED_READU32(p_parser, p_node->word_offset + 1, p_string->result_id);--      // String-      uint32_t string_start = p_node->word_offset + 2;-      p_string->string = (const char*)(p_parser->spirv_code + string_start);--      // Increment string index-      ++string_index;-    }-  }-  -  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseSource(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code)) {-    // Source file-    if (IsNotNull(p_parser->strings)) {-      for (uint32_t i = 0; i < p_parser->string_count; ++i) {-        SpvReflectPrvString* p_string = &(p_parser->strings[i]);-        if (p_string->result_id == p_parser->source_file_id) {-          p_module->source_file = p_string->string;-          break;-        }-      }-    }--    //Source code-    if (IsNotNull(p_parser->source_embedded))-    {-      const size_t source_len = strlen(p_parser->source_embedded);-      char* p_source = (char*)calloc(source_len + 1, sizeof(char*));--      if (IsNull(p_source)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }--    #ifdef _WIN32-      strcpy_s(p_source, source_len + 1, p_parser->source_embedded);-    #else-      strcpy(p_source, p_parser->source_embedded);-    #endif--      p_module->source_source = p_source;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseFunction(-  SpvReflectPrvParser*   p_parser, -  SpvReflectPrvNode*     p_func_node, -  SpvReflectPrvFunction* p_func, -  size_t                 first_label_index)-{-  p_func->id = p_func_node->result_id;--  p_func->callee_count = 0;-  p_func->accessed_ptr_count = 0;--  for (size_t i = first_label_index; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if (p_node->op == SpvOpFunctionEnd) {-      break;-    }-    switch (p_node->op) {-      case SpvOpFunctionCall: {-        ++(p_func->callee_count);-      }-      break;-      case SpvOpLoad:-      case SpvOpAccessChain:-      case SpvOpInBoundsAccessChain:-      case SpvOpPtrAccessChain:-      case SpvOpArrayLength:-      case SpvOpGenericPtrMemSemantics:-      case SpvOpInBoundsPtrAccessChain:-      case SpvOpStore:-      case SpvOpImageTexelPointer:-      {-        ++(p_func->accessed_ptr_count);-      }-      break;-      case SpvOpCopyMemory:-      case SpvOpCopyMemorySized:-      {-        p_func->accessed_ptr_count += 2;-      }-      break;-      default: break;-    }-  }--  if (p_func->callee_count > 0) {-    p_func->callees = (uint32_t*)calloc(p_func->callee_count,-                                        sizeof(*(p_func->callees)));-    if (IsNull(p_func->callees)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  if (p_func->accessed_ptr_count > 0) {-    p_func->accessed_ptrs = (uint32_t*)calloc(p_func->accessed_ptr_count,-                                              sizeof(*(p_func->accessed_ptrs)));-    if (IsNull(p_func->accessed_ptrs)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  p_func->callee_count = 0;-  p_func->accessed_ptr_count = 0;-  for (size_t i = first_label_index; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if (p_node->op == SpvOpFunctionEnd) {-      break;-    }-    switch (p_node->op) {-      case SpvOpFunctionCall: {-        CHECKED_READU32(p_parser, p_node->word_offset + 3,-                        p_func->callees[p_func->callee_count]);-        (++p_func->callee_count);-      }-      break;-      case SpvOpLoad:-      case SpvOpAccessChain:-      case SpvOpInBoundsAccessChain:-      case SpvOpPtrAccessChain:-      case SpvOpArrayLength:-      case SpvOpGenericPtrMemSemantics:-      case SpvOpInBoundsPtrAccessChain:-      case SpvOpImageTexelPointer:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 3,-                        p_func->accessed_ptrs[p_func->accessed_ptr_count]);-        (++p_func->accessed_ptr_count);-      }-      break;-      case SpvOpStore:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 2,-                        p_func->accessed_ptrs[p_func->accessed_ptr_count]);-        (++p_func->accessed_ptr_count);-      }-      break;-      case SpvOpCopyMemory:-      case SpvOpCopyMemorySized:-      {-        CHECKED_READU32(p_parser, p_node->word_offset + 2,-                        p_func->accessed_ptrs[p_func->accessed_ptr_count]);-        (++p_func->accessed_ptr_count);-        CHECKED_READU32(p_parser, p_node->word_offset + 3,-                        p_func->accessed_ptrs[p_func->accessed_ptr_count]);-        (++p_func->accessed_ptr_count);-      }-      break;-      default: break;-    }-  }--  if (p_func->callee_count > 0) {-    qsort(p_func->callees, p_func->callee_count,-          sizeof(*(p_func->callees)), SortCompareUint32);-  }-  p_func->callee_count = (uint32_t)DedupSortedUint32(p_func->callees,-                                                     p_func->callee_count);--  if (p_func->accessed_ptr_count > 0) {-    qsort(p_func->accessed_ptrs, p_func->accessed_ptr_count,-          sizeof(*(p_func->accessed_ptrs)), SortCompareUint32);-  }-  p_func->accessed_ptr_count = (uint32_t)DedupSortedUint32(p_func->accessed_ptrs,-                                                           p_func->accessed_ptr_count);--  return SPV_REFLECT_RESULT_SUCCESS;-}--static int SortCompareFunctions(-  const void* a, -  const void* b)-{-  const SpvReflectPrvFunction* af = (const SpvReflectPrvFunction*)a;-  const SpvReflectPrvFunction* bf = (const SpvReflectPrvFunction*)b;-  return (int)af->id - (int)bf->id;-}--static SpvReflectResult ParseFunctions(SpvReflectPrvParser* p_parser)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(IsNotNull(p_parser->nodes));--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {-    if (p_parser->function_count == 0) {-      return SPV_REFLECT_RESULT_SUCCESS;-    }--    p_parser->functions = (SpvReflectPrvFunction*)calloc(p_parser->function_count,-                                                         sizeof(*(p_parser->functions)));-    if (IsNull(p_parser->functions)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }--    size_t function_index = 0;-    for (size_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if (p_node->op != SpvOpFunction) {-        continue;-      }--      // Skip over function declarations that aren't definitions-      bool func_definition = false;-      // Intentionally reuse i to avoid iterating over these nodes more than-      // once-      for (; i < p_parser->node_count; ++i) {-        if (p_parser->nodes[i].op == SpvOpLabel) {-          func_definition = true;-          break;-        }-        if (p_parser->nodes[i].op == SpvOpFunctionEnd) {-          break;-        }-      }-      if (!func_definition) {-        continue;-      }--      SpvReflectPrvFunction* p_function = &(p_parser->functions[function_index]);--      SpvReflectResult result = ParseFunction(p_parser, p_node, p_function, i);-      if (result != SPV_REFLECT_RESULT_SUCCESS) {-        return result;-      }--      ++function_index;-    }--    qsort(p_parser->functions, p_parser->function_count,-          sizeof(*(p_parser->functions)), SortCompareFunctions);--    // Once they're sorted, link the functions with pointers to improve graph-    // traversal efficiency-    for (size_t i = 0; i < p_parser->function_count; ++i) {-      SpvReflectPrvFunction* p_func = &(p_parser->functions[i]);-      if (p_func->callee_count == 0) {-        continue;-      }-      p_func->callee_ptrs = (SpvReflectPrvFunction**)calloc(p_func->callee_count,-                                                            sizeof(*(p_func->callee_ptrs)));-      for (size_t j = 0, k = 0; j < p_func->callee_count; ++j) {-        while (p_parser->functions[k].id != p_func->callees[j]) {-          ++k;-          if (k >= p_parser->function_count) {-            // Invalid called function ID somewhere-            return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-          }-        }-        p_func->callee_ptrs[j] = &(p_parser->functions[k]);-      }-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseMemberCounts(SpvReflectPrvParser* p_parser)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(IsNotNull(p_parser->nodes));--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {-    for (size_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if ((p_node->op != SpvOpMemberName) && (p_node->op != SpvOpMemberDecorate)) {-        continue;-      }--      uint32_t target_id = 0;-      uint32_t member_index = (uint32_t)INVALID_VALUE;-      CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);-      CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);-      SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);-      // Not all nodes get parsed, so FindNode returning NULL is expected.-      if (IsNull(p_target_node)) {-        continue;-      }--      if (member_index == INVALID_VALUE) {-        return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;-      }--      p_target_node->member_count = Max(p_target_node->member_count, member_index + 1);-    }--    for (uint32_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if (p_node->member_count == 0) {-        continue;-      }--      p_node->member_names = (const char **)calloc(p_node->member_count, sizeof(*(p_node->member_names)));-      if (IsNull(p_node->member_names)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }--      p_node->member_decorations = (SpvReflectPrvDecorations*)calloc(p_node->member_count, sizeof(*(p_node->member_decorations)));-      if (IsNull(p_node->member_decorations)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }-    }-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseNames(SpvReflectPrvParser* p_parser)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->spirv_code));-  assert(IsNotNull(p_parser->nodes));--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {-    for (size_t i = 0; i < p_parser->node_count; ++i) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-      if ((p_node->op != SpvOpName) && (p_node->op != SpvOpMemberName)) {-        continue;-      }--      uint32_t target_id = 0;-      CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);-      SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);-      // Not all nodes get parsed, so FindNode returning NULL is expected.-      if (IsNull(p_target_node)) {-        continue;-      }--      const char** pp_target_name = &(p_target_node->name);-      if (p_node->op == SpvOpMemberName) {-        uint32_t member_index = UINT32_MAX;-        CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);-        pp_target_name = &(p_target_node->member_names[member_index]);-      }--      *pp_target_name = p_node->name;-    }-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDecorations(SpvReflectPrvParser* p_parser)-{-  for (uint32_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);--    if (((uint32_t)p_node->op != (uint32_t)SpvOpDecorate) &&-        ((uint32_t)p_node->op != (uint32_t)SpvOpMemberDecorate) &&-        ((uint32_t)p_node->op != (uint32_t)SpvReflectOpDecorateId) &&-        ((uint32_t)p_node->op != (uint32_t)SpvReflectOpDecorateStringGOOGLE) &&-        ((uint32_t)p_node->op != (uint32_t)SpvReflectOpMemberDecorateStringGOOGLE))-    {-     continue;-    }--    // Need to adjust the read offset if this is a member decoration-    uint32_t member_offset = 0;-    if (p_node->op == SpvOpMemberDecorate) {-      member_offset = 1;-    }--    // Get decoration-    uint32_t decoration = (uint32_t)INVALID_VALUE;-    CHECKED_READU32(p_parser, p_node->word_offset + member_offset + 2, decoration);--    // Filter out the decoration that do not affect reflection, otherwise-    // there will be random crashes because the nodes aren't found.-    bool skip = false;-    switch (decoration) {-      default: {-        skip = true;-      }-      break;-      case SpvDecorationRelaxedPrecision:-      case SpvDecorationBlock:-      case SpvDecorationBufferBlock:-      case SpvDecorationColMajor:-      case SpvDecorationRowMajor:-      case SpvDecorationArrayStride:-      case SpvDecorationMatrixStride:-      case SpvDecorationBuiltIn:-      case SpvDecorationNoPerspective:-      case SpvDecorationFlat:-      case SpvDecorationNonWritable:-      case SpvDecorationNonReadable:-      case SpvDecorationLocation:-      case SpvDecorationBinding:-      case SpvDecorationDescriptorSet:-      case SpvDecorationOffset:-      case SpvDecorationInputAttachmentIndex:-      case SpvReflectDecorationHlslCounterBufferGOOGLE:-      case SpvReflectDecorationHlslSemanticGOOGLE: {-        skip = false;-      }-      break;    -    }-    if (skip) {-      continue;-    }  -    -    // Find target target node -    uint32_t target_id = 0;-    CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);-    SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);-    if (IsNull(p_target_node)) {-      if ((p_node->op == (uint32_t)SpvOpDecorate) && (decoration == SpvDecorationRelaxedPrecision)) {-        // Many OPs can be decorated that we don't care about. Ignore those.-        // See https://github.com/KhronosGroup/SPIRV-Reflect/issues/134-        continue;-      }-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }-    // Get decorations-    SpvReflectPrvDecorations* p_target_decorations = &(p_target_node->decorations);-    // Update pointer if this is a member member decoration-    if (p_node->op == SpvOpMemberDecorate) {-      uint32_t member_index = (uint32_t)INVALID_VALUE;-      CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);-      p_target_decorations = &(p_target_node->member_decorations[member_index]);-    }--    switch (decoration) {-      default: break;--      case SpvDecorationRelaxedPrecision: {-        p_target_decorations->is_relaxed_precision = true;-      }-      break;--      case SpvDecorationBlock: {-        p_target_decorations->is_block = true;-      }-      break;--      case SpvDecorationBufferBlock: {-        p_target_decorations->is_buffer_block = true;-      }-      break;--      case SpvDecorationColMajor: {-        p_target_decorations->is_column_major = true;-      }-      break;--      case SpvDecorationRowMajor: {-        p_target_decorations->is_row_major = true;-      }-      break;--      case SpvDecorationArrayStride: {-        uint32_t word_offset = p_node->word_offset + member_offset + 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->array_stride);-      }-      break;--      case SpvDecorationMatrixStride: {-        uint32_t word_offset = p_node->word_offset + member_offset + 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->matrix_stride);-      }-      break;--      case SpvDecorationBuiltIn: {-        p_target_decorations->is_built_in = true;-        uint32_t word_offset = p_node->word_offset + member_offset + 3;-        CHECKED_READU32_CAST(p_parser, word_offset, SpvBuiltIn, p_target_decorations->built_in);-      }-      break;--      case SpvDecorationNoPerspective: {-        p_target_decorations->is_noperspective = true;-      }-      break;--      case SpvDecorationFlat: {-        p_target_decorations->is_flat = true;-      }-      break;--      case SpvDecorationNonWritable: {-        p_target_decorations->is_non_writable = true;-      }-      break;--      case SpvDecorationNonReadable: {-        p_target_decorations->is_non_readable = true;-      }-      break;--      case SpvDecorationLocation: {-        uint32_t word_offset = p_node->word_offset + member_offset + 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->location.value);-        p_target_decorations->location.word_offset = word_offset;-      }-      break;--      case SpvDecorationBinding: {-        uint32_t word_offset = p_node->word_offset + member_offset+ 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->binding.value);-        p_target_decorations->binding.word_offset = word_offset;-      }-      break;--      case SpvDecorationDescriptorSet: {-        uint32_t word_offset = p_node->word_offset + member_offset+ 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->set.value);-        p_target_decorations->set.word_offset = word_offset;-      }-      break;--      case SpvDecorationOffset: {-        uint32_t word_offset = p_node->word_offset + member_offset+ 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->offset.value);-        p_target_decorations->offset.word_offset = word_offset;-      }-      break;--      case SpvDecorationInputAttachmentIndex: {-        uint32_t word_offset = p_node->word_offset + member_offset+ 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->input_attachment_index.value);-        p_target_decorations->input_attachment_index.word_offset = word_offset;-      }-      break;--      case SpvReflectDecorationHlslCounterBufferGOOGLE: {-        uint32_t word_offset = p_node->word_offset + member_offset+ 3;-        CHECKED_READU32(p_parser, word_offset, p_target_decorations->uav_counter_buffer.value);-        p_target_decorations->uav_counter_buffer.word_offset = word_offset;-      }-      break;--      case SpvReflectDecorationHlslSemanticGOOGLE: {-        uint32_t word_offset = p_node->word_offset + member_offset + 3;-        p_target_decorations->semantic.value = (const char*)(p_parser->spirv_code + word_offset);-        p_target_decorations->semantic.word_offset = word_offset;-      }-      break;-    }-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult EnumerateAllUniforms(-  SpvReflectShaderModule* p_module,-  size_t*                 p_uniform_count, -  uint32_t**              pp_uniforms-)-{-  *p_uniform_count = p_module->descriptor_binding_count;-  if (*p_uniform_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }-  *pp_uniforms = (uint32_t*)calloc(*p_uniform_count, sizeof(**pp_uniforms));--  if (IsNull(*pp_uniforms)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  for (size_t i = 0; i < *p_uniform_count; ++i) {-    (*pp_uniforms)[i] = p_module->descriptor_bindings[i].spirv_id;-  }-  qsort(*pp_uniforms, *p_uniform_count, sizeof(**pp_uniforms),-        SortCompareUint32);-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseType(-  SpvReflectPrvParser*       p_parser, -  SpvReflectPrvNode*         p_node, -  SpvReflectPrvDecorations*  p_struct_member_decorations, -  SpvReflectShaderModule*    p_module, -  SpvReflectTypeDescription* p_type-)-{-  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;--  if (p_node->member_count > 0) {-    p_type->member_count = p_node->member_count;-    p_type->members = (SpvReflectTypeDescription*)calloc(p_type->member_count, sizeof(*(p_type->members)));-    if (IsNotNull(p_type->members)) {-      // Mark all members types with an invalid state-      for (size_t i = 0; i < p_type->members->member_count; ++i) {-        SpvReflectTypeDescription* p_member_type = &(p_type->members[i]);-        p_member_type->id = (uint32_t)INVALID_VALUE;-        p_member_type->op = (SpvOp)INVALID_VALUE;-        p_member_type->storage_class = (SpvStorageClass)INVALID_VALUE;-      }-    }-    else {-      result = SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    // Since the parse descends on type information, these will get overwritten-    // if not guarded against assignment. Only assign if the id is invalid.-    if (p_type->id == INVALID_VALUE) {-      p_type->id = p_node->result_id;-      p_type->op = p_node->op;-      p_type->decoration_flags = 0;-    }-    // Top level types need to pick up decorations from all types below it.-    // Issue and fix here: https://github.com/chaoticbob/SPIRV-Reflect/issues/64-    p_type->decoration_flags = ApplyDecorations(&p_node->decorations);--    switch (p_node->op) {-      default: break;-      case SpvOpTypeVoid:-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_VOID;-        break;--      case SpvOpTypeBool:-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_BOOL;-        break;--      case SpvOpTypeInt: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_INT;-        IF_READU32(result, p_parser, p_node->word_offset + 2, p_type->traits.numeric.scalar.width);-        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.scalar.signedness);-      }-      break;--      case SpvOpTypeFloat: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_FLOAT;-        IF_READU32(result, p_parser, p_node->word_offset + 2, p_type->traits.numeric.scalar.width);-      }-      break;--      case SpvOpTypeVector: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_VECTOR;-        uint32_t component_type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 2, component_type_id);-        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.vector.component_count);-        // Parse component type-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, component_type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-          SPV_REFLECT_ASSERT(false);-        }-      }-      break;--      case SpvOpTypeMatrix: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_MATRIX;-        uint32_t column_type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 2, column_type_id);-        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.matrix.column_count);-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, column_type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-          SPV_REFLECT_ASSERT(false);-        }-        p_type->traits.numeric.matrix.row_count = p_type->traits.numeric.vector.component_count;-        p_type->traits.numeric.matrix.stride = p_node->decorations.matrix_stride;-        // NOTE: Matrix stride is decorated using OpMemberDecoreate - not OpDecoreate.-        if (IsNotNull(p_struct_member_decorations)) {-          p_type->traits.numeric.matrix.stride = p_struct_member_decorations->matrix_stride;-        }-      }-      break;--      case SpvOpTypeImage: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE;-        uint32_t sampled_type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 2, sampled_type_id);-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, sampled_type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-        }-        IF_READU32_CAST(result, p_parser, p_node->word_offset + 3, SpvDim, p_type->traits.image.dim);-        IF_READU32(result, p_parser, p_node->word_offset + 4, p_type->traits.image.depth);-        IF_READU32(result, p_parser, p_node->word_offset + 5, p_type->traits.image.arrayed);-        IF_READU32(result, p_parser, p_node->word_offset + 6, p_type->traits.image.ms);-        IF_READU32(result, p_parser, p_node->word_offset + 7, p_type->traits.image.sampled);-        IF_READU32_CAST(result, p_parser, p_node->word_offset + 8, SpvImageFormat, p_type->traits.image.image_format);-      }-      break;--      case SpvOpTypeSampler: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLER;-      }-      break;--      case SpvOpTypeSampledImage: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE;-        uint32_t image_type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 2, image_type_id);-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, image_type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;          -          SPV_REFLECT_ASSERT(false);-        }-      }-      break;--      case SpvOpTypeArray: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_ARRAY;-        if (result == SPV_REFLECT_RESULT_SUCCESS) {-          uint32_t element_type_id = (uint32_t)INVALID_VALUE;-          uint32_t length_id = (uint32_t)INVALID_VALUE;-          IF_READU32(result, p_parser, p_node->word_offset + 2, element_type_id);-          IF_READU32(result, p_parser, p_node->word_offset + 3, length_id);-          // NOTE: Array stride is decorated using OpDecorate instead of-          //       OpMemberDecorate, even if the array is apart of a struct.-          p_type->traits.array.stride = p_node->decorations.array_stride;-          // Get length for current dimension-          SpvReflectPrvNode* p_length_node = FindNode(p_parser, length_id);-          if (IsNotNull(p_length_node)) {-            uint32_t dim_index = p_type->traits.array.dims_count;-            if (p_length_node->op == SpvOpSpecConstant ||-                p_length_node->op == SpvOpSpecConstantOp) {-              p_type->traits.array.dims[dim_index] = 0xFFFFFFFF;-              p_type->traits.array.spec_constant_op_ids[dim_index] = length_id;-              p_type->traits.array.dims_count += 1;-            } else {-              uint32_t length = 0;-              IF_READU32(result, p_parser, p_length_node->word_offset + 3, length);-              if (result == SPV_REFLECT_RESULT_SUCCESS) {-                // Write the array dim and increment the count and offset-                p_type->traits.array.dims[dim_index] = length;-                p_type->traits.array.spec_constant_op_ids[dim_index] = 0xFFFFFFFF;-                p_type->traits.array.dims_count += 1;-              } else {-                result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-                SPV_REFLECT_ASSERT(false);-              }-            }-            // Parse next dimension or element type-            SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);-            if (IsNotNull(p_next_node)) {-              result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-            }-          }-          else {-            result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-            SPV_REFLECT_ASSERT(false);-          }-        }-      }-      break;--      case SpvOpTypeRuntimeArray: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_ARRAY;-        uint32_t element_type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 2, element_type_id);-        p_type->traits.array.stride = p_node->decorations.array_stride;-        uint32_t dim_index = p_type->traits.array.dims_count;-        p_type->traits.array.dims[dim_index] = 0;-        p_type->traits.array.spec_constant_op_ids[dim_index] = 0;-        p_type->traits.array.dims_count += 1;-        // Parse next dimension or element type-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-          SPV_REFLECT_ASSERT(false);-        }-      }-      break;--      case SpvOpTypeStruct: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_STRUCT;-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_BLOCK;-        uint32_t word_index = 2;-        uint32_t member_index = 0;-        for (; word_index < p_node->word_count; ++word_index, ++member_index) {-          uint32_t member_id = (uint32_t)INVALID_VALUE;-          IF_READU32(result, p_parser, p_node->word_offset + word_index, member_id);-          // Find member node-          SpvReflectPrvNode* p_member_node = FindNode(p_parser, member_id);-          if (IsNull(p_member_node)) {-            result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-            SPV_REFLECT_ASSERT(false);-            break;-          }--          // Member decorations-          SpvReflectPrvDecorations* p_member_decorations = &p_node->member_decorations[member_index];--          assert(member_index < p_type->member_count);-          // Parse member type-          SpvReflectTypeDescription* p_member_type = &(p_type->members[member_index]);-          p_member_type->id = member_id;-          p_member_type->op = p_member_node->op;-          result = ParseType(p_parser, p_member_node, p_member_decorations, p_module, p_member_type);-          if (result != SPV_REFLECT_RESULT_SUCCESS) {-            break;-          }-          // This looks wrong -          //p_member_type->type_name = p_member_node->name;-          p_member_type->struct_member_name = p_node->member_names[member_index];-        }-      }-      break;--      case SpvOpTypeOpaque: break;--      case SpvOpTypePointer: {-        IF_READU32_CAST(result, p_parser, p_node->word_offset + 2, SpvStorageClass, p_type->storage_class);-        uint32_t type_id = (uint32_t)INVALID_VALUE;-        IF_READU32(result, p_parser, p_node->word_offset + 3, type_id);-        // Parse type-        SpvReflectPrvNode* p_next_node = FindNode(p_parser, type_id);-        if (IsNotNull(p_next_node)) {-          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);-        }-        else {-          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-          SPV_REFLECT_ASSERT(false);-        }-      }-      break;--      case SpvOpTypeAccelerationStructureKHR: {-        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE;-      }-      break;-    }--    if (result == SPV_REFLECT_RESULT_SUCCESS) {-      // Names get assigned on the way down. Guard against names-      // get overwritten on the way up.-      if (IsNull(p_type->type_name)) {-        p_type->type_name = p_node->name;-      }-    }-  }--  return result;-}--static SpvReflectResult ParseTypes(-  SpvReflectPrvParser*    p_parser,-  SpvReflectShaderModule* p_module)-{-  if (p_parser->type_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_module->_internal->type_description_count = p_parser->type_count;-  p_module->_internal->type_descriptions = (SpvReflectTypeDescription*)calloc(p_module->_internal->type_description_count,-                                                                              sizeof(*(p_module->_internal->type_descriptions)));-  if (IsNull(p_module->_internal->type_descriptions)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  // Mark all types with an invalid state-  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {-    SpvReflectTypeDescription* p_type = &(p_module->_internal->type_descriptions[i]);-    p_type->id = (uint32_t)INVALID_VALUE;-    p_type->op = (SpvOp)INVALID_VALUE;-    p_type->storage_class = (SpvStorageClass)INVALID_VALUE;-  }--  size_t type_index = 0;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if (! p_node->is_type) {-      continue;-    }--    SpvReflectTypeDescription* p_type = &(p_module->_internal->type_descriptions[type_index]);-    SpvReflectResult result = ParseType(p_parser, p_node, NULL, p_module, p_type);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-    ++type_index;-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseCapabilities(-    SpvReflectPrvParser* p_parser,-    SpvReflectShaderModule* p_module)-{-  if (p_parser->capability_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_module->capability_count = p_parser->capability_count;-  p_module->capabilities = (SpvReflectCapability*)calloc(p_module->capability_count,-                                                         sizeof(*(p_module->capabilities)));-  if (IsNull(p_module->capabilities)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  // Mark all types with an invalid state-  for (size_t i = 0; i < p_module->capability_count; ++i) {-    SpvReflectCapability* p_cap = &(p_module->capabilities[i]);-    p_cap->value = SpvCapabilityMax;-    p_cap->word_offset = (uint32_t)INVALID_VALUE;-  }--  size_t capability_index = 0;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if (SpvOpCapability != p_node->op) {-      continue;-    }--    SpvReflectCapability* p_cap = &(p_module->capabilities[capability_index]);-    p_cap->value = p_node->capability;-    p_cap->word_offset = p_node->word_offset + 1;-    ++capability_index;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static int SortCompareDescriptorBinding(const void* a, const void* b)-{-  const SpvReflectDescriptorBinding* p_elem_a = (const SpvReflectDescriptorBinding*)a;-  const SpvReflectDescriptorBinding* p_elem_b = (const SpvReflectDescriptorBinding*)b;-  int value = (int)(p_elem_a->binding) - (int)(p_elem_b->binding);-  if (value == 0) {-    // use spirv-id as a tiebreaker to ensure a stable ordering, as they're guaranteed-    // unique.-    assert(p_elem_a->spirv_id != p_elem_b->spirv_id);-    value = (int)(p_elem_a->spirv_id) - (int)(p_elem_b->spirv_id);-  }-  return value;-}--static SpvReflectResult ParseDescriptorBindings(-  SpvReflectPrvParser*    p_parser,-  SpvReflectShaderModule* p_module)-{-  p_module->descriptor_binding_count = 0;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if ((p_node->op != SpvOpVariable) ||-        ((p_node->storage_class != SpvStorageClassUniform) &&-         (p_node->storage_class != SpvStorageClassStorageBuffer) &&-         (p_node->storage_class != SpvStorageClassUniformConstant)))-    {-      continue;-    }-    if ((p_node->decorations.set.value == INVALID_VALUE) || (p_node->decorations.binding.value == INVALID_VALUE)) {-      continue;-    }--    p_module->descriptor_binding_count += 1;-  }--  if (p_module->descriptor_binding_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_module->descriptor_bindings = (SpvReflectDescriptorBinding*)calloc(p_module->descriptor_binding_count, sizeof(*(p_module->descriptor_bindings)));-  if (IsNull(p_module->descriptor_bindings)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  // Mark all types with an invalid state-  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);-    p_descriptor->binding = (uint32_t)INVALID_VALUE;-    p_descriptor->input_attachment_index = (uint32_t)INVALID_VALUE;-    p_descriptor->set = (uint32_t)INVALID_VALUE;-    p_descriptor->descriptor_type = (SpvReflectDescriptorType)INVALID_VALUE;-    p_descriptor->uav_counter_id = (uint32_t)INVALID_VALUE;-  }--  size_t descriptor_index = 0;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if ((p_node->op != SpvOpVariable) ||-        ((p_node->storage_class != SpvStorageClassUniform) &&-         (p_node->storage_class != SpvStorageClassStorageBuffer) &&-         (p_node->storage_class != SpvStorageClassUniformConstant)))-    {-      continue;-    }-    if ((p_node->decorations.set.value == INVALID_VALUE) || (p_node->decorations.binding.value == INVALID_VALUE)) {-      continue;-    }--    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);-    if (IsNull(p_type)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }-    // If the type is a pointer, resolve it. We need to retain the storage class-    // from the pointer so that we can use it to deduce deescriptor types.-    SpvStorageClass pointer_storage_class = SpvStorageClassMax;-    if (p_type->op == SpvOpTypePointer) {-      pointer_storage_class = p_type->storage_class;-      // Find the type's node-      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-      if (IsNull(p_type_node)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-      // Should be the resolved type-      p_type = FindType(p_module, p_type_node->type_id);-      if (IsNull(p_type)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-    }--    SpvReflectDescriptorBinding* p_descriptor = &p_module->descriptor_bindings[descriptor_index];-    p_descriptor->spirv_id = p_node->result_id;-    p_descriptor->name = p_node->name;-    p_descriptor->binding = p_node->decorations.binding.value;-    p_descriptor->input_attachment_index = p_node->decorations.input_attachment_index.value;-    p_descriptor->set = p_node->decorations.set.value;-    p_descriptor->count = 1;-    p_descriptor->uav_counter_id = p_node->decorations.uav_counter_buffer.value;-    p_descriptor->type_description = p_type;-    p_descriptor->decoration_flags = ApplyDecorations(&p_node->decorations);--    // If this is in the StorageBuffer storage class, it's for sure a storage-    // buffer descriptor. We need to handle this case earlier because in SPIR-V-    // there are two ways to indicate a storage buffer:-    // 1) Uniform storage class + BufferBlock decoration, or-    // 2) StorageBuffer storage class + Buffer decoration.-    // The 1) way is deprecated since SPIR-V v1.3. But the Buffer decoration is-    // also used together with Uniform storage class to mean uniform buffer..-    // We'll handle the pre-v1.3 cases in ParseDescriptorType().-    if (pointer_storage_class == SpvStorageClassStorageBuffer) {-      p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER;-    }--    // Copy image traits-    if ((p_type->type_flags & SPV_REFLECT_TYPE_FLAG_EXTERNAL_MASK) == SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE) {-      memcpy(&p_descriptor->image, &p_type->traits.image, sizeof(p_descriptor->image));-    }--    // This is a workaround for: https://github.com/KhronosGroup/glslang/issues/1096-    {-      const uint32_t resource_mask = SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE | SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE;-      if ((p_type->type_flags & resource_mask) == resource_mask) {-        memcpy(&p_descriptor->image, &p_type->traits.image, sizeof(p_descriptor->image));-      }-    }--    // Copy array traits-    if (p_type->traits.array.dims_count > 0) {-      p_descriptor->array.dims_count = p_type->traits.array.dims_count;-      for (uint32_t dim_index = 0; dim_index < p_type->traits.array.dims_count; ++dim_index) {-        uint32_t dim_value = p_type->traits.array.dims[dim_index];-        p_descriptor->array.dims[dim_index] = dim_value;-        p_descriptor->count *= dim_value;-      }-    }--    // Count---    p_descriptor->word_offset.binding = p_node->decorations.binding.word_offset;-    p_descriptor->word_offset.set = p_node->decorations.set.word_offset;--    ++descriptor_index;-  }--  if (p_module->descriptor_binding_count > 0) {-    qsort(p_module->descriptor_bindings,-          p_module->descriptor_binding_count,-          sizeof(*(p_module->descriptor_bindings)),-          SortCompareDescriptorBinding);-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDescriptorType(SpvReflectShaderModule* p_module)-{-  if (p_module->descriptor_binding_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);-    SpvReflectTypeDescription* p_type = p_descriptor->type_description;--    if ((int)p_descriptor->descriptor_type == (int)INVALID_VALUE) {-      switch (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_EXTERNAL_MASK) {-        default: assert(false && "unknown type flag"); break;--        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE: {-          if (p_descriptor->image.dim == SpvDimBuffer) {-            switch (p_descriptor->image.sampled) {-              default: assert(false && "unknown texel buffer sampled value"); break;-              case IMAGE_SAMPLED: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; break;-              case IMAGE_STORAGE: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; break;-            }-          }-          else if(p_descriptor->image.dim == SpvDimSubpassData) {-            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;-          }-          else {-            switch (p_descriptor->image.sampled) {-              default: assert(false && "unknown image sampled value"); break;-              case IMAGE_SAMPLED: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE; break;-              case IMAGE_STORAGE: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE; break;-            }-          }-        }-        break;--        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLER: {-          p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER;-        }-        break;--        case (SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE | SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE): {-          // This is a workaround for: https://github.com/KhronosGroup/glslang/issues/1096-          if (p_descriptor->image.dim == SpvDimBuffer) {-            switch (p_descriptor->image.sampled) {-              default: assert(false && "unknown texel buffer sampled value"); break;-              case IMAGE_SAMPLED: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; break;-              case IMAGE_STORAGE: p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; break;-            }-          }-          else {-            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;-          }-        }-        break;--        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_BLOCK: {-          if (p_type->decoration_flags & SPV_REFLECT_DECORATION_BLOCK) {-            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER;-          }-          else if (p_type->decoration_flags & SPV_REFLECT_DECORATION_BUFFER_BLOCK) {-            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER;-          }-          else {-            assert(false && "unknown struct");-          }-        }-        break;--        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE: {-          p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;-        }-        break;-      }-    }--    switch (p_descriptor->descriptor_type) {-      case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER                    : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SAMPLER; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER     : p_descriptor->resource_type = (SpvReflectResourceType)(SPV_REFLECT_RESOURCE_FLAG_SAMPLER | SPV_REFLECT_RESOURCE_FLAG_SRV); break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE              : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE              : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER       : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER       : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER             : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_CBV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC     : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_CBV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER             : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC     : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV; break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT           : break;-      case SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR : p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV; break;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseUAVCounterBindings(SpvReflectShaderModule* p_module)-{-  char name[MAX_NODE_NAME_LENGTH];-  const char* k_count_tag = "@count";--  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);--    if (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {-      continue;-    }--    SpvReflectDescriptorBinding* p_counter_descriptor = NULL;-    // Use UAV counter buffer id if present...-    if (p_descriptor->uav_counter_id != UINT32_MAX) {-      for (uint32_t counter_descriptor_index = 0; counter_descriptor_index < p_module->descriptor_binding_count; ++counter_descriptor_index) {-        SpvReflectDescriptorBinding* p_test_counter_descriptor = &(p_module->descriptor_bindings[counter_descriptor_index]);-        if (p_test_counter_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {-          continue;-        }-        if (p_descriptor->uav_counter_id == p_test_counter_descriptor->spirv_id) {-          p_counter_descriptor = p_test_counter_descriptor;-          break;-        }-      }-    }-    // ...otherwise use old @count convention.-    else {-      const size_t descriptor_name_length = p_descriptor->name? strlen(p_descriptor->name): 0;--      memset(name, 0, MAX_NODE_NAME_LENGTH);    -      memcpy(name, p_descriptor->name, descriptor_name_length);-#if defined(_WIN32)-      strcat_s(name, MAX_NODE_NAME_LENGTH, k_count_tag);-#else-      strcat(name, k_count_tag);-#endif--      for (uint32_t counter_descriptor_index = 0; counter_descriptor_index < p_module->descriptor_binding_count; ++counter_descriptor_index) {-        SpvReflectDescriptorBinding* p_test_counter_descriptor = &(p_module->descriptor_bindings[counter_descriptor_index]);-        if (p_test_counter_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {-          continue;-        }-        if (p_test_counter_descriptor->name && strcmp(name, p_test_counter_descriptor->name) == 0) {-          p_counter_descriptor = p_test_counter_descriptor;-          break;-        }-      }-    }--    if (p_counter_descriptor != NULL) {-      p_descriptor->uav_counter_binding = p_counter_descriptor;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDescriptorBlockVariable(-  SpvReflectPrvParser*        p_parser, -  SpvReflectShaderModule*     p_module, -  SpvReflectTypeDescription*  p_type, -  SpvReflectBlockVariable*    p_var-)-{-  bool has_non_writable = false;--  if (IsNotNull(p_type->members) && (p_type->member_count > 0)) {-    p_var->member_count = p_type->member_count;-    p_var->members = (SpvReflectBlockVariable*)calloc(p_var->member_count, sizeof(*p_var->members));-    if (IsNull(p_var->members)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }--    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-    if (IsNull(p_type_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }-    // Resolve to element type if current type is array or run time array-    while (p_type_node->op == SpvOpTypeArray || p_type_node->op == SpvOpTypeRuntimeArray) {-      if (p_type_node->op == SpvOpTypeArray) {-        p_type_node = FindNode(p_parser, p_type_node->array_traits.element_type_id);-      }-      else {-        // Element type description-        SpvReflectTypeDescription* p_type_temp = FindType(p_module, p_type_node->array_traits.element_type_id);-        if (IsNull(p_type_temp)) {-          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-        }-        // Element type node-        p_type_node = FindNode(p_parser, p_type_temp->id);-      }-      if (IsNull(p_type_node)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-    }-    -    // Parse members-    for (uint32_t member_index = 0; member_index < p_type->member_count; ++member_index) {-      SpvReflectTypeDescription* p_member_type = &p_type->members[member_index];-      SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];-      bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;-      if (is_struct) {-        SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_member_type, p_member_var);-        if (result != SPV_REFLECT_RESULT_SUCCESS) {-          return result;-        }-      }--      p_member_var->name = p_type_node->member_names[member_index];-      p_member_var->offset = p_type_node->member_decorations[member_index].offset.value;-      p_member_var->decoration_flags = ApplyDecorations(&p_type_node->member_decorations[member_index]);-      p_member_var->flags |= SPV_REFLECT_VARIABLE_FLAGS_UNUSED;-      if (!has_non_writable && (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE)) {-        has_non_writable = true;-      }-      ApplyNumericTraits(p_member_type, &p_member_var->numeric);-      if (p_member_type->op == SpvOpTypeArray) {-        ApplyArrayTraits(p_member_type, &p_member_var->array);-      }--      p_member_var->type_description = p_member_type;-    }-  }--  p_var->name = p_type->type_name;-  p_var->type_description = p_type;-  if (has_non_writable) {-    p_var->decoration_flags |= SPV_REFLECT_DECORATION_NON_WRITABLE;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDescriptorBlockVariableSizes(-  SpvReflectPrvParser*     p_parser, -  SpvReflectShaderModule*  p_module, -  bool                     is_parent_root, -  bool                     is_parent_aos, -  bool                     is_parent_rta, -  SpvReflectBlockVariable* p_var-)-{-  if (p_var->member_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  // Absolute offsets-  for (uint32_t member_index = 0; member_index < p_var->member_count; ++member_index) {-    SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];-    if (is_parent_root) {-      p_member_var->absolute_offset = p_member_var->offset;-    }-    else {-      p_member_var->absolute_offset = is_parent_aos ? 0 : p_member_var->offset + p_var->absolute_offset;-    }-  }--  // Size-  for (uint32_t member_index = 0; member_index < p_var->member_count; ++member_index) {-    SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];-    SpvReflectTypeDescription* p_member_type = p_member_var->type_description;--    switch (p_member_type->op) {-      case SpvOpTypeBool: {-        p_member_var->size = SPIRV_WORD_SIZE;-      }-      break;--      case SpvOpTypeInt:-      case SpvOpTypeFloat: {-        p_member_var->size = p_member_type->traits.numeric.scalar.width / SPIRV_BYTE_WIDTH;-      }-      break;--      case SpvOpTypeVector: {-        uint32_t size = p_member_type->traits.numeric.vector.component_count *-                        (p_member_type->traits.numeric.scalar.width / SPIRV_BYTE_WIDTH);-        p_member_var->size = size;-      }-      break;--      case SpvOpTypeMatrix: {-        if (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_COLUMN_MAJOR) {-          p_member_var->size = p_member_var->numeric.matrix.column_count * p_member_var->numeric.matrix.stride;-        }-        else if (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_ROW_MAJOR) {-          p_member_var->size = p_member_var->numeric.matrix.row_count * p_member_var->numeric.matrix.stride;-        }-      }-      break;--      case SpvOpTypeArray: {-        // If array of structs, parse members first...-        bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;-        if (is_struct) {-          SpvReflectResult result = ParseDescriptorBlockVariableSizes(p_parser, p_module, false, true, is_parent_rta, p_member_var);-          if (result != SPV_REFLECT_RESULT_SUCCESS) {-            return result;-          }-        }-        // ...then array-        uint32_t element_count = (p_member_var->array.dims_count > 0 ? 1 : 0);-        for (uint32_t i = 0; i < p_member_var->array.dims_count; ++i) {-          element_count *= p_member_var->array.dims[i];-        }-        p_member_var->size = element_count * p_member_var->array.stride;-      }-      break;--      case SpvOpTypeRuntimeArray: {-        bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;-        if (is_struct) {-          SpvReflectResult result = ParseDescriptorBlockVariableSizes(p_parser, p_module, false, true, true, p_member_var);-          if (result != SPV_REFLECT_RESULT_SUCCESS) {-            return result;-          }-        }-      }-      break;--      case SpvOpTypeStruct: {-        SpvReflectResult result = ParseDescriptorBlockVariableSizes(p_parser, p_module, false, is_parent_aos, is_parent_rta, p_member_var);-        if (result != SPV_REFLECT_RESULT_SUCCESS) {-          return result;-        }-      }-      break;--      default:-        break;-    }-  }--  // Parse padded size using offset difference for all member except for the last entry...-  for (uint32_t member_index = 0; member_index < (p_var->member_count - 1); ++member_index) {-    SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];-    SpvReflectBlockVariable* p_next_member_var = &p_var->members[member_index + 1];-    p_member_var->padded_size = p_next_member_var->offset - p_member_var->offset;-    if (p_member_var->size > p_member_var->padded_size) {-      p_member_var->size = p_member_var->padded_size;-    }-    if (is_parent_rta) {-      p_member_var->padded_size = p_member_var->size;-    }-  }-  // ...last entry just gets rounded up to near multiple of SPIRV_DATA_ALIGNMENT, which is 16 and-  // subtract the offset.-  if (p_var->member_count > 0) {-    SpvReflectBlockVariable* p_member_var = &p_var->members[p_var->member_count - 1];-    p_member_var->padded_size = RoundUp(p_member_var->offset  + p_member_var->size, SPIRV_DATA_ALIGNMENT) - p_member_var->offset;-    if (p_member_var->size > p_member_var->padded_size) {-      p_member_var->size = p_member_var->padded_size;-    }-    if (is_parent_rta) {-      p_member_var->padded_size = p_member_var->size;-    }-  }--  // @TODO validate this with assertion-  p_var->size = p_var->members[p_var->member_count - 1].offset +-                p_var->members[p_var->member_count - 1].padded_size;-  p_var->padded_size = p_var->size;--  return SPV_REFLECT_RESULT_SUCCESS;-}--static void MarkSelfAndAllMemberVarsAsUsed(SpvReflectBlockVariable* p_var)-{-  // Clear the current variable's USED flag-  p_var->flags &= ~SPV_REFLECT_VARIABLE_FLAGS_UNUSED;--  SpvOp op_type = p_var->type_description->op;-  switch (op_type) {-    default: break;--    case SpvOpTypeArray: {-    }-    break;--    case SpvOpTypeStruct: {-      for (uint32_t i = 0; i < p_var->member_count; ++i) {-        SpvReflectBlockVariable* p_member_var = &p_var->members[i];-        MarkSelfAndAllMemberVarsAsUsed(p_member_var);-      }-    }-    break;-  }-}--static SpvReflectResult ParseDescriptorBlockVariableUsage(-  SpvReflectPrvParser*      p_parser,-  SpvReflectShaderModule*   p_module,-  SpvReflectPrvAccessChain* p_access_chain,-  uint32_t                  index_index,-  SpvOp                     override_op_type,-  SpvReflectBlockVariable*  p_var-)-{-  (void)p_parser;-  (void)p_access_chain;-  (void)p_var;--  // Clear the current variable's UNUSED flag-  p_var->flags &= ~SPV_REFLECT_VARIABLE_FLAGS_UNUSED;-  -  // Parsing arrays requires overriding the op type for-  // for the lowest dim's element type.-  SpvOp op_type = p_var->type_description->op;-  if (override_op_type != (SpvOp)INVALID_VALUE) {-    op_type = override_op_type;-  }--  switch (op_type) {-    default: break;--    case SpvOpTypeArray: {-      // Parse through array's type hierarchy to find the actual/non-array element type-      SpvReflectTypeDescription* p_type = p_var->type_description;-      while ((p_type->op == SpvOpTypeArray) && (index_index < p_access_chain->index_count)) {-        // Find the array element type id-        SpvReflectPrvNode* p_node = FindNode(p_parser, p_type->id);-        if (p_node == NULL) {-          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-        }-        uint32_t element_type_id = p_node->array_traits.element_type_id;-        // Get the array element type-        p_type = FindType(p_module, element_type_id);-        if (p_type == NULL) {-          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-        }-        // Next access chain index-        index_index += 1;-      }-      -      // Only continue parsing if there's remaining indices in the access-      // chain. If the end of the access chain has been reach then all-      // remaining variables (including those in struct hierarchies)-      // are considered USED.-      //-      // See: https://github.com/KhronosGroup/SPIRV-Reflect/issues/78-      //  -      if (index_index < p_access_chain->index_count) {-        // Parse current var again with a type override and advanced index index-        SpvReflectResult result = ParseDescriptorBlockVariableUsage(-          p_parser,-          p_module,-          p_access_chain,-          index_index,-          p_type->op,-          p_var);-        if (result != SPV_REFLECT_RESULT_SUCCESS) {-          return result;-        }-      }-      else {-        // Clear UNUSED flag for remaining variables-        MarkSelfAndAllMemberVarsAsUsed(p_var);-      }-    }-    break;--    case SpvOpTypeStruct: {-      assert(p_var->member_count > 0);-      if (p_var->member_count == 0) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_BLOCK_DATA;-      }-      // Get member variable at the access's chain current index-      uint32_t index = p_access_chain->indexes[index_index];-      if (index >= p_var->member_count) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_BLOCK_MEMBER_REFERENCE;-      }-      SpvReflectBlockVariable* p_member_var = &p_var->members[index];--      // Next access chain index-      index_index += 1;--      // Only continue parsing if there's remaining indices in the access-      // chain. If the end of the access chain has been reach then all-      // remaining variables (including those in struct hierarchies)-      // are considered USED.-      //-      // See: https://github.com/KhronosGroup/SPIRV-Reflect/issues/78-      //-      if (index_index < p_access_chain->index_count) {-         SpvReflectResult result = ParseDescriptorBlockVariableUsage(-           p_parser,-           p_module,-           p_access_chain,-           index_index,-           (SpvOp)INVALID_VALUE,-           p_member_var);-         if (result != SPV_REFLECT_RESULT_SUCCESS) {-           return result;-         }-      }-      else {-        // Clear UNUSED flag for remaining variables-        MarkSelfAndAllMemberVarsAsUsed(p_member_var);-      }-      //SpvReflectBlockVariable* p_member_var = &p_var->members[index];-      //if (index_index < p_access_chain->index_count) {-      //  SpvReflectResult result = ParseDescriptorBlockVariableUsage(-      //    p_parser,-      //    p_module,-      //    p_access_chain,-      //    index_index + 1,-      //    (SpvOp)INVALID_VALUE,-      //    p_member_var);-      //  if (result != SPV_REFLECT_RESULT_SUCCESS) {-      //    return result;-      //  }-      //}-    }-    break;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDescriptorBlocks(-  SpvReflectPrvParser*    p_parser, -  SpvReflectShaderModule* p_module)-{-  if (p_module->descriptor_binding_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);-    SpvReflectTypeDescription* p_type = p_descriptor->type_description;-    if ((p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER) &&-        (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) )-    {-      continue;-    }--    // Mark UNUSED-    p_descriptor->block.flags |= SPV_REFLECT_VARIABLE_FLAGS_UNUSED;-    // Parse descriptor block -    SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_type, &p_descriptor->block);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }--    for (uint32_t access_chain_index = 0; access_chain_index < p_parser->access_chain_count; ++access_chain_index) {-      SpvReflectPrvAccessChain* p_access_chain = &(p_parser->access_chains[access_chain_index]);-      // Skip any access chains that aren't touching this descriptor block-      if (p_descriptor->spirv_id != p_access_chain->base_id) {-        continue;-      }-      result = ParseDescriptorBlockVariableUsage(-        p_parser,-        p_module,-        p_access_chain,-        0,-        (SpvOp)INVALID_VALUE,-        &p_descriptor->block);-      if (result != SPV_REFLECT_RESULT_SUCCESS) {-        return result;-      }-    }-    -    p_descriptor->block.name = p_descriptor->name;--    bool is_parent_rta = (p_descriptor->descriptor_type == SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER);-    result = ParseDescriptorBlockVariableSizes(p_parser, p_module, true, false, is_parent_rta, &p_descriptor->block);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }--    if (is_parent_rta) {-      p_descriptor->block.size = 0;-      p_descriptor->block.padded_size = 0;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseFormat(-  const SpvReflectTypeDescription*  p_type,-  SpvReflectFormat*                 p_format-)-{-  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_INTERNAL_ERROR;-  bool signedness = (p_type->traits.numeric.scalar.signedness != 0);-  uint32_t bit_width = p_type->traits.numeric.scalar.width;-  if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_VECTOR) {-    uint32_t component_count = p_type->traits.numeric.vector.component_count;-    if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_FLOAT) {-      switch (bit_width) {-        case 32: {-          switch (component_count) {-            case 2: *p_format = SPV_REFLECT_FORMAT_R32G32_SFLOAT; break;-            case 3: *p_format = SPV_REFLECT_FORMAT_R32G32B32_SFLOAT; break;-            case 4: *p_format = SPV_REFLECT_FORMAT_R32G32B32A32_SFLOAT; break;-          }-        }-        break;-        -        case 64: {-          switch (component_count) {-            case 2: *p_format = SPV_REFLECT_FORMAT_R64G64_SFLOAT; break;-            case 3: *p_format = SPV_REFLECT_FORMAT_R64G64B64_SFLOAT; break;-            case 4: *p_format = SPV_REFLECT_FORMAT_R64G64B64A64_SFLOAT; break;-          }-        }-      }-      result = SPV_REFLECT_RESULT_SUCCESS;-    }-    else if (p_type->type_flags & (SPV_REFLECT_TYPE_FLAG_INT | SPV_REFLECT_TYPE_FLAG_BOOL)) {-      switch (bit_width) {-        case 32: {-          switch (component_count) {-            case 2: *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32_SINT : SPV_REFLECT_FORMAT_R32G32_UINT; break;-            case 3: *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32B32_SINT : SPV_REFLECT_FORMAT_R32G32B32_UINT; break;-            case 4: *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32B32A32_SINT : SPV_REFLECT_FORMAT_R32G32B32A32_UINT; break;-          }-        }-        break;-        -        case 64: {-          switch (component_count) {-            case 2: *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64_SINT : SPV_REFLECT_FORMAT_R64G64_UINT; break;-            case 3: *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64B64_SINT : SPV_REFLECT_FORMAT_R64G64B64_UINT; break;-            case 4: *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64B64A64_SINT : SPV_REFLECT_FORMAT_R64G64B64A64_UINT; break;-          }-        }-      }-      result = SPV_REFLECT_RESULT_SUCCESS;-    }-  }-  else if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_FLOAT) {-    switch(bit_width) {-      case 32:-        *p_format = SPV_REFLECT_FORMAT_R32_SFLOAT;-        break;-      case 64:-        *p_format = SPV_REFLECT_FORMAT_R64_SFLOAT;-        break;-    }-    result = SPV_REFLECT_RESULT_SUCCESS;-  }-  else if (p_type->type_flags & (SPV_REFLECT_TYPE_FLAG_INT | SPV_REFLECT_TYPE_FLAG_BOOL)) {-    switch(bit_width) {-      case 32:-        *p_format = signedness ? SPV_REFLECT_FORMAT_R32_SINT : SPV_REFLECT_FORMAT_R32_UINT; break;-        break;-      case 64:-        *p_format = signedness ? SPV_REFLECT_FORMAT_R64_SINT : SPV_REFLECT_FORMAT_R64_UINT; break;-    }        -    result = SPV_REFLECT_RESULT_SUCCESS;-  }-  else if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) {-    *p_format = SPV_REFLECT_FORMAT_UNDEFINED;-    result = SPV_REFLECT_RESULT_SUCCESS;-  }-  return result;-}--static SpvReflectResult ParseInterfaceVariable(-  SpvReflectPrvParser*            p_parser,-  const SpvReflectPrvDecorations* p_var_node_decorations,-  const SpvReflectPrvDecorations* p_type_node_decorations,-  SpvReflectShaderModule*         p_module,-  SpvReflectTypeDescription*      p_type,-  SpvReflectInterfaceVariable*    p_var,-  bool*                           p_has_built_in-)-{-  SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-  if (IsNull(p_type_node)) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-  }--  if (p_type->member_count > 0) {-    p_var->member_count = p_type->member_count;-    p_var->members = (SpvReflectInterfaceVariable*)calloc(p_var->member_count, sizeof(*p_var->members));-    if (IsNull(p_var->members)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }--    for (uint32_t member_index = 0; member_index < p_type_node->member_count; ++member_index) {-      SpvReflectPrvDecorations* p_member_decorations = &p_type_node->member_decorations[member_index];-      SpvReflectTypeDescription* p_member_type = &p_type->members[member_index];-      SpvReflectInterfaceVariable* p_member_var = &p_var->members[member_index];-      SpvReflectResult result = ParseInterfaceVariable(p_parser, NULL, p_member_decorations, p_module, p_member_type, p_member_var, p_has_built_in);-      if (result != SPV_REFLECT_RESULT_SUCCESS) {-        SPV_REFLECT_ASSERT(false);-        return result;-      }-    }-  }--  p_var->name = p_type_node->name;-  p_var->decoration_flags = ApplyDecorations(p_type_node_decorations);-  if (p_var_node_decorations != NULL) {-    p_var->decoration_flags |= ApplyDecorations(p_var_node_decorations);-  }-  p_var->built_in = p_type_node_decorations->built_in;-  ApplyNumericTraits(p_type, &p_var->numeric);-  if (p_type->op == SpvOpTypeArray) {-    ApplyArrayTraits(p_type, &p_var->array);-  }--  p_var->type_description = p_type;--  *p_has_built_in |= p_type_node_decorations->is_built_in;--  // Only parse format for interface variables that are input or output-  if ((p_var->storage_class == SpvStorageClassInput) || (p_var->storage_class == SpvStorageClassOutput)) {-    SpvReflectResult result = ParseFormat(p_var->type_description, &p_var->format);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      SPV_REFLECT_ASSERT(false);-      return result;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseInterfaceVariables(-  SpvReflectPrvParser*    p_parser,-  SpvReflectShaderModule* p_module,-  SpvReflectEntryPoint*   p_entry,-  uint32_t                interface_variable_count,-  uint32_t*               p_interface_variable_ids-)-{-  if (interface_variable_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_entry->interface_variable_count = interface_variable_count;-  p_entry->input_variable_count = 0;-  p_entry->output_variable_count = 0;  -  for (size_t i = 0; i < interface_variable_count; ++i) {-    uint32_t var_result_id = *(p_interface_variable_ids + i);-    SpvReflectPrvNode* p_node = FindNode(p_parser, var_result_id);-    if (IsNull(p_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }- -    if (p_node->storage_class == SpvStorageClassInput) {-      p_entry->input_variable_count += 1;-    }-    else if (p_node->storage_class == SpvStorageClassOutput) {-      p_entry->output_variable_count += 1;-    }- }- - if (p_entry->input_variable_count > 0) {-   p_entry->input_variables = (SpvReflectInterfaceVariable**)calloc(p_entry->input_variable_count, sizeof(*(p_entry->input_variables)));-   if (IsNull(p_entry->input_variables)) {-     return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-   }- }- - if (p_entry->output_variable_count > 0) {-   p_entry->output_variables = (SpvReflectInterfaceVariable**)calloc(p_entry->output_variable_count, sizeof(*(p_entry->output_variables)));-   if (IsNull(p_entry->output_variables)) {-     return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-   }- }--  if (p_entry->interface_variable_count > 0) {-    p_entry->interface_variables = (SpvReflectInterfaceVariable*)calloc(p_entry->interface_variable_count, sizeof(*(p_entry->interface_variables)));-    if (IsNull(p_entry->interface_variables)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  size_t input_index = 0;-  size_t output_index = 0;-  for (size_t i = 0; i < interface_variable_count; ++i) {-    uint32_t var_result_id = *(p_interface_variable_ids + i);-    SpvReflectPrvNode* p_node = FindNode(p_parser, var_result_id);-    if (IsNull(p_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }--    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);-    if (IsNull(p_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }-    // If the type is a pointer, resolve it-    if (p_type->op == SpvOpTypePointer) {-      // Find the type's node-      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-      if (IsNull(p_type_node)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-      // Should be the resolved type-      p_type = FindType(p_module, p_type_node->type_id);-      if (IsNull(p_type)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-    }--    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-    if (IsNull(p_type_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }--    SpvReflectInterfaceVariable* p_var = &(p_entry->interface_variables[i]);-    p_var->storage_class  = p_node->storage_class;--    bool has_built_in = p_node->decorations.is_built_in;-    SpvReflectResult result = ParseInterfaceVariable(-      p_parser,-      &p_node->decorations,-      &p_type_node->decorations,-      p_module,-      p_type,-      p_var,-      &has_built_in);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      SPV_REFLECT_ASSERT(false);-      return result;-    }--    // Input and output variables-    if (p_var->storage_class == SpvStorageClassInput) {-      p_entry->input_variables[input_index] = p_var;-       ++input_index;-    }-    else if (p_node->storage_class == SpvStorageClassOutput) {-      p_entry->output_variables[output_index] = p_var;-      ++output_index;-    }--    // SPIR-V result id-    p_var->spirv_id = p_node->result_id;-    // Name-    p_var->name = p_node->name;-    // Semantic-    p_var->semantic = p_node->decorations.semantic.value;--    // Decorate with built-in if any member is built-in-    if (has_built_in) {-      p_var->decoration_flags |= SPV_REFLECT_DECORATION_BUILT_IN;-    }--    // Location is decorated on OpVariable node, not the type node.-    p_var->location = p_node->decorations.location.value;-    p_var->word_offset.location = p_node->decorations.location.word_offset;--    // Built in-    if (p_node->decorations.is_built_in) {-      p_var->built_in = p_node->decorations.built_in;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult EnumerateAllPushConstants(-  SpvReflectShaderModule* p_module,-  size_t*                 p_push_constant_count,-  uint32_t**              p_push_constants-)-{-  *p_push_constant_count = p_module->push_constant_block_count;-  if (*p_push_constant_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }-  *p_push_constants = (uint32_t*)calloc(*p_push_constant_count, sizeof(**p_push_constants));--  if (IsNull(*p_push_constants)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  for (size_t i = 0; i < *p_push_constant_count; ++i) {-    (*p_push_constants)[i] = p_module->push_constant_blocks[i].spirv_id;-  }-  qsort(*p_push_constants, *p_push_constant_count, sizeof(**p_push_constants),-        SortCompareUint32);-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult TraverseCallGraph(-  SpvReflectPrvParser*   p_parser,-  SpvReflectPrvFunction* p_func,-  size_t*                p_func_count,-  uint32_t*              p_func_ids,-  uint32_t               depth-)-{-  if (depth > p_parser->function_count) {-    // Vulkan does not permit recursion (Vulkan spec Appendix A):-    //   "Recursion: The static function-call graph for an entry point must not-    //    contain cycles."-    return SPV_REFLECT_RESULT_ERROR_SPIRV_RECURSION;-  }-  if (IsNotNull(p_func_ids)) {-    p_func_ids[(*p_func_count)++] = p_func->id;-  } else {-    ++*p_func_count;-  }-  for (size_t i = 0; i < p_func->callee_count; ++i) {-    SpvReflectResult result = TraverseCallGraph(-        p_parser, p_func->callee_ptrs[i], p_func_count, p_func_ids, depth + 1);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseStaticallyUsedResources(-  SpvReflectPrvParser*    p_parser,-  SpvReflectShaderModule* p_module,-  SpvReflectEntryPoint*   p_entry,-  size_t                  uniform_count,-  uint32_t*               uniforms,-  size_t                  push_constant_count,-  uint32_t*               push_constants-)-{-  // Find function with the right id-  SpvReflectPrvFunction* p_func = NULL;-  for (size_t i = 0; i < p_parser->function_count; ++i) {-    if (p_parser->functions[i].id == p_entry->id) {-      p_func = &(p_parser->functions[i]);-      break;-    }-  }-  if (p_func == NULL) {-    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-  }--  size_t called_function_count = 0;-  SpvReflectResult result = TraverseCallGraph(-    p_parser,-    p_func,-    &called_function_count,-    NULL,-    0);-  if (result != SPV_REFLECT_RESULT_SUCCESS) {-    return result;-  }--  uint32_t* p_called_functions = NULL;-  if (called_function_count > 0) {-    p_called_functions = (uint32_t*)calloc(called_function_count, sizeof(*p_called_functions));-    if (IsNull(p_called_functions)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }--  called_function_count = 0;-  result = TraverseCallGraph(-    p_parser,-    p_func,-    &called_function_count,-    p_called_functions,-    0);-  if (result != SPV_REFLECT_RESULT_SUCCESS) {-    return result;-  }--  if (called_function_count > 0) {-    qsort(-      p_called_functions, -      called_function_count, -      sizeof(*p_called_functions),-      SortCompareUint32);-  }-  called_function_count = DedupSortedUint32(p_called_functions, called_function_count);--  uint32_t used_variable_count = 0;-  for (size_t i = 0, j = 0; i < called_function_count; ++i) {-    // No need to bounds check j because a missing ID issue would have been-    // found during TraverseCallGraph-    while (p_parser->functions[j].id != p_called_functions[i]) {-      ++j;-    }-    used_variable_count += p_parser->functions[j].accessed_ptr_count;-  }-  uint32_t* used_variables = NULL;-  if (used_variable_count > 0) {-    used_variables = (uint32_t*)calloc(used_variable_count,-                                       sizeof(*used_variables));-    if (IsNull(used_variables)) {-      SafeFree(p_called_functions);-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-  }-  used_variable_count = 0;-  for (size_t i = 0, j = 0; i < called_function_count; ++i) {-    while (p_parser->functions[j].id != p_called_functions[i]) {-      ++j;-    }--    memcpy(&used_variables[used_variable_count],-           p_parser->functions[j].accessed_ptrs,-           p_parser->functions[j].accessed_ptr_count * sizeof(*used_variables));-    used_variable_count += p_parser->functions[j].accessed_ptr_count;-  }-  SafeFree(p_called_functions);--  if (used_variable_count > 0) {-    qsort(used_variables, used_variable_count, sizeof(*used_variables),-          SortCompareUint32);-  }-  used_variable_count = (uint32_t)DedupSortedUint32(used_variables, -                                                    used_variable_count);--  // Do set intersection to find the used uniform and push constants-  size_t used_uniform_count = 0;-  //-  SpvReflectResult result0 = IntersectSortedUint32(-    used_variables,-    used_variable_count,-    uniforms, -    uniform_count,-    &p_entry->used_uniforms,-    &used_uniform_count);--  size_t used_push_constant_count = 0;-  //-  SpvReflectResult result1 = IntersectSortedUint32(-    used_variables, -    used_variable_count,-    push_constants, -    push_constant_count,-    &p_entry->used_push_constants,-    &used_push_constant_count);--  for (uint32_t j = 0; j < p_module->descriptor_binding_count; ++j) {-    SpvReflectDescriptorBinding* p_binding = &p_module->descriptor_bindings[j];-    bool found = SearchSortedUint32(-      used_variables,-      used_variable_count,-      p_binding->spirv_id);-    if (found) {-      p_binding->accessed = 1;-    }-  }--  SafeFree(used_variables);-  if (result0 != SPV_REFLECT_RESULT_SUCCESS) {-    return result0;-  }-  if (result1 != SPV_REFLECT_RESULT_SUCCESS) {-    return result1;-  }--  p_entry->used_uniform_count = (uint32_t)used_uniform_count;-  p_entry->used_push_constant_count = (uint32_t)used_push_constant_count;--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseEntryPoints(-  SpvReflectPrvParser*    p_parser, -  SpvReflectShaderModule* p_module)-{-  if (p_parser->entry_point_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_module->entry_point_count = p_parser->entry_point_count;-  p_module->entry_points = (SpvReflectEntryPoint*)calloc(p_module->entry_point_count,-                                                         sizeof(*(p_module->entry_points)));-  if (IsNull(p_module->entry_points)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  SpvReflectResult result;-  size_t uniform_count = 0;-  uint32_t* uniforms = NULL;-  if ((result = EnumerateAllUniforms(p_module, &uniform_count, &uniforms)) !=-       SPV_REFLECT_RESULT_SUCCESS) {-    return result;-  }-  size_t push_constant_count = 0;-  uint32_t* push_constants = NULL;-  if ((result = EnumerateAllPushConstants(p_module, &push_constant_count, &push_constants)) !=-       SPV_REFLECT_RESULT_SUCCESS) {-    return result;-  }--  size_t entry_point_index = 0;-  for (size_t i = 0; entry_point_index < p_parser->entry_point_count && i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if (p_node->op != SpvOpEntryPoint) {-      continue;-    }--    SpvReflectEntryPoint* p_entry_point = &(p_module->entry_points[entry_point_index]);-    CHECKED_READU32_CAST(p_parser, p_node->word_offset + 1, SpvExecutionModel, p_entry_point->spirv_execution_model);-    CHECKED_READU32(p_parser, p_node->word_offset + 2, p_entry_point->id);--    switch (p_entry_point->spirv_execution_model) {-      default: break;-      case SpvExecutionModelVertex                 : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_VERTEX_BIT; break;-      case SpvExecutionModelTessellationControl    : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TESSELLATION_CONTROL_BIT; break;-      case SpvExecutionModelTessellationEvaluation : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TESSELLATION_EVALUATION_BIT; break;-      case SpvExecutionModelGeometry               : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_GEOMETRY_BIT; break;-      case SpvExecutionModelFragment               : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_FRAGMENT_BIT; break;-      case SpvExecutionModelGLCompute              : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_COMPUTE_BIT; break;-      case SpvExecutionModelTaskNV                 : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TASK_BIT_NV; break;-      case SpvExecutionModelMeshNV                 : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_MESH_BIT_NV; break;-      case SpvExecutionModelRayGenerationKHR       : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_RAYGEN_BIT_KHR; break;-      case SpvExecutionModelIntersectionKHR        : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_INTERSECTION_BIT_KHR; break;-      case SpvExecutionModelAnyHitKHR              : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_ANY_HIT_BIT_KHR; break;-      case SpvExecutionModelClosestHitKHR          : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_CLOSEST_HIT_BIT_KHR; break;-      case SpvExecutionModelMissKHR                : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_MISS_BIT_KHR; break;-      case SpvExecutionModelCallableKHR            : p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_CALLABLE_BIT_KHR; break;-    }--    ++entry_point_index;--    // Name length is required to calculate next operand-    uint32_t name_start_word_offset = 3;-    uint32_t name_length_with_terminator = 0;-    result = ReadStr(p_parser, p_node->word_offset + name_start_word_offset, 0, p_node->word_count, &name_length_with_terminator, NULL);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-    p_entry_point->name = (const char*)(p_parser->spirv_code + p_node->word_offset + name_start_word_offset);--    uint32_t name_word_count = RoundUp(name_length_with_terminator, SPIRV_WORD_SIZE) / SPIRV_WORD_SIZE;-    uint32_t interface_variable_count = (p_node->word_count - (name_start_word_offset + name_word_count));-    uint32_t* p_interface_variables = NULL;-    if (interface_variable_count > 0) {-      p_interface_variables = (uint32_t*)calloc(interface_variable_count, sizeof(*(p_interface_variables)));-      if (IsNull(p_interface_variables)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }-    }--    for (uint32_t var_index = 0; var_index < interface_variable_count; ++var_index) {-      uint32_t var_result_id = (uint32_t)INVALID_VALUE;-      uint32_t offset = name_start_word_offset + name_word_count + var_index;-      CHECKED_READU32(p_parser, p_node->word_offset + offset, var_result_id);-      p_interface_variables[var_index] = var_result_id;-    }--    result = ParseInterfaceVariables(-      p_parser,-      p_module,-      p_entry_point,-      interface_variable_count,-      p_interface_variables);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-    SafeFree(p_interface_variables);--    result = ParseStaticallyUsedResources(-      p_parser,-      p_module,-      p_entry_point,-      uniform_count,-      uniforms,-      push_constant_count,-      push_constants);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-  }--  SafeFree(uniforms);-  SafeFree(push_constants);--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseExecutionModes(-  SpvReflectPrvParser*    p_parser,-  SpvReflectShaderModule* p_module)-{-  assert(IsNotNull(p_parser));-  assert(IsNotNull(p_parser->nodes));-  assert(IsNotNull(p_module));--  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {-    for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[node_idx]);-      if (p_node->op != SpvOpExecutionMode) {-        continue;-      }--      // Read entry point id-      uint32_t entry_point_id = 0;-      CHECKED_READU32(p_parser, p_node->word_offset + 1, entry_point_id);--      // Find entry point-      SpvReflectEntryPoint* p_entry_point = NULL;-      for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {-        if (p_module->entry_points[entry_point_idx].id == entry_point_id) {-          p_entry_point = &p_module->entry_points[entry_point_idx];-          break;-        }-      }-      // Bail if entry point is null-      if (IsNull(p_entry_point)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ENTRY_POINT;-      }--      // Read execution mode-      uint32_t execution_mode = (uint32_t)INVALID_VALUE;-      CHECKED_READU32(p_parser, p_node->word_offset + 2, execution_mode);--      // Parse execution mode-      switch (execution_mode) {-        default: {-          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_EXECUTION_MODE;-        }-        break;--        case SpvExecutionModeInvocations: {-          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->invocations);-        }-        break;--        case SpvExecutionModeSpacingEqual:-        case SpvExecutionModeSpacingFractionalEven:-        case SpvExecutionModeSpacingFractionalOdd:-        case SpvExecutionModeVertexOrderCw:-        case SpvExecutionModeVertexOrderCcw:-        case SpvExecutionModePixelCenterInteger:-        case SpvExecutionModeOriginUpperLeft:-        case SpvExecutionModeOriginLowerLeft:-        case SpvExecutionModeEarlyFragmentTests:-        case SpvExecutionModePointMode:-        case SpvExecutionModeXfb:-        case SpvExecutionModeDepthReplacing:-        case SpvExecutionModeDepthGreater:-        case SpvExecutionModeDepthLess:-        case SpvExecutionModeDepthUnchanged:-          break;--        case SpvExecutionModeLocalSize: {-          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->local_size.x);-          CHECKED_READU32(p_parser, p_node->word_offset + 4, p_entry_point->local_size.y);-          CHECKED_READU32(p_parser, p_node->word_offset + 5, p_entry_point->local_size.z);-        }-        break;--        case SpvExecutionModeLocalSizeHint:-        case SpvExecutionModeInputPoints:-        case SpvExecutionModeInputLines:-        case SpvExecutionModeInputLinesAdjacency:-        case SpvExecutionModeTriangles:-        case SpvExecutionModeInputTrianglesAdjacency:-        case SpvExecutionModeQuads:-        case SpvExecutionModeIsolines:-        case SpvExecutionModeOutputVertices: {-          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->output_vertices);-        }-        break;--        case SpvExecutionModeOutputPoints:-        case SpvExecutionModeOutputLineStrip:-        case SpvExecutionModeOutputTriangleStrip:-        case SpvExecutionModeVecTypeHint:-        case SpvExecutionModeContractionOff:-        case SpvExecutionModeInitializer:-        case SpvExecutionModeFinalizer:-        case SpvExecutionModeSubgroupSize:-        case SpvExecutionModeSubgroupsPerWorkgroup:-        case SpvExecutionModeSubgroupsPerWorkgroupId:-        case SpvExecutionModeLocalSizeId:-        case SpvExecutionModeLocalSizeHintId:-        case SpvExecutionModePostDepthCoverage:-        case SpvExecutionModeDenormPreserve:-        case SpvExecutionModeDenormFlushToZero:-        case SpvExecutionModeSignedZeroInfNanPreserve:-        case SpvExecutionModeRoundingModeRTE:-        case SpvExecutionModeRoundingModeRTZ:-        case SpvExecutionModeStencilRefReplacingEXT:-        case SpvExecutionModeOutputLinesNV:-        case SpvExecutionModeOutputPrimitivesNV:-        case SpvExecutionModeOutputTrianglesNV:-          break;-      }-      p_entry_point->execution_mode_count++;-    }-    uint32_t* indices = (uint32_t*)calloc(p_module->entry_point_count, sizeof(indices));-    if (IsNull(indices)) {-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-    for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {-      SpvReflectEntryPoint* p_entry_point = &p_module->entry_points[entry_point_idx];-      p_entry_point->execution_modes =-          (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));-      if (IsNull(p_entry_point->execution_modes)) {-        SafeFree(indices);-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }-    }--    for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {-      SpvReflectPrvNode* p_node = &(p_parser->nodes[node_idx]);-      if (p_node->op != SpvOpExecutionMode) {-        continue;-      }--      // Read entry point id-      uint32_t entry_point_id = 0;-      CHECKED_READU32(p_parser, p_node->word_offset + 1, entry_point_id);--      // Find entry point-      SpvReflectEntryPoint* p_entry_point = NULL;-      uint32_t* idx = NULL;-      for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {-        if (p_module->entry_points[entry_point_idx].id == entry_point_id) {-          p_entry_point = &p_module->entry_points[entry_point_idx];-          idx = &indices[entry_point_idx];-          break;-        }-      }--      // Read execution mode-      uint32_t execution_mode = (uint32_t)INVALID_VALUE;-      CHECKED_READU32(p_parser, p_node->word_offset + 2, execution_mode);-      p_entry_point->execution_modes[(*idx)++] = (SpvExecutionMode)execution_mode;-    }-    SafeFree(indices);-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParsePushConstantBlocks(-  SpvReflectPrvParser*    p_parser, -  SpvReflectShaderModule* p_module)-{-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if ((p_node->op != SpvOpVariable) || (p_node->storage_class != SpvStorageClassPushConstant)) {-      continue;-    }--    p_module->push_constant_block_count += 1;-  }--  if (p_module->push_constant_block_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  p_module->push_constant_blocks = (SpvReflectBlockVariable*)calloc(p_module->push_constant_block_count, sizeof(*p_module->push_constant_blocks));-  if (IsNull(p_module->push_constant_blocks)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }--  uint32_t push_constant_index = 0;-  for (size_t i = 0; i < p_parser->node_count; ++i) {-    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);-    if ((p_node->op != SpvOpVariable) || (p_node->storage_class != SpvStorageClassPushConstant)) {-      continue;-    }--    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);-    if (IsNull(p_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }-    // If the type is a pointer, resolve it-    if (p_type->op == SpvOpTypePointer) {-      // Find the type's node-      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-      if (IsNull(p_type_node)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-      // Should be the resolved type-      p_type = FindType(p_module, p_type_node->type_id);-      if (IsNull(p_type)) {-        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-      }-    }--    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);-    if (IsNull(p_type_node)) {-      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;-    }--    SpvReflectBlockVariable* p_push_constant = &p_module->push_constant_blocks[push_constant_index];-    p_push_constant->spirv_id = p_node->result_id;-    SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_type, p_push_constant);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }-    result = ParseDescriptorBlockVariableSizes(p_parser, p_module, true, false, false, p_push_constant);-    if (result != SPV_REFLECT_RESULT_SUCCESS) {-      return result;-    }--    ++push_constant_index;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static int SortCompareDescriptorSet(const void* a, const void* b)-{-  const SpvReflectDescriptorSet* p_elem_a = (const SpvReflectDescriptorSet*)a;-  const SpvReflectDescriptorSet* p_elem_b = (const SpvReflectDescriptorSet*)b;-  int value = (int)(p_elem_a->set) - (int)(p_elem_b->set);-  // We should never see duplicate descriptor set numbers in a shader; if so, a tiebreaker-  // would be needed here.-  assert(value != 0);-  return value;-}--static SpvReflectResult ParseEntrypointDescriptorSets(SpvReflectShaderModule* p_module) {-  // Update the entry point's sets-  for (uint32_t i = 0; i < p_module->entry_point_count; ++i) {-    SpvReflectEntryPoint* p_entry = &p_module->entry_points[i];-    for (uint32_t j = 0; j < p_entry->descriptor_set_count; ++j) {-      SafeFree(p_entry->descriptor_sets[j].bindings);-    }-    SafeFree(p_entry->descriptor_sets);-    p_entry->descriptor_set_count = 0;-    for (uint32_t j = 0; j < p_module->descriptor_set_count; ++j) {-      const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];-      for (uint32_t k = 0; k < p_set->binding_count; ++k) {-        bool found = SearchSortedUint32(-          p_entry->used_uniforms,-          p_entry->used_uniform_count,-          p_set->bindings[k]->spirv_id);-        if (found) {-          ++p_entry->descriptor_set_count;-          break;-        }-      }-    }--    p_entry->descriptor_sets = NULL;-    if (p_entry->descriptor_set_count > 0) {-      p_entry->descriptor_sets = (SpvReflectDescriptorSet*)calloc(p_entry->descriptor_set_count,-                                                                  sizeof(*p_entry->descriptor_sets));-      if (IsNull(p_entry->descriptor_sets)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }-    }-    p_entry->descriptor_set_count = 0;-    for (uint32_t j = 0; j < p_module->descriptor_set_count; ++j) {-      const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];-      uint32_t count = 0;-      for (uint32_t k = 0; k < p_set->binding_count; ++k) {-        bool found = SearchSortedUint32(-          p_entry->used_uniforms,-          p_entry->used_uniform_count,-          p_set->bindings[k]->spirv_id);-        if (found) {-          ++count;-        }-      }-      if (count == 0) {-        continue;-      }-      SpvReflectDescriptorSet* p_entry_set = &p_entry->descriptor_sets[-          p_entry->descriptor_set_count++];-      p_entry_set->set = p_set->set;-      p_entry_set->bindings = (SpvReflectDescriptorBinding**)calloc(count,-                                                                    sizeof(*p_entry_set->bindings));-      if (IsNull(p_entry_set->bindings)) {-        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-      }-      for (uint32_t k = 0; k < p_set->binding_count; ++k) {-        bool found = SearchSortedUint32(-          p_entry->used_uniforms,-          p_entry->used_uniform_count,-          p_set->bindings[k]->spirv_id);-        if (found) {-          p_entry_set->bindings[p_entry_set->binding_count++] = p_set->bindings[k];-        }-      }-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult ParseDescriptorSets(SpvReflectShaderModule* p_module)-{-  // Count the descriptors in each set-  for (uint32_t i = 0; i < p_module->descriptor_binding_count; ++i) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[i]);--    // Look for a target set using the descriptor's set number-    SpvReflectDescriptorSet* p_target_set = NULL;-    for (uint32_t j = 0; j < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++j) {-      SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];-      if (p_set->set == p_descriptor->set) {-        p_target_set = p_set;-        break;-      }-    }--    // If a target set isn't found, find the first available one.-    if (IsNull(p_target_set)) {-      for (uint32_t j = 0; j < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++j) {-        SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];-        if (p_set->set == (uint32_t)INVALID_VALUE) {-          p_target_set = p_set;-          p_target_set->set = p_descriptor->set;-          break;-        }-      }-    }--    if (IsNull(p_target_set)) {-      return SPV_REFLECT_RESULT_ERROR_INTERNAL_ERROR;-    }--    p_target_set->binding_count += 1;-  }--  // Count the descriptor sets-  for (uint32_t i = 0; i < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++i) {-    const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];-    if (p_set->set != (uint32_t)INVALID_VALUE) {-      p_module->descriptor_set_count += 1;-    }-  }--  // Sort the descriptor sets based on numbers-  if (p_module->descriptor_set_count > 0) {-    qsort(p_module->descriptor_sets,-          p_module->descriptor_set_count,-          sizeof(*(p_module->descriptor_sets)),-          SortCompareDescriptorSet);-  }--  // Build descriptor pointer array-  for (uint32_t i = 0; i <p_module->descriptor_set_count; ++i) {-    SpvReflectDescriptorSet* p_set = &(p_module->descriptor_sets[i]);-    p_set->bindings = (SpvReflectDescriptorBinding **)calloc(p_set->binding_count, sizeof(*(p_set->bindings)));--    uint32_t descriptor_index = 0;-    for (uint32_t j = 0; j < p_module->descriptor_binding_count; ++j) {-      SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[j]);-      if (p_descriptor->set == p_set->set) {-        assert(descriptor_index < p_set->binding_count);-        p_set->bindings[descriptor_index] = p_descriptor;-        ++descriptor_index;-      }-    }-  }--  return ParseEntrypointDescriptorSets(p_module);-}--static SpvReflectResult DisambiguateStorageBufferSrvUav(SpvReflectShaderModule* p_module)-{-  if (p_module->descriptor_binding_count == 0) {-    return SPV_REFLECT_RESULT_SUCCESS;-  }--  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {-    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);-    // Skip everything that isn't a STORAGE_BUFFER descriptor-    if (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {-      continue;-    }--    //-    // Vulkan doesn't disambiguate between SRVs and UAVs so they-    // come back as STORAGE_BUFFER. The block parsing process will-    // mark a block as non-writable should any member of the block-    // or its descendants are non-writable.-    //-    if (p_descriptor->block.decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE) {-      p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV;-    }-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--static SpvReflectResult SynchronizeDescriptorSets(SpvReflectShaderModule* p_module)-{-  // Free and reset all descriptor set numbers-  for (uint32_t i = 0; i < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++i) {-    SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];-    SafeFree(p_set->bindings);-    p_set->binding_count = 0;-    p_set->set = (uint32_t)INVALID_VALUE;-  }-  // Set descriptor set count to zero-  p_module->descriptor_set_count = 0;--  SpvReflectResult result = ParseDescriptorSets(p_module);-  return result;-}--static SpvReflectResult CreateShaderModule(-  uint32_t                 flags,-  size_t                   size,-  const void*              p_code,-  SpvReflectShaderModule*  p_module-)-{-  // Initialize all module fields to zero-  memset(p_module, 0, sizeof(*p_module));--  // Allocate module internals-#ifdef __cplusplus-  p_module->_internal = (SpvReflectShaderModule::Internal*)calloc(1, sizeof(*(p_module->_internal)));-#else-  p_module->_internal = calloc(1, sizeof(*(p_module->_internal)));-#endif-  if (IsNull(p_module->_internal)) {-    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-  }-  // Copy flags-  p_module->_internal->module_flags = flags;-  // Figure out if we need to copy the SPIR-V code or not-  if (flags & SPV_REFLECT_MODULE_FLAG_NO_COPY) {-    // Set internal size and pointer to args passed in-    p_module->_internal->spirv_size = size;-#if defined(__cplusplus)-    p_module->_internal->spirv_code = const_cast<uint32_t*>(static_cast<const uint32_t*>(p_code)); // cast that const away-#else-    p_module->_internal->spirv_code = (void*)p_code; // cast that const away-#endif-    p_module->_internal->spirv_word_count = (uint32_t)(size / SPIRV_WORD_SIZE);-  }-  else {-    // Allocate SPIR-V code storage-    p_module->_internal->spirv_size = size;-    p_module->_internal->spirv_code = (uint32_t*)calloc(1, p_module->_internal->spirv_size);-    p_module->_internal->spirv_word_count = (uint32_t)(size / SPIRV_WORD_SIZE);-    if (IsNull(p_module->_internal->spirv_code)) {-      SafeFree(p_module->_internal);-      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;-    }-    // Copy SPIR-V to code storage-    memcpy(p_module->_internal->spirv_code, p_code, size);-  }--  SpvReflectPrvParser parser = { 0 };-  SpvReflectResult result = CreateParser(p_module->_internal->spirv_size,-                                         p_module->_internal->spirv_code,-                                         &parser);--  // Generator-  {-    const uint32_t* p_ptr = (const uint32_t*)p_module->_internal->spirv_code;-    p_module->generator = (SpvReflectGenerator)((*(p_ptr + 2) & 0xFFFF0000) >> 16);-  }--  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseNodes(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseStrings(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseSource(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseFunctions(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseMemberCounts(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseNames(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseDecorations(&parser);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }--  // Start of reflection data parsing-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    p_module->source_language = parser.source_language;-    p_module->source_language_version = parser.source_language_version;--    // Zero out descriptor set data-    p_module->descriptor_set_count = 0;-    memset(p_module->descriptor_sets, 0, SPV_REFLECT_MAX_DESCRIPTOR_SETS * sizeof(*p_module->descriptor_sets));-    // Initialize descriptor set numbers-    for (uint32_t set_number = 0; set_number < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++set_number) {-      p_module->descriptor_sets[set_number].set = (uint32_t)INVALID_VALUE;-    }-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseTypes(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseDescriptorBindings(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseDescriptorType(p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseUAVCounterBindings(p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseDescriptorBlocks(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParsePushConstantBlocks(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseEntryPoints(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseCapabilities(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS && p_module->entry_point_count > 0) {-    SpvReflectEntryPoint* p_entry = &(p_module->entry_points[0]);-    p_module->entry_point_name = p_entry->name;-    p_module->entry_point_id = p_entry->id;-    p_module->spirv_execution_model = p_entry->spirv_execution_model;-    p_module->shader_stage = p_entry->shader_stage;-    p_module->input_variable_count = p_entry->input_variable_count;-    p_module->input_variables = p_entry->input_variables;-    p_module->output_variable_count = p_entry->output_variable_count;-    p_module->output_variables = p_entry->output_variables;-    p_module->interface_variable_count = p_entry->interface_variable_count;-    p_module->interface_variables = p_entry->interface_variables;-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = DisambiguateStorageBufferSrvUav(p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = SynchronizeDescriptorSets(p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }-  if (result == SPV_REFLECT_RESULT_SUCCESS) {-    result = ParseExecutionModes(&parser, p_module);-    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);-  }--  // Destroy module if parse was not successful-  if (result != SPV_REFLECT_RESULT_SUCCESS) {-    spvReflectDestroyShaderModule(p_module);-  }--  DestroyParser(&parser);--  return result;-}--SpvReflectResult spvReflectCreateShaderModule(-  size_t                   size,-  const void*              p_code,-  SpvReflectShaderModule*  p_module-)-{-    return CreateShaderModule(0, size, p_code, p_module);-}--SpvReflectResult spvReflectCreateShaderModule2(-  uint32_t                 flags,-  size_t                   size,-  const void*              p_code,-  SpvReflectShaderModule*  p_module-)-{-  return CreateShaderModule(flags, size, p_code, p_module);-}--SpvReflectResult spvReflectGetShaderModule(-  size_t                   size,-  const void*              p_code,-  SpvReflectShaderModule*  p_module-)-{-    return spvReflectCreateShaderModule(size, p_code, p_module);-}--static void SafeFreeTypes(SpvReflectTypeDescription* p_type)-{-  if (IsNull(p_type)) {-    return;-  }--  if (IsNotNull(p_type->members)) {-    for (size_t i = 0; i < p_type->member_count; ++i) {-      SpvReflectTypeDescription* p_member = &p_type->members[i];-      SafeFreeTypes(p_member);-    }--    SafeFree(p_type->members);-    p_type->members = NULL;-  }-}--static void SafeFreeBlockVariables(SpvReflectBlockVariable* p_block)-{-  if (IsNull(p_block)) {-    return;-  }--  if (IsNotNull(p_block->members)) {-    for (size_t i = 0; i < p_block->member_count; ++i) {-      SpvReflectBlockVariable* p_member = &p_block->members[i];-      SafeFreeBlockVariables(p_member);-    }--    SafeFree(p_block->members);-    p_block->members = NULL;-  }-}--static void SafeFreeInterfaceVariable(SpvReflectInterfaceVariable* p_interface)-{-  if (IsNull(p_interface)) {-    return;-  }--  if (IsNotNull(p_interface->members)) {-    for (size_t i = 0; i < p_interface->member_count; ++i) {-      SpvReflectInterfaceVariable* p_member = &p_interface->members[i];-      SafeFreeInterfaceVariable(p_member);-    }--    SafeFree(p_interface->members);-    p_interface->members = NULL;-  }-}--void spvReflectDestroyShaderModule(SpvReflectShaderModule* p_module)-{-  if (IsNull(p_module->_internal)) {-    return;-  }--  SafeFree(p_module->source_source);--  // Descriptor set bindings-  for (size_t i = 0; i < p_module->descriptor_set_count; ++i) {-    SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];-    free(p_set->bindings);-  }--  // Descriptor binding blocks-  for (size_t i = 0; i < p_module->descriptor_binding_count; ++i) {-    SpvReflectDescriptorBinding* p_descriptor = &p_module->descriptor_bindings[i];-    SafeFreeBlockVariables(&p_descriptor->block);-  }-  SafeFree(p_module->descriptor_bindings);--  // Entry points-  for (size_t i = 0; i < p_module->entry_point_count; ++i) {-    SpvReflectEntryPoint* p_entry = &p_module->entry_points[i];-    for (size_t j = 0; j < p_entry->interface_variable_count; j++) {-      SafeFreeInterfaceVariable(&p_entry->interface_variables[j]);-    }-    for (uint32_t j = 0; j < p_entry->descriptor_set_count; ++j) {-      SafeFree(p_entry->descriptor_sets[j].bindings);-    }-    SafeFree(p_entry->descriptor_sets);-    SafeFree(p_entry->input_variables);-    SafeFree(p_entry->output_variables);-    SafeFree(p_entry->interface_variables);-    SafeFree(p_entry->used_uniforms);-    SafeFree(p_entry->used_push_constants);-    SafeFree(p_entry->execution_modes);-  }-  SafeFree(p_module->capabilities);-  SafeFree(p_module->entry_points);--  // Push constants-  for (size_t i = 0; i < p_module->push_constant_block_count; ++i) {-    SafeFreeBlockVariables(&p_module->push_constant_blocks[i]);-  }-  SafeFree(p_module->push_constant_blocks);--  // Type infos-  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {-    SpvReflectTypeDescription* p_type = &p_module->_internal->type_descriptions[i];-    if (IsNotNull(p_type->members)) {-      SafeFreeTypes(p_type);-    }-    SafeFree(p_type->members);-  }-  SafeFree(p_module->_internal->type_descriptions);--  // Free SPIR-V code if there was a copy-  if ((p_module->_internal->module_flags & SPV_REFLECT_MODULE_FLAG_NO_COPY) == 0) {-    SafeFree(p_module->_internal->spirv_code);-  }-  // Free internal-  SafeFree(p_module->_internal);-}--uint32_t spvReflectGetCodeSize(const SpvReflectShaderModule* p_module)-{-  if (IsNull(p_module)) {-    return 0;-  }--  return (uint32_t)(p_module->_internal->spirv_size);-}--const uint32_t* spvReflectGetCode(const SpvReflectShaderModule* p_module)-{-  if (IsNull(p_module)) {-    return NULL;-  }--  return p_module->_internal->spirv_code;-}--const SpvReflectEntryPoint* spvReflectGetEntryPoint(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point-) {-  if (IsNull(p_module) || IsNull(entry_point)) {-    return NULL;-  }--  for (uint32_t i = 0; i < p_module->entry_point_count; ++i) {-    if (strcmp(p_module->entry_points[i].name, entry_point) == 0) {-      return &p_module->entry_points[i];-    }-  }-  return NULL;-}--SpvReflectResult spvReflectEnumerateDescriptorBindings(-  const SpvReflectShaderModule*  p_module,-  uint32_t*                      p_count,-  SpvReflectDescriptorBinding**  pp_bindings-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (IsNotNull(pp_bindings)) {-    if (*p_count != p_module->descriptor_binding_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectDescriptorBinding* p_bindings = (SpvReflectDescriptorBinding*)&p_module->descriptor_bindings[index];-      pp_bindings[index] = p_bindings;-    }-  }-  else {-    *p_count = p_module->descriptor_binding_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateEntryPointDescriptorBindings(-  const SpvReflectShaderModule*  p_module,-  const char*                    entry_point,-  uint32_t*                      p_count,-  SpvReflectDescriptorBinding**  pp_bindings-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  uint32_t count = 0;-  for (uint32_t i = 0; i < p_module->descriptor_binding_count; ++i) {-    bool found = SearchSortedUint32(-      p_entry->used_uniforms,-      p_entry->used_uniform_count,-      p_module->descriptor_bindings[i].spirv_id);-    if (found) {-      if (IsNotNull(pp_bindings)) {-        if (count >= *p_count) {-          return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-        }-        pp_bindings[count++] = (SpvReflectDescriptorBinding*)&p_module->descriptor_bindings[i];-      } else {-        ++count;-      }-    }-  }-  if (IsNotNull(pp_bindings)) {-    if (count != *p_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }-  } else {-    *p_count = count;-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateDescriptorSets(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectDescriptorSet**     pp_sets-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (IsNotNull(pp_sets)) {-    if (*p_count != p_module->descriptor_set_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectDescriptorSet* p_set = (SpvReflectDescriptorSet*)&p_module->descriptor_sets[index];-      pp_sets[index] = p_set;-    }-  }-  else {-    *p_count = p_module->descriptor_set_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateEntryPointDescriptorSets(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t*                     p_count,-  SpvReflectDescriptorSet**     pp_sets-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  if (IsNotNull(pp_sets)) {-    if (*p_count != p_entry->descriptor_set_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectDescriptorSet* p_set = (SpvReflectDescriptorSet*)&p_entry->descriptor_sets[index];-      pp_sets[index] = p_set;-    }-  }-  else {-    *p_count = p_entry->descriptor_set_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateInterfaceVariables(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_module->interface_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = &p_module->interface_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_module->interface_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateEntryPointInterfaceVariables(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_entry->interface_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = &p_entry->interface_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_entry->interface_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateInputVariables(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_module->input_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = p_module->input_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_module->input_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateEntryPointInputVariables(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_entry->input_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = p_entry->input_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_entry->input_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateOutputVariables(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_module->output_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = p_module->output_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_module->output_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumerateEntryPointOutputVariables(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t*                     p_count,-  SpvReflectInterfaceVariable** pp_variables-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  if (IsNotNull(pp_variables)) {-    if (*p_count != p_entry->output_variable_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectInterfaceVariable* p_var = p_entry->output_variables[index];-      pp_variables[index] = p_var;-    }-  }-  else {-    *p_count = p_entry->output_variable_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectEnumeratePushConstantBlocks(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectBlockVariable**     pp_blocks-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  if (pp_blocks != NULL) {-    if (*p_count != p_module->push_constant_block_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }--    for (uint32_t index = 0; index < *p_count; ++index) {-      SpvReflectBlockVariable* p_push_constant_blocks = (SpvReflectBlockVariable*)&p_module->push_constant_blocks[index];-      pp_blocks[index] = p_push_constant_blocks;-    }-  }-  else {-    *p_count = p_module->push_constant_block_count;-  }--  return SPV_REFLECT_RESULT_SUCCESS;-}-SpvReflectResult spvReflectEnumeratePushConstants(-  const SpvReflectShaderModule* p_module,-  uint32_t*                     p_count,-  SpvReflectBlockVariable**     pp_blocks-)-{-  return spvReflectEnumeratePushConstantBlocks(p_module, p_count, pp_blocks);-}--SpvReflectResult spvReflectEnumerateEntryPointPushConstantBlocks(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t*                     p_count,-  SpvReflectBlockVariable**     pp_blocks-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_count)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }---  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-  }--  uint32_t count = 0;-  for (uint32_t i = 0; i < p_module->push_constant_block_count; ++i) {-    bool found = SearchSortedUint32(p_entry->used_push_constants,-                           p_entry->used_push_constant_count,-                           p_module->push_constant_blocks[i].spirv_id);-    if (found) {-      if (IsNotNull(pp_blocks)) {-        if (count >= *p_count) {-          return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-        }-        pp_blocks[count++] = (SpvReflectBlockVariable*)&p_module->push_constant_blocks[i];-      } else {-        ++count;-      }-    }-  }-  if (IsNotNull(pp_blocks)) {-    if (count != *p_count) {-      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;-    }-  } else {-    *p_count = count;-  }-  return SPV_REFLECT_RESULT_SUCCESS;-}--const SpvReflectDescriptorBinding* spvReflectGetDescriptorBinding(-  const SpvReflectShaderModule* p_module,-  uint32_t                      binding_number,-  uint32_t                      set_number,-  SpvReflectResult*             p_result-)-{-  const SpvReflectDescriptorBinding* p_descriptor = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {-      const SpvReflectDescriptorBinding* p_potential = &p_module->descriptor_bindings[index];-      if ((p_potential->binding == binding_number) && (p_potential->set == set_number)) {-        p_descriptor = p_potential;-        break;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_descriptor)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_descriptor;-}--const SpvReflectDescriptorBinding* spvReflectGetEntryPointDescriptorBinding(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t                      binding_number,-  uint32_t                      set_number,-  SpvReflectResult*             p_result-)-{-  const SpvReflectEntryPoint* p_entry =-      spvReflectGetEntryPoint(p_module, entry_point);-  if (IsNull(p_entry)) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectDescriptorBinding* p_descriptor = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {-      const SpvReflectDescriptorBinding* p_potential = &p_module->descriptor_bindings[index];-      bool found = SearchSortedUint32(-        p_entry->used_uniforms, -        p_entry->used_uniform_count,-        p_potential->spirv_id);-      if ((p_potential->binding == binding_number) && (p_potential->set == set_number) && found) {-        p_descriptor = p_potential;-        break;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_descriptor)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_descriptor;-}--const SpvReflectDescriptorSet* spvReflectGetDescriptorSet(-  const SpvReflectShaderModule* p_module,-  uint32_t                      set_number,-  SpvReflectResult*             p_result-)-{-  const SpvReflectDescriptorSet* p_set = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->descriptor_set_count; ++index) {-      const SpvReflectDescriptorSet* p_potential = &p_module->descriptor_sets[index];-      if (p_potential->set == set_number) {-        p_set = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_set)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_set;-}--const SpvReflectDescriptorSet* spvReflectGetEntryPointDescriptorSet(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t                      set_number,-  SpvReflectResult*             p_result)-{-  const SpvReflectDescriptorSet* p_set = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t index = 0; index < p_entry->descriptor_set_count; ++index) {-      const SpvReflectDescriptorSet* p_potential = &p_entry->descriptor_sets[index];-      if (p_potential->set == set_number) {-        p_set = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_set)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_set;-}---const SpvReflectInterfaceVariable* spvReflectGetInputVariableByLocation(-  const SpvReflectShaderModule* p_module,-  uint32_t                      location,-  SpvReflectResult*             p_result-)-{-  if (location == INVALID_VALUE) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_module->input_variables[index];-      if (p_potential->location == location) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}-const SpvReflectInterfaceVariable* spvReflectGetInputVariable(-  const SpvReflectShaderModule* p_module,-  uint32_t                      location,-  SpvReflectResult*             p_result-)-{-  return spvReflectGetInputVariableByLocation(p_module, location, p_result);-}--const SpvReflectInterfaceVariable* spvReflectGetEntryPointInputVariableByLocation(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t                      location,-  SpvReflectResult*             p_result-)-{-  if (location == INVALID_VALUE) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }--  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry =-        spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t index = 0; index < p_entry->input_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_entry->input_variables[index];-      if (p_potential->location == location) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectInterfaceVariable* spvReflectGetInputVariableBySemantic(-  const SpvReflectShaderModule* p_module,-  const char*                   semantic,-  SpvReflectResult*             p_result-)-{-  if (IsNull(semantic)) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-    }-    return NULL;-  }-  if (semantic[0] == '\0') {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_module->input_variables[index];-      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-      ?  SPV_REFLECT_RESULT_SUCCESS-      : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-        : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectInterfaceVariable* spvReflectGetEntryPointInputVariableBySemantic(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  const char*                   semantic,-  SpvReflectResult*             p_result-)-{-  if (IsNull(semantic)) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-    }-    return NULL;-  }-  if (semantic[0] == '\0') {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t index = 0; index < p_entry->input_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_entry->input_variables[index];-      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-      ?  SPV_REFLECT_RESULT_SUCCESS-      : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-        : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectInterfaceVariable* spvReflectGetOutputVariableByLocation(-  const SpvReflectShaderModule*  p_module,-  uint32_t                       location,-  SpvReflectResult*              p_result-)-{-  if (location == INVALID_VALUE) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_module->output_variables[index];-      if (p_potential->location == location) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}-const SpvReflectInterfaceVariable* spvReflectGetOutputVariable(-  const SpvReflectShaderModule*  p_module,-  uint32_t                       location,-  SpvReflectResult*              p_result-)-{-  return spvReflectGetOutputVariableByLocation(p_module, location, p_result);-}--const SpvReflectInterfaceVariable* spvReflectGetEntryPointOutputVariableByLocation(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  uint32_t                      location,-  SpvReflectResult*             p_result-)-{-  if (location == INVALID_VALUE) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }--  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t index = 0; index < p_entry->output_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_entry->output_variables[index];-      if (p_potential->location == location) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectInterfaceVariable* spvReflectGetOutputVariableBySemantic(-  const SpvReflectShaderModule*  p_module,-  const char*                    semantic,-  SpvReflectResult*              p_result-)-{-  if (IsNull(semantic)) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-    }-    return NULL;-  }-  if (semantic[0] == '\0') {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_module->output_variables[index];-      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectInterfaceVariable* spvReflectGetEntryPointOutputVariableBySemantic(-  const SpvReflectShaderModule* p_module,-  const char*                   entry_point,-  const char*                   semantic,-  SpvReflectResult*             p_result)-{-  if (IsNull(semantic)) {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-    }-    return NULL;-  }-  if (semantic[0] == '\0') {-    if (IsNotNull(p_result)) {-      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-    }-    return NULL;-  }-  const SpvReflectInterfaceVariable* p_var = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t index = 0; index < p_entry->output_variable_count; ++index) {-      const SpvReflectInterfaceVariable* p_potential = p_entry->output_variables[index];-      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {-        p_var = p_potential;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_var)-      ?  SPV_REFLECT_RESULT_SUCCESS-      : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-        : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_var;-}--const SpvReflectBlockVariable* spvReflectGetPushConstantBlock(-  const SpvReflectShaderModule* p_module,-  uint32_t                      index,-  SpvReflectResult*             p_result-)-{-  const SpvReflectBlockVariable* p_push_constant = NULL;-  if (IsNotNull(p_module)) {-    if (index < p_module->push_constant_block_count) {-      p_push_constant = &p_module->push_constant_blocks[index];-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_push_constant)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_push_constant;-}-const SpvReflectBlockVariable* spvReflectGetPushConstant(-  const SpvReflectShaderModule* p_module,-  uint32_t                      index,-  SpvReflectResult*             p_result-)-{-  return spvReflectGetPushConstantBlock(p_module, index, p_result);-}--const SpvReflectBlockVariable* spvReflectGetEntryPointPushConstantBlock(-  const SpvReflectShaderModule*  p_module,-  const char*                    entry_point,-  SpvReflectResult*              p_result)-{-  const SpvReflectBlockVariable* p_push_constant = NULL;-  if (IsNotNull(p_module)) {-    const SpvReflectEntryPoint* p_entry =-        spvReflectGetEntryPoint(p_module, entry_point);-    if (IsNull(p_entry)) {-      if (IsNotNull(p_result)) {-        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-      }-      return NULL;-    }-    for (uint32_t i = 0; i < p_module->push_constant_block_count; ++i) {-      bool found = SearchSortedUint32(-        p_entry->used_push_constants,-        p_entry->used_push_constant_count,-        p_module->push_constant_blocks[i].spirv_id);-      if (found) {-        p_push_constant = &p_module->push_constant_blocks[i];-        break;-      }-    }-  }-  if (IsNotNull(p_result)) {-    *p_result = IsNotNull(p_push_constant)-        ?  SPV_REFLECT_RESULT_SUCCESS-        : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER-                            : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);-  }-  return p_push_constant;-}--SpvReflectResult spvReflectChangeDescriptorBindingNumbers(-  SpvReflectShaderModule*            p_module,-  const SpvReflectDescriptorBinding* p_binding,-  uint32_t                           new_binding_number,-  uint32_t                           new_set_binding-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_binding)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }--  SpvReflectDescriptorBinding* p_target_descriptor = NULL;-  for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {-    if(&p_module->descriptor_bindings[index] == p_binding) {-      p_target_descriptor = &p_module->descriptor_bindings[index];-      break;-    }-  }--  if (IsNotNull(p_target_descriptor)) {-    if (p_target_descriptor->word_offset.binding > (p_module->_internal->spirv_word_count - 1)) {-      return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;-    }-    // Binding number-    if (new_binding_number != (uint32_t)SPV_REFLECT_BINDING_NUMBER_DONT_CHANGE) {-      uint32_t* p_code = p_module->_internal->spirv_code + p_target_descriptor->word_offset.binding;-      *p_code = new_binding_number;-      p_target_descriptor->binding = new_binding_number;-    }-    // Set number-    if (new_set_binding != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {-      uint32_t* p_code = p_module->_internal->spirv_code + p_target_descriptor->word_offset.set;-      *p_code = new_set_binding;-      p_target_descriptor->set = new_set_binding;-    }-  }--  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;-  if (new_set_binding != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {-    result = SynchronizeDescriptorSets(p_module);-  }-  return result;-}-SpvReflectResult spvReflectChangeDescriptorBindingNumber(-  SpvReflectShaderModule*            p_module,-  const SpvReflectDescriptorBinding* p_descriptor_binding,-  uint32_t                           new_binding_number,-  uint32_t                           optional_new_set_number-)-{-  return spvReflectChangeDescriptorBindingNumbers(-    p_module,p_descriptor_binding, -    new_binding_number, -    optional_new_set_number);-}--SpvReflectResult spvReflectChangeDescriptorSetNumber(-  SpvReflectShaderModule*        p_module,-  const SpvReflectDescriptorSet* p_set,-  uint32_t                       new_set_number-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_set)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  SpvReflectDescriptorSet* p_target_set = NULL;-  for (uint32_t index = 0; index < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++index) {-    // The descriptor sets for specific entry points might not be in this set,-    // so just match on set index.-    if (p_module->descriptor_sets[index].set == p_set->set) {-      p_target_set = (SpvReflectDescriptorSet*)p_set;-      break;-    }-  }--  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;-  if (IsNotNull(p_target_set) && new_set_number != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {-    for (uint32_t index = 0; index < p_target_set->binding_count; ++index) {-      SpvReflectDescriptorBinding* p_descriptor = p_target_set->bindings[index];-      if (p_descriptor->word_offset.set > (p_module->_internal->spirv_word_count - 1)) {-        return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;-      }--      uint32_t* p_code = p_module->_internal->spirv_code + p_descriptor->word_offset.set;-      *p_code = new_set_number;-      p_descriptor->set = new_set_number;-    }--    result = SynchronizeDescriptorSets(p_module);-  }--  return result;-}--static SpvReflectResult ChangeVariableLocation(-  SpvReflectShaderModule*      p_module,-  SpvReflectInterfaceVariable* p_variable,-  uint32_t                     new_location-)-{-  if (p_variable->word_offset.location > (p_module->_internal->spirv_word_count - 1)) {-    return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;-  }-  uint32_t* p_code = p_module->_internal->spirv_code + p_variable->word_offset.location;-  *p_code = new_location;-  p_variable->location = new_location;-  return SPV_REFLECT_RESULT_SUCCESS;-}--SpvReflectResult spvReflectChangeInputVariableLocation(-  SpvReflectShaderModule*            p_module,-  const SpvReflectInterfaceVariable* p_input_variable,-  uint32_t                           new_location-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_input_variable)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {-    if(p_module->input_variables[index] == p_input_variable) {-      return ChangeVariableLocation(p_module, p_module->input_variables[index], new_location);-    }-  }-  return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-}--SpvReflectResult spvReflectChangeOutputVariableLocation(-  SpvReflectShaderModule*             p_module,-  const SpvReflectInterfaceVariable*  p_output_variable,-  uint32_t                            new_location-)-{-  if (IsNull(p_module)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  if (IsNull(p_output_variable)) {-    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;-  }-  for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {-    if(p_module->output_variables[index] == p_output_variable) {-      return ChangeVariableLocation(p_module, p_module->output_variables[index], new_location);-    }-  }-  return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;-}--const char* spvReflectSourceLanguage(SpvSourceLanguage source_lang)-{-  switch (source_lang) {-    case SpvSourceLanguageUnknown        : return "Unknown";-    case SpvSourceLanguageESSL           : return "ESSL";-    case SpvSourceLanguageGLSL           : return "GLSL";-    case SpvSourceLanguageOpenCL_C       : return "OpenCL_C";-    case SpvSourceLanguageOpenCL_CPP     : return "OpenCL_CPP";-    case SpvSourceLanguageHLSL           : return "HLSL";-    case SpvSourceLanguageCPP_for_OpenCL : return "CPP_for_OpenCL";-    case SpvSourceLanguageSYCL           : return "SYCL";-    case SpvSourceLanguageMax:-      break;-  }-  return "";-}--const char* spvReflectBlockVariableTypeName(-  const SpvReflectBlockVariable* p_var-)-{-    if (p_var == NULL) {-        return NULL;-    }-    return p_var->type_description->type_name;++#include <assert.h>+#include <stdbool.h>+#include <string.h>++#if defined(WIN32)+#define _CRTDBG_MAP_ALLOC+#include <crtdbg.h>+#include <stdlib.h>+#else+#include <stdlib.h>+#endif++#if defined(__clang__) || (defined(__GNUC__) && __GNUC__ >= 7) || defined(__APPLE_CC__)+#define FALLTHROUGH __attribute__((fallthrough))+#else+#define FALLTHROUGH+#endif++#if defined(SPIRV_REFLECT_ENABLE_ASSERTS)+#define SPV_REFLECT_ASSERT(COND) assert(COND);+#else+#define SPV_REFLECT_ASSERT(COND)+#endif++// clang-format off+enum {+  SPIRV_STARTING_WORD_INDEX       = 5,+  SPIRV_WORD_SIZE                 = sizeof(uint32_t),+  SPIRV_BYTE_WIDTH                = 8,+  SPIRV_MINIMUM_FILE_SIZE         = SPIRV_STARTING_WORD_INDEX * SPIRV_WORD_SIZE,+  SPIRV_DATA_ALIGNMENT            = 4 * SPIRV_WORD_SIZE, // 16+  SPIRV_ACCESS_CHAIN_INDEX_OFFSET = 4,+};++enum {+  INVALID_VALUE  = 0xFFFFFFFF,+};++enum {+  MAX_NODE_NAME_LENGTH        = 1024,+  // Number of unique PhysicalStorageBuffer structs tracked to detect recursion+  MAX_RECURSIVE_PHYSICAL_POINTER_CHECK = 128,+};++enum {+  IMAGE_SAMPLED = 1,+  IMAGE_STORAGE = 2,+};++typedef struct SpvReflectPrvArrayTraits {+  uint32_t                        element_type_id;+  uint32_t                        length_id;+} SpvReflectPrvArrayTraits;++typedef struct SpvReflectPrvImageTraits {+  uint32_t                        sampled_type_id;+  SpvDim                          dim;+  uint32_t                        depth;+  uint32_t                        arrayed;+  uint32_t                        ms;+  uint32_t                        sampled;+  SpvImageFormat                  image_format;+} SpvReflectPrvImageTraits;++typedef struct SpvReflectPrvNumberDecoration {+  uint32_t                        word_offset;+  uint32_t                        value;+} SpvReflectPrvNumberDecoration;++typedef struct SpvReflectPrvStringDecoration {+  uint32_t                        word_offset;+  const char*                     value;+} SpvReflectPrvStringDecoration;++typedef struct SpvReflectPrvDecorations {+  bool                            is_relaxed_precision;+  bool                            is_block;+  bool                            is_buffer_block;+  bool                            is_row_major;+  bool                            is_column_major;+  bool                            is_built_in;+  bool                            is_noperspective;+  bool                            is_flat;+  bool                            is_non_writable;+  bool                            is_non_readable;+  bool                            is_patch;+  bool                            is_per_vertex;+  bool                            is_per_task;+  bool                            is_weight_texture;+  bool                            is_block_match_texture;+  SpvReflectUserType              user_type;+  SpvReflectPrvNumberDecoration   set;+  SpvReflectPrvNumberDecoration   binding;+  SpvReflectPrvNumberDecoration   input_attachment_index;+  SpvReflectPrvNumberDecoration   location;+  SpvReflectPrvNumberDecoration   component;+  SpvReflectPrvNumberDecoration   offset;+  SpvReflectPrvNumberDecoration   uav_counter_buffer;+  SpvReflectPrvStringDecoration   semantic;+  uint32_t                        array_stride;+  uint32_t                        matrix_stride;+  uint32_t                        spec_id;+  SpvBuiltIn                      built_in;+} SpvReflectPrvDecorations;++typedef struct SpvReflectPrvNode {+  uint32_t                        result_id;+  SpvOp                           op;+  uint32_t                        result_type_id;+  uint32_t                        type_id;+  SpvCapability                   capability;+  SpvStorageClass                 storage_class;+  uint32_t                        word_offset;+  uint32_t                        word_count;+  bool                            is_type;++  SpvReflectPrvArrayTraits        array_traits;+  SpvReflectPrvImageTraits        image_traits;+  uint32_t                        image_type_id;++  const char*                     name;+  SpvReflectPrvDecorations        decorations;+  uint32_t                        member_count;+  const char**                    member_names;+  SpvReflectPrvDecorations*       member_decorations;+} SpvReflectPrvNode;++typedef struct SpvReflectPrvString {+  uint32_t                        result_id;+  const char*                     string;+} SpvReflectPrvString;++// There are a limit set of instructions that can touch an OpVariable,+// these are represented here with how it was accessed+// Examples:+//    OpImageRead  -> OpLoad -> OpVariable+//    OpImageWrite -> OpLoad -> OpVariable+//    OpStore      -> OpAccessChain -> OpAccessChain -> OpVariable+//    OpAtomicIAdd -> OpAccessChain -> OpVariable+//    OpAtomicLoad -> OpImageTexelPointer -> OpVariable+typedef struct SpvReflectPrvAccessedVariable {+  SpvReflectPrvNode*     p_node;+  uint32_t               result_id;+  uint32_t               variable_ptr;+  uint32_t               function_id;+  uint32_t               function_parameter_index;+} SpvReflectPrvAccessedVariable;++typedef struct SpvReflectPrvFunction {+  uint32_t                        id;+  uint32_t                        parameter_count;+  uint32_t*                       parameters;+  uint32_t                        callee_count;+  uint32_t*                       callees;+  struct SpvReflectPrvFunction**  callee_ptrs;+  uint32_t                        accessed_variable_count;+  SpvReflectPrvAccessedVariable*  accessed_variables;+} SpvReflectPrvFunction;++typedef struct SpvReflectPrvAccessChain {+  uint32_t                        result_id;+  uint32_t                        result_type_id;+  //+  // Pointing to the base of a composite object.+  // Generally the id of descriptor block variable+  uint32_t                        base_id;+  //+  // From spec:+  //   The first index in Indexes will select the+  //   top-level member/element/component/element+  //   of the base composite+  uint32_t                        index_count;+  uint32_t*                       indexes;+  //+  // Block variable ac is pointing to (for block references)+  SpvReflectBlockVariable*        block_var;+} SpvReflectPrvAccessChain;++// To prevent infinite recursion, we never walk down a+// PhysicalStorageBuffer struct twice, but incase a 2nd variable+// needs to use that struct, save a copy+typedef struct SpvReflectPrvPhysicalPointerStruct {+    uint32_t struct_id;+    // first variable to see the PhysicalStorageBuffer struct+    SpvReflectBlockVariable* p_var;+} SpvReflectPrvPhysicalPointerStruct;++typedef struct SpvReflectPrvParser {+  size_t                          spirv_word_count;+  uint32_t*                       spirv_code;+  uint32_t                        string_count;+  SpvReflectPrvString*            strings;+  SpvSourceLanguage               source_language;+  uint32_t                        source_language_version;+  uint32_t                        source_file_id;+  const char*                     source_embedded;+  size_t                          node_count;+  SpvReflectPrvNode*              nodes;+  uint32_t                        entry_point_count;+  uint32_t                        capability_count;+  uint32_t                        function_count;+  SpvReflectPrvFunction*          functions;+  uint32_t                        access_chain_count;+  SpvReflectPrvAccessChain*       access_chains;++  uint32_t                        type_count;+  uint32_t                        descriptor_count;+  uint32_t                        push_constant_count;++  SpvReflectTypeDescription*      physical_pointer_check[MAX_RECURSIVE_PHYSICAL_POINTER_CHECK];+  uint32_t                        physical_pointer_count;++  SpvReflectPrvPhysicalPointerStruct* physical_pointer_structs;+  uint32_t                            physical_pointer_struct_count;+} SpvReflectPrvParser;+// clang-format on++static uint32_t Max(uint32_t a, uint32_t b) { return a > b ? a : b; }+static uint32_t Min(uint32_t a, uint32_t b) { return a < b ? a : b; }++static uint32_t RoundUp(uint32_t value, uint32_t multiple) {+  assert(multiple && ((multiple & (multiple - 1)) == 0));+  return (value + multiple - 1) & ~(multiple - 1);+}++#define IsNull(ptr) (ptr == NULL)++#define IsNotNull(ptr) (ptr != NULL)++#define SafeFree(ptr) \+  {                   \+    free((void*)ptr); \+    ptr = NULL;       \+  }++static int SortCompareUint32(const void* a, const void* b) {+  const uint32_t* p_a = (const uint32_t*)a;+  const uint32_t* p_b = (const uint32_t*)b;++  return (int)*p_a - (int)*p_b;+}++static int SortCompareAccessedVariable(const void* a, const void* b) {+  const SpvReflectPrvAccessedVariable* p_a = (const SpvReflectPrvAccessedVariable*)a;+  const SpvReflectPrvAccessedVariable* p_b = (const SpvReflectPrvAccessedVariable*)b;++  return (int)p_a->variable_ptr - (int)p_b->variable_ptr;+}++//+// De-duplicates a sorted array and returns the new size.+//+// Note: The array doesn't actually need to be sorted, just+// arranged into "runs" so that all the entries with one+// value are adjacent.+//+static size_t DedupSortedUint32(uint32_t* arr, size_t size) {+  if (size == 0) {+    return 0;+  }+  size_t dedup_idx = 0;+  for (size_t i = 0; i < size; ++i) {+    if (arr[dedup_idx] != arr[i]) {+      ++dedup_idx;+      arr[dedup_idx] = arr[i];+    }+  }+  return dedup_idx + 1;+}++static bool SearchSortedUint32(const uint32_t* arr, size_t size, uint32_t target) {+  size_t lo = 0;+  size_t hi = size;+  while (lo < hi) {+    size_t mid = (hi - lo) / 2 + lo;+    if (arr[mid] == target) {+      return true;+    } else if (arr[mid] < target) {+      lo = mid + 1;+    } else {+      hi = mid;+    }+  }+  return false;+}++static SpvReflectResult IntersectSortedAccessedVariable(const SpvReflectPrvAccessedVariable* p_arr0, size_t arr0_size,+                                                        const uint32_t* p_arr1, size_t arr1_size, uint32_t** pp_res,+                                                        size_t* res_size) {+  *pp_res = NULL;+  *res_size = 0;+  if (IsNull(p_arr0) || IsNull(p_arr1)) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  const SpvReflectPrvAccessedVariable* p_arr0_end = p_arr0 + arr0_size;+  const uint32_t* p_arr1_end = p_arr1 + arr1_size;++  const SpvReflectPrvAccessedVariable* p_idx0 = p_arr0;+  const uint32_t* p_idx1 = p_arr1;+  while (p_idx0 != p_arr0_end && p_idx1 != p_arr1_end) {+    if (p_idx0->variable_ptr < *p_idx1) {+      ++p_idx0;+    } else if (p_idx0->variable_ptr > *p_idx1) {+      ++p_idx1;+    } else {+      ++*res_size;+      ++p_idx0;+      ++p_idx1;+    }+  }++  if (*res_size > 0) {+    *pp_res = (uint32_t*)calloc(*res_size, sizeof(**pp_res));+    if (IsNull(*pp_res)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+    uint32_t* p_idxr = *pp_res;+    p_idx0 = p_arr0;+    p_idx1 = p_arr1;+    while (p_idx0 != p_arr0_end && p_idx1 != p_arr1_end) {+      if (p_idx0->variable_ptr < *p_idx1) {+        ++p_idx0;+      } else if (p_idx0->variable_ptr > *p_idx1) {+        ++p_idx1;+      } else {+        *(p_idxr++) = p_idx0->variable_ptr;+        ++p_idx0;+        ++p_idx1;+      }+    }+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++static bool InRange(const SpvReflectPrvParser* p_parser, uint32_t index) {+  bool in_range = false;+  if (IsNotNull(p_parser)) {+    in_range = (index < p_parser->spirv_word_count);+  }+  return in_range;+}++static SpvReflectResult ReadU32(SpvReflectPrvParser* p_parser, uint32_t word_offset, uint32_t* p_value) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(InRange(p_parser, word_offset));+  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;+  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && InRange(p_parser, word_offset)) {+    *p_value = *(p_parser->spirv_code + word_offset);+    result = SPV_REFLECT_RESULT_SUCCESS;+  }+  return result;+}++#define UNCHECKED_READU32(parser, word_offset, value) \+  { (void)ReadU32(parser, word_offset, (uint32_t*)&(value)); }++#define CHECKED_READU32(parser, word_offset, value)                                              \+  {                                                                                              \+    SpvReflectResult checked_readu32_result = ReadU32(parser, word_offset, (uint32_t*)&(value)); \+    if (checked_readu32_result != SPV_REFLECT_RESULT_SUCCESS) {                                  \+      return checked_readu32_result;                                                             \+    }                                                                                            \+  }++#define CHECKED_READU32_CAST(parser, word_offset, cast_to_type, value)                                                   \+  {                                                                                                                      \+    uint32_t checked_readu32_cast_u32 = UINT32_MAX;                                                                      \+    SpvReflectResult checked_readu32_cast_result = ReadU32(parser, word_offset, (uint32_t*)&(checked_readu32_cast_u32)); \+    if (checked_readu32_cast_result != SPV_REFLECT_RESULT_SUCCESS) {                                                     \+      return checked_readu32_cast_result;                                                                                \+    }                                                                                                                    \+    value = (cast_to_type)checked_readu32_cast_u32;                                                                      \+  }++#define IF_READU32(result, parser, word_offset, value)          \+  if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                 \+    result = ReadU32(parser, word_offset, (uint32_t*)&(value)); \+  }++#define IF_READU32_CAST(result, parser, word_offset, cast_to_type, value) \+  if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                           \+    uint32_t if_readu32_cast_u32 = UINT32_MAX;                            \+    result = ReadU32(parser, word_offset, &if_readu32_cast_u32);          \+    if ((result) == SPV_REFLECT_RESULT_SUCCESS) {                         \+      value = (cast_to_type)if_readu32_cast_u32;                          \+    }                                                                     \+  }++static SpvReflectResult ReadStr(SpvReflectPrvParser* p_parser, uint32_t word_offset, uint32_t word_index, uint32_t word_count,+                                uint32_t* p_buf_size, char* p_buf) {+  uint32_t limit = (word_offset + word_count);+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(InRange(p_parser, limit));+  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;+  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && InRange(p_parser, limit)) {+    const char* c_str = (const char*)(p_parser->spirv_code + word_offset + word_index);+    uint32_t n = word_count * SPIRV_WORD_SIZE;+    uint32_t length_with_terminator = 0;+    for (uint32_t i = 0; i < n; ++i) {+      char c = *(c_str + i);+      if (c == 0) {+        length_with_terminator = i + 1;+        break;+      }+    }++    if (length_with_terminator > 0) {+      result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+      if (IsNotNull(p_buf_size) && IsNotNull(p_buf)) {+        result = SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;+        if (length_with_terminator <= *p_buf_size) {+          memset(p_buf, 0, *p_buf_size);+          memcpy(p_buf, c_str, length_with_terminator);+          result = SPV_REFLECT_RESULT_SUCCESS;+        }+      } else {+        if (IsNotNull(p_buf_size)) {+          *p_buf_size = length_with_terminator;+          result = SPV_REFLECT_RESULT_SUCCESS;+        }+      }+    }+  }+  return result;+}++static SpvReflectDecorationFlags ApplyDecorations(const SpvReflectPrvDecorations* p_decoration_fields) {+  SpvReflectDecorationFlags decorations = SPV_REFLECT_DECORATION_NONE;+  if (p_decoration_fields->is_relaxed_precision) {+    decorations |= SPV_REFLECT_DECORATION_RELAXED_PRECISION;+  }+  if (p_decoration_fields->is_block) {+    decorations |= SPV_REFLECT_DECORATION_BLOCK;+  }+  if (p_decoration_fields->is_buffer_block) {+    decorations |= SPV_REFLECT_DECORATION_BUFFER_BLOCK;+  }+  if (p_decoration_fields->is_row_major) {+    decorations |= SPV_REFLECT_DECORATION_ROW_MAJOR;+  }+  if (p_decoration_fields->is_column_major) {+    decorations |= SPV_REFLECT_DECORATION_COLUMN_MAJOR;+  }+  if (p_decoration_fields->is_built_in) {+    decorations |= SPV_REFLECT_DECORATION_BUILT_IN;+  }+  if (p_decoration_fields->is_noperspective) {+    decorations |= SPV_REFLECT_DECORATION_NOPERSPECTIVE;+  }+  if (p_decoration_fields->is_flat) {+    decorations |= SPV_REFLECT_DECORATION_FLAT;+  }+  if (p_decoration_fields->is_non_writable) {+    decorations |= SPV_REFLECT_DECORATION_NON_WRITABLE;+  }+  if (p_decoration_fields->is_non_readable) {+    decorations |= SPV_REFLECT_DECORATION_NON_READABLE;+  }+  if (p_decoration_fields->is_patch) {+    decorations |= SPV_REFLECT_DECORATION_PATCH;+  }+  if (p_decoration_fields->is_per_vertex) {+    decorations |= SPV_REFLECT_DECORATION_PER_VERTEX;+  }+  if (p_decoration_fields->is_per_task) {+    decorations |= SPV_REFLECT_DECORATION_PER_TASK;+  }+  if (p_decoration_fields->is_weight_texture) {+    decorations |= SPV_REFLECT_DECORATION_WEIGHT_TEXTURE;+  }+  if (p_decoration_fields->is_block_match_texture) {+    decorations |= SPV_REFLECT_DECORATION_BLOCK_MATCH_TEXTURE;+  }+  return decorations;+}++static void ApplyNumericTraits(const SpvReflectTypeDescription* p_type, SpvReflectNumericTraits* p_numeric_traits) {+  memcpy(p_numeric_traits, &p_type->traits.numeric, sizeof(p_type->traits.numeric));+}++static void ApplyArrayTraits(const SpvReflectTypeDescription* p_type, SpvReflectArrayTraits* p_array_traits) {+  memcpy(p_array_traits, &p_type->traits.array, sizeof(p_type->traits.array));+}++static bool IsSpecConstant(const SpvReflectPrvNode* p_node) {+  return (p_node->op == SpvOpSpecConstant || p_node->op == SpvOpSpecConstantOp || p_node->op == SpvOpSpecConstantTrue ||+          p_node->op == SpvOpSpecConstantFalse);+}++static SpvReflectPrvNode* FindNode(SpvReflectPrvParser* p_parser, uint32_t result_id) {+  SpvReflectPrvNode* p_node = NULL;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_elem = &(p_parser->nodes[i]);+    if (p_elem->result_id == result_id) {+      p_node = p_elem;+      break;+    }+  }+  return p_node;+}++static SpvReflectTypeDescription* FindType(SpvReflectShaderModule* p_module, uint32_t type_id) {+  SpvReflectTypeDescription* p_type = NULL;+  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {+    SpvReflectTypeDescription* p_elem = &(p_module->_internal->type_descriptions[i]);+    if (p_elem->id == type_id) {+      p_type = p_elem;+      break;+    }+  }+  return p_type;+}++static SpvReflectPrvAccessChain* FindAccessChain(SpvReflectPrvParser* p_parser, uint32_t id) {+  const uint32_t ac_count = p_parser->access_chain_count;+  for (uint32_t i = 0; i < ac_count; i++) {+    if (p_parser->access_chains[i].result_id == id) {+      return &p_parser->access_chains[i];+    }+  }+  return 0;+}++// Access Chains mostly have their Base ID pointed directly to a OpVariable, but sometimes+// it will be through a load and this funciton handles the edge cases how to find that+static uint32_t FindAccessChainBaseVariable(SpvReflectPrvParser* p_parser, SpvReflectPrvAccessChain* p_access_chain) {+  uint32_t base_id = p_access_chain->base_id;+  SpvReflectPrvNode* base_node = FindNode(p_parser, base_id);+  // TODO - This is just a band-aid to fix crashes.+  // Need to understand why here and hopefully remove+  // https://github.com/KhronosGroup/SPIRV-Reflect/pull/206+  if (IsNull(base_node)) {+    return 0;+  }+  while (base_node->op != SpvOpVariable) {+    switch (base_node->op) {+      case SpvOpLoad: {+        UNCHECKED_READU32(p_parser, base_node->word_offset + 3, base_id);+      } break;+      case SpvOpFunctionParameter: {+        UNCHECKED_READU32(p_parser, base_node->word_offset + 2, base_id);+      } break;+      case SpvOpBitcast:+        // This can be caused by something like GL_EXT_buffer_reference_uvec2 trying to load a pointer.+        // We currently call from a push constant, so no way to have a reference loop back into the PC block+        return 0;+      default: {+        assert(false);+      } break;+    }++    SpvReflectPrvAccessChain* base_ac = FindAccessChain(p_parser, base_id);+    if (base_ac == 0) {+      return 0;+    }+    base_id = base_ac->base_id;+    base_node = FindNode(p_parser, base_id);+    if (IsNull(base_node)) {+      return 0;+    }+  }+  return base_id;+}++static SpvReflectBlockVariable* GetRefBlkVar(SpvReflectPrvParser* p_parser, SpvReflectPrvAccessChain* p_access_chain) {+  uint32_t base_id = p_access_chain->base_id;+  SpvReflectPrvNode* base_node = FindNode(p_parser, base_id);+  assert(base_node->op == SpvOpLoad);+  UNCHECKED_READU32(p_parser, base_node->word_offset + 3, base_id);+  SpvReflectPrvAccessChain* base_ac = FindAccessChain(p_parser, base_id);+  assert(base_ac != 0);+  SpvReflectBlockVariable* base_var = base_ac->block_var;+  assert(base_var != 0);+  return base_var;+}++bool IsPointerToPointer(SpvReflectPrvParser* p_parser, uint32_t type_id) {+  SpvReflectPrvNode* ptr_node = FindNode(p_parser, type_id);+  if (IsNull(ptr_node) || (ptr_node->op != SpvOpTypePointer)) {+    return false;+  }+  uint32_t pte_id = 0;+  UNCHECKED_READU32(p_parser, ptr_node->word_offset + 3, pte_id);+  SpvReflectPrvNode* pte_node = FindNode(p_parser, pte_id);+  if (IsNull(pte_node)) {+    return false;+  }+  return pte_node->op == SpvOpTypePointer;+}++static SpvReflectResult CreateParser(size_t size, void* p_code, SpvReflectPrvParser* p_parser) {+  if (p_code == NULL) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (size < SPIRV_MINIMUM_FILE_SIZE) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_CODE_SIZE;+  }+  if ((size % 4) != 0) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_CODE_SIZE;+  }++  p_parser->spirv_word_count = size / SPIRV_WORD_SIZE;+  p_parser->spirv_code = (uint32_t*)p_code;++  if (p_parser->spirv_code[0] != SpvMagicNumber) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_MAGIC_NUMBER;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static void DestroyParser(SpvReflectPrvParser* p_parser) {+  if (!IsNull(p_parser->nodes)) {+    // Free nodes+    for (size_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if (IsNotNull(p_node->member_names)) {+        SafeFree(p_node->member_names);+      }+      if (IsNotNull(p_node->member_decorations)) {+        SafeFree(p_node->member_decorations);+      }+    }++    // Free functions+    for (size_t i = 0; i < p_parser->function_count; ++i) {+      SafeFree(p_parser->functions[i].parameters);+      SafeFree(p_parser->functions[i].callees);+      SafeFree(p_parser->functions[i].callee_ptrs);+      SafeFree(p_parser->functions[i].accessed_variables);+    }++    // Free access chains+    for (uint32_t i = 0; i < p_parser->access_chain_count; ++i) {+      SafeFree(p_parser->access_chains[i].indexes);+    }++    SafeFree(p_parser->nodes);+    SafeFree(p_parser->strings);+    SafeFree(p_parser->source_embedded);+    SafeFree(p_parser->functions);+    SafeFree(p_parser->access_chains);++    if (IsNotNull(p_parser->physical_pointer_structs)) {+      SafeFree(p_parser->physical_pointer_structs);+    }+    p_parser->node_count = 0;+  }+}++static SpvReflectResult ParseNodes(SpvReflectPrvParser* p_parser) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));++  uint32_t* p_spirv = p_parser->spirv_code;+  uint32_t spirv_word_index = SPIRV_STARTING_WORD_INDEX;++  // Count nodes+  uint32_t node_count = 0;+  while (spirv_word_index < p_parser->spirv_word_count) {+    uint32_t word = p_spirv[spirv_word_index];+    SpvOp op = (SpvOp)(word & 0xFFFF);+    uint32_t node_word_count = (word >> 16) & 0xFFFF;+    if (node_word_count == 0) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_INSTRUCTION;+    }+    if (op == SpvOpAccessChain) {+      ++(p_parser->access_chain_count);+    }+    spirv_word_index += node_word_count;+    ++node_count;+  }++  if (node_count == 0) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_EOF;+  }++  // Allocate nodes+  p_parser->node_count = node_count;+  p_parser->nodes = (SpvReflectPrvNode*)calloc(p_parser->node_count, sizeof(*(p_parser->nodes)));+  if (IsNull(p_parser->nodes)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }+  // Mark all nodes with an invalid state+  for (uint32_t i = 0; i < node_count; ++i) {+    p_parser->nodes[i].op = (SpvOp)INVALID_VALUE;+    p_parser->nodes[i].storage_class = (SpvStorageClass)INVALID_VALUE;+    p_parser->nodes[i].decorations.set.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.binding.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.location.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.component.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.offset.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.uav_counter_buffer.value = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.spec_id = (uint32_t)INVALID_VALUE;+    p_parser->nodes[i].decorations.built_in = (SpvBuiltIn)INVALID_VALUE;+  }+  // Mark source file id node+  p_parser->source_file_id = (uint32_t)INVALID_VALUE;+  p_parser->source_embedded = NULL;++  // Function node+  uint32_t function_node = (uint32_t)INVALID_VALUE;++  // Allocate access chain+  if (p_parser->access_chain_count > 0) {+    p_parser->access_chains = (SpvReflectPrvAccessChain*)calloc(p_parser->access_chain_count, sizeof(*(p_parser->access_chains)));+    if (IsNull(p_parser->access_chains)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  // Parse nodes+  uint32_t node_index = 0;+  uint32_t access_chain_index = 0;+  spirv_word_index = SPIRV_STARTING_WORD_INDEX;+  while (spirv_word_index < p_parser->spirv_word_count) {+    uint32_t word = p_spirv[spirv_word_index];+    SpvOp op = (SpvOp)(word & 0xFFFF);+    uint32_t node_word_count = (word >> 16) & 0xFFFF;++    SpvReflectPrvNode* p_node = &(p_parser->nodes[node_index]);+    p_node->op = op;+    p_node->word_offset = spirv_word_index;+    p_node->word_count = node_word_count;++    switch (p_node->op) {+      default:+        break;++      case SpvOpString: {+        ++(p_parser->string_count);+      } break;++      case SpvOpSource: {+        CHECKED_READU32_CAST(p_parser, p_node->word_offset + 1, SpvSourceLanguage, p_parser->source_language);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_parser->source_language_version);+        if (p_node->word_count >= 4) {+          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_parser->source_file_id);+        }+        if (p_node->word_count >= 5) {+          const char* p_source = (const char*)(p_parser->spirv_code + p_node->word_offset + 4);++          const size_t source_len = strlen(p_source);+          char* p_source_temp = (char*)calloc(source_len + 1, sizeof(char));++          if (IsNull(p_source_temp)) {+            return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+          }++#ifdef _WIN32+          strcpy_s(p_source_temp, source_len + 1, p_source);+#else+          strcpy(p_source_temp, p_source);+#endif++          SafeFree(p_parser->source_embedded);+          p_parser->source_embedded = p_source_temp;+        }+      } break;++      case SpvOpSourceContinued: {+        const char* p_source = (const char*)(p_parser->spirv_code + p_node->word_offset + 1);++        const size_t source_len = strlen(p_source);+        const size_t embedded_source_len = strlen(p_parser->source_embedded);+        char* p_continued_source = (char*)calloc(source_len + embedded_source_len + 1, sizeof(char));++        if (IsNull(p_continued_source)) {+          return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+        }++#ifdef _WIN32+        strcpy_s(p_continued_source, embedded_source_len + 1, p_parser->source_embedded);+        strcat_s(p_continued_source, embedded_source_len + source_len + 1, p_source);+#else+        strcpy(p_continued_source, p_parser->source_embedded);+        strcat(p_continued_source, p_source);+#endif++        SafeFree(p_parser->source_embedded);+        p_parser->source_embedded = p_continued_source;+      } break;++      case SpvOpEntryPoint: {+        ++(p_parser->entry_point_count);+      } break;++      case SpvOpCapability: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->capability);+        ++(p_parser->capability_count);+      } break;++      case SpvOpName:+      case SpvOpMemberName: {+        uint32_t member_offset = (p_node->op == SpvOpMemberName) ? 1 : 0;+        uint32_t name_start = p_node->word_offset + member_offset + 2;+        p_node->name = (const char*)(p_parser->spirv_code + name_start);+      } break;++      case SpvOpTypeStruct: {+        p_node->member_count = p_node->word_count - 2;+        FALLTHROUGH;+      }  // Fall through++      // This is all the rest of OpType* that need to be tracked+      // Possible new extensions might expose new type, will need to be added+      // here+      case SpvOpTypeVoid:+      case SpvOpTypeBool:+      case SpvOpTypeInt:+      case SpvOpTypeFloat:+      case SpvOpTypeVector:+      case SpvOpTypeMatrix:+      case SpvOpTypeSampler:+      case SpvOpTypeOpaque:+      case SpvOpTypeFunction:+      case SpvOpTypeEvent:+      case SpvOpTypeDeviceEvent:+      case SpvOpTypeReserveId:+      case SpvOpTypeQueue:+      case SpvOpTypePipe:+      case SpvOpTypeAccelerationStructureKHR:+      case SpvOpTypeRayQueryKHR:+      case SpvOpTypeHitObjectNV:+      case SpvOpTypeCooperativeMatrixNV:+      case SpvOpTypeCooperativeMatrixKHR: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        p_node->is_type = true;+      } break;++      case SpvOpTypeImage: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->image_traits.sampled_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->image_traits.dim);+        CHECKED_READU32(p_parser, p_node->word_offset + 4, p_node->image_traits.depth);+        CHECKED_READU32(p_parser, p_node->word_offset + 5, p_node->image_traits.arrayed);+        CHECKED_READU32(p_parser, p_node->word_offset + 6, p_node->image_traits.ms);+        CHECKED_READU32(p_parser, p_node->word_offset + 7, p_node->image_traits.sampled);+        CHECKED_READU32(p_parser, p_node->word_offset + 8, p_node->image_traits.image_format);+        p_node->is_type = true;+      } break;++      case SpvOpTypeSampledImage: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->image_type_id);+        p_node->is_type = true;+      } break;++      case SpvOpTypeArray: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->array_traits.element_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->array_traits.length_id);+        p_node->is_type = true;+      } break;++      case SpvOpTypeRuntimeArray: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->array_traits.element_type_id);+        p_node->is_type = true;+      } break;++      case SpvOpTypePointer: {+        uint32_t result_id;+        CHECKED_READU32(p_parser, p_node->word_offset + 1, result_id);+        // Look for forward pointer. Clear result id if found+        SpvReflectPrvNode* p_fwd_node = FindNode(p_parser, result_id);+        if (p_fwd_node) {+          p_fwd_node->result_id = 0;+        }+        // Register pointer type+        p_node->result_id = result_id;+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->storage_class);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->type_id);+        p_node->is_type = true;+      } break;++      case SpvOpTypeForwardPointer: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->storage_class);+        p_node->is_type = true;+      } break;++      case SpvOpConstantTrue:+      case SpvOpConstantFalse:+      case SpvOpConstant:+      case SpvOpConstantComposite:+      case SpvOpConstantSampler:+      case SpvOpConstantNull: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+      } break;++      case SpvOpSpecConstantTrue:+      case SpvOpSpecConstantFalse:+      case SpvOpSpecConstant:+      case SpvOpSpecConstantComposite:+      case SpvOpSpecConstantOp: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+      } break;++      case SpvOpVariable: {+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_node->storage_class);+      } break;++      case SpvOpLoad: {+        // Only load enough so OpDecorate can reference the node, skip the remaining operands.+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_node->result_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+      } break;++      case SpvOpAccessChain: {+        SpvReflectPrvAccessChain* p_access_chain = &(p_parser->access_chains[access_chain_index]);+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_access_chain->result_type_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_access_chain->result_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_access_chain->base_id);+        //+        // SPIRV_ACCESS_CHAIN_INDEX_OFFSET (4) is the number of words up until the first index:+        //   [Node, Result Type Id, Result Id, Base Id, <Indexes>]+        //+        p_access_chain->index_count = (node_word_count - SPIRV_ACCESS_CHAIN_INDEX_OFFSET);+        if (p_access_chain->index_count > 0) {+          p_access_chain->indexes = (uint32_t*)calloc(p_access_chain->index_count, sizeof(*(p_access_chain->indexes)));+          if (IsNull(p_access_chain->indexes)) {+            return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+          }+          // Parse any index values for access chain+          for (uint32_t index_index = 0; index_index < p_access_chain->index_count; ++index_index) {+            // Read index id+            uint32_t index_id = 0;+            CHECKED_READU32(p_parser, p_node->word_offset + SPIRV_ACCESS_CHAIN_INDEX_OFFSET + index_index, index_id);+            // Find OpConstant node that contains index value+            SpvReflectPrvNode* p_index_value_node = FindNode(p_parser, index_id);+            if ((p_index_value_node != NULL) &&+                (p_index_value_node->op == SpvOpConstant || p_index_value_node->op == SpvOpSpecConstant)) {+              // Read index value+              uint32_t index_value = UINT32_MAX;+              CHECKED_READU32(p_parser, p_index_value_node->word_offset + 3, index_value);+              assert(index_value != UINT32_MAX);+              // Write index value to array+              p_access_chain->indexes[index_index] = index_value;+            }+          }+        }+        ++access_chain_index;+      } break;++      case SpvOpFunction: {+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+        // Count function definitions, not function declarations.  To determine+        // the difference, set an in-function variable, and then if an OpLabel+        // is reached before the end of the function increment the function+        // count.+        function_node = node_index;+      } break;++      case SpvOpLabel: {+        if (function_node != (uint32_t)INVALID_VALUE) {+          SpvReflectPrvNode* p_func_node = &(p_parser->nodes[function_node]);+          CHECKED_READU32(p_parser, p_func_node->word_offset + 2, p_func_node->result_id);+          ++(p_parser->function_count);+        }+        FALLTHROUGH;+      }  // Fall through++      case SpvOpFunctionEnd: {+        function_node = (uint32_t)INVALID_VALUE;+      } break;+      case SpvOpFunctionParameter: {+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+      } break;+      case SpvOpBitcast:+      case SpvOpShiftRightLogical:+      case SpvOpIAdd:+      case SpvOpISub:+      case SpvOpIMul:+      case SpvOpUDiv:+      case SpvOpSDiv: {+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_node->result_id);+      } break;+    }++    if (p_node->is_type) {+      ++(p_parser->type_count);+    }++    spirv_word_index += node_word_count;+    ++node_index;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseStrings(SpvReflectPrvParser* p_parser) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(IsNotNull(p_parser->nodes));++  // Early out+  if (p_parser->string_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {+    // Allocate string storage+    p_parser->strings = (SpvReflectPrvString*)calloc(p_parser->string_count, sizeof(*(p_parser->strings)));++    uint32_t string_index = 0;+    for (size_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if (p_node->op != SpvOpString) {+        continue;+      }++      // Paranoid check against string count+      assert(string_index < p_parser->string_count);+      if (string_index >= p_parser->string_count) {+        return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+      }++      // Result id+      SpvReflectPrvString* p_string = &(p_parser->strings[string_index]);+      CHECKED_READU32(p_parser, p_node->word_offset + 1, p_string->result_id);++      // String+      uint32_t string_start = p_node->word_offset + 2;+      p_string->string = (const char*)(p_parser->spirv_code + string_start);++      // Increment string index+      ++string_index;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseSource(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code)) {+    // Source file+    if (IsNotNull(p_parser->strings)) {+      for (uint32_t i = 0; i < p_parser->string_count; ++i) {+        SpvReflectPrvString* p_string = &(p_parser->strings[i]);+        if (p_string->result_id == p_parser->source_file_id) {+          p_module->source_file = p_string->string;+          break;+        }+      }+    }++    // Source code+    if (IsNotNull(p_parser->source_embedded)) {+      const size_t source_len = strlen(p_parser->source_embedded);+      char* p_source = (char*)calloc(source_len + 1, sizeof(char));++      if (IsNull(p_source)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }++#ifdef _WIN32+      strcpy_s(p_source, source_len + 1, p_parser->source_embedded);+#else+      strcpy(p_source, p_parser->source_embedded);+#endif++      p_module->source_source = p_source;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseFunction(SpvReflectPrvParser* p_parser, SpvReflectPrvNode* p_func_node, SpvReflectPrvFunction* p_func,+                                      size_t first_label_index) {+  p_func->id = p_func_node->result_id;++  p_func->parameter_count = 0;+  p_func->callee_count = 0;+  p_func->accessed_variable_count = 0;++  // First get count to know how much to allocate+  for (size_t i = first_label_index; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (p_node->op == SpvOpFunctionEnd) {+      break;+    }+    switch (p_node->op) {+      case SpvOpFunctionParameter: {+        ++(p_func->parameter_count);+      } break;+      case SpvOpFunctionCall: {+        p_func->accessed_variable_count += p_node->word_count - 4;+        ++(p_func->callee_count);+      } break;+      case SpvOpLoad:+      case SpvOpAccessChain:+      case SpvOpInBoundsAccessChain:+      case SpvOpPtrAccessChain:+      case SpvOpArrayLength:+      case SpvOpGenericPtrMemSemantics:+      case SpvOpInBoundsPtrAccessChain:+      case SpvOpStore:+      case SpvOpImageTexelPointer: {+        ++(p_func->accessed_variable_count);+      } break;+      case SpvOpCopyMemory:+      case SpvOpCopyMemorySized: {+        p_func->accessed_variable_count += 2;+      } break;+      default:+        break;+    }+  }++  if (p_func->parameter_count > 0) {+    p_func->parameters = (uint32_t*)calloc(p_func->parameter_count, sizeof(*(p_func->parameters)));+    if (IsNull(p_func->parameters)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  if (p_func->callee_count > 0) {+    p_func->callees = (uint32_t*)calloc(p_func->callee_count, sizeof(*(p_func->callees)));+    if (IsNull(p_func->callees)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  if (p_func->accessed_variable_count > 0) {+    p_func->accessed_variables =+        (SpvReflectPrvAccessedVariable*)calloc(p_func->accessed_variable_count, sizeof(*(p_func->accessed_variables)));+    if (IsNull(p_func->accessed_variables)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  p_func->parameter_count = 0;+  p_func->callee_count = 0;+  p_func->accessed_variable_count = 0;+  // Now have allocation, fill in values+  for (size_t i = first_label_index; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (p_node->op == SpvOpFunctionEnd) {+      break;+    }+    switch (p_node->op) {+      case SpvOpFunctionParameter: {+        CHECKED_READU32(p_parser, p_node->word_offset + 2, p_func->parameters[p_func->parameter_count]);+        (++p_func->parameter_count);+      } break;+      case SpvOpFunctionCall: {+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_func->callees[p_func->callee_count]);+        const uint32_t result_index = p_node->word_offset + 2;+        for (uint32_t j = 0, parameter_count = p_node->word_count - 4; j < parameter_count; j++) {+          const uint32_t ptr_index = p_node->word_offset + 4 + j;+          SpvReflectPrvAccessedVariable* access_ptr = &p_func->accessed_variables[p_func->accessed_variable_count];++          access_ptr->p_node = p_node;+          // Need to track Result ID as not sure there has been any memory access through here yet+          CHECKED_READU32(p_parser, result_index, access_ptr->result_id);+          CHECKED_READU32(p_parser, ptr_index, access_ptr->variable_ptr);+          access_ptr->function_id = p_func->callees[p_func->callee_count];+          access_ptr->function_parameter_index = j;+          (++p_func->accessed_variable_count);+        }+        (++p_func->callee_count);+      } break;+      case SpvOpLoad:+      case SpvOpAccessChain:+      case SpvOpInBoundsAccessChain:+      case SpvOpPtrAccessChain:+      case SpvOpArrayLength:+      case SpvOpGenericPtrMemSemantics:+      case SpvOpInBoundsPtrAccessChain:+      case SpvOpImageTexelPointer: {+        const uint32_t result_index = p_node->word_offset + 2;+        const uint32_t ptr_index = p_node->word_offset + 3;+        SpvReflectPrvAccessedVariable* access_ptr = &p_func->accessed_variables[p_func->accessed_variable_count];++        access_ptr->p_node = p_node;+        // Need to track Result ID as not sure there has been any memory access through here yet+        CHECKED_READU32(p_parser, result_index, access_ptr->result_id);+        CHECKED_READU32(p_parser, ptr_index, access_ptr->variable_ptr);+        (++p_func->accessed_variable_count);+      } break;+      case SpvOpStore: {+        const uint32_t result_index = p_node->word_offset + 2;+        CHECKED_READU32(p_parser, result_index, p_func->accessed_variables[p_func->accessed_variable_count].variable_ptr);+        p_func->accessed_variables[p_func->accessed_variable_count].p_node = p_node;+        (++p_func->accessed_variable_count);+      } break;+      case SpvOpCopyMemory:+      case SpvOpCopyMemorySized: {+        // There is no result_id or node, being zero is same as being invalid+        CHECKED_READU32(p_parser, p_node->word_offset + 1,+                        p_func->accessed_variables[p_func->accessed_variable_count].variable_ptr);+        (++p_func->accessed_variable_count);+        CHECKED_READU32(p_parser, p_node->word_offset + 2,+                        p_func->accessed_variables[p_func->accessed_variable_count].variable_ptr);+        (++p_func->accessed_variable_count);+      } break;+      default:+        break;+    }+  }++  if (p_func->callee_count > 0) {+    qsort(p_func->callees, p_func->callee_count, sizeof(*(p_func->callees)), SortCompareUint32);+  }+  p_func->callee_count = (uint32_t)DedupSortedUint32(p_func->callees, p_func->callee_count);++  if (p_func->accessed_variable_count > 0) {+    qsort(p_func->accessed_variables, p_func->accessed_variable_count, sizeof(*(p_func->accessed_variables)),+          SortCompareAccessedVariable);+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static int SortCompareFunctions(const void* a, const void* b) {+  const SpvReflectPrvFunction* af = (const SpvReflectPrvFunction*)a;+  const SpvReflectPrvFunction* bf = (const SpvReflectPrvFunction*)b;+  return (int)af->id - (int)bf->id;+}++static SpvReflectResult ParseFunctions(SpvReflectPrvParser* p_parser) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(IsNotNull(p_parser->nodes));++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {+    if (p_parser->function_count == 0) {+      return SPV_REFLECT_RESULT_SUCCESS;+    }++    p_parser->functions = (SpvReflectPrvFunction*)calloc(p_parser->function_count, sizeof(*(p_parser->functions)));+    if (IsNull(p_parser->functions)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }++    size_t function_index = 0;+    for (size_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if (p_node->op != SpvOpFunction) {+        continue;+      }++      // Skip over function declarations that aren't definitions+      bool func_definition = false;+      for (size_t j = i; j < p_parser->node_count; ++j) {+        if (p_parser->nodes[j].op == SpvOpLabel) {+          func_definition = true;+          break;+        }+        if (p_parser->nodes[j].op == SpvOpFunctionEnd) {+          break;+        }+      }+      if (!func_definition) {+        continue;+      }++      SpvReflectPrvFunction* p_function = &(p_parser->functions[function_index]);++      SpvReflectResult result = ParseFunction(p_parser, p_node, p_function, i);+      if (result != SPV_REFLECT_RESULT_SUCCESS) {+        return result;+      }++      ++function_index;+    }++    qsort(p_parser->functions, p_parser->function_count, sizeof(*(p_parser->functions)), SortCompareFunctions);++    // Once they're sorted, link the functions with pointers to improve graph+    // traversal efficiency+    for (size_t i = 0; i < p_parser->function_count; ++i) {+      SpvReflectPrvFunction* p_func = &(p_parser->functions[i]);+      if (p_func->callee_count == 0) {+        continue;+      }+      p_func->callee_ptrs = (SpvReflectPrvFunction**)calloc(p_func->callee_count, sizeof(*(p_func->callee_ptrs)));+      for (size_t j = 0, k = 0; j < p_func->callee_count; ++j) {+        while (p_parser->functions[k].id != p_func->callees[j]) {+          ++k;+          if (k >= p_parser->function_count) {+            // Invalid called function ID somewhere+            return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          }+        }+        p_func->callee_ptrs[j] = &(p_parser->functions[k]);+      }+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseMemberCounts(SpvReflectPrvParser* p_parser) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(IsNotNull(p_parser->nodes));++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {+    for (size_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if ((p_node->op != SpvOpMemberName) && (p_node->op != SpvOpMemberDecorate)) {+        continue;+      }++      uint32_t target_id = 0;+      uint32_t member_index = (uint32_t)INVALID_VALUE;+      CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);+      CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);+      SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);+      // Not all nodes get parsed, so FindNode returning NULL is expected.+      if (IsNull(p_target_node)) {+        continue;+      }++      if (member_index == INVALID_VALUE) {+        return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;+      }++      p_target_node->member_count = Max(p_target_node->member_count, member_index + 1);+    }++    for (uint32_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if (p_node->member_count == 0) {+        continue;+      }++      p_node->member_names = (const char**)calloc(p_node->member_count, sizeof(*(p_node->member_names)));+      if (IsNull(p_node->member_names)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }++      p_node->member_decorations = (SpvReflectPrvDecorations*)calloc(p_node->member_count, sizeof(*(p_node->member_decorations)));+      if (IsNull(p_node->member_decorations)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }+    }+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseNames(SpvReflectPrvParser* p_parser) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->spirv_code));+  assert(IsNotNull(p_parser->nodes));++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {+    for (size_t i = 0; i < p_parser->node_count; ++i) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+      if ((p_node->op != SpvOpName) && (p_node->op != SpvOpMemberName)) {+        continue;+      }++      uint32_t target_id = 0;+      CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);+      SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);+      // Not all nodes get parsed, so FindNode returning NULL is expected.+      if (IsNull(p_target_node)) {+        continue;+      }++      const char** pp_target_name = &(p_target_node->name);+      if (p_node->op == SpvOpMemberName) {+        uint32_t member_index = UINT32_MAX;+        CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);+        pp_target_name = &(p_target_node->member_names[member_index]);+      }++      *pp_target_name = p_node->name;+    }+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++// Returns true if user_type matches pattern or if user_type begins with pattern and the next character is ':'+// For example, UserTypeMatches("rwbuffer", "rwbuffer") will be true, UserTypeMatches("rwbuffer", "rwbuffer:<S>") will be true, and+// UserTypeMatches("rwbuffer", "rwbufferfoo") will be false.+static bool UserTypeMatches(const char* user_type, const char* pattern) {+  const size_t pattern_length = strlen(pattern);+  if (strncmp(user_type, pattern, pattern_length) == 0) {+    if (user_type[pattern_length] == ':' || user_type[pattern_length] == '\0') {+      return true;+    }+  }+  return false;+}++static SpvReflectResult ParseDecorations(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  uint32_t spec_constant_count = 0;+  for (uint32_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);++    if ((p_node->op != SpvOpDecorate) && (p_node->op != SpvOpMemberDecorate) && (p_node->op != SpvOpDecorateId) &&+        (p_node->op != SpvOpDecorateString) && (p_node->op != SpvOpMemberDecorateString)) {+      continue;+    }++    // Need to adjust the read offset if this is a member decoration+    uint32_t member_offset = 0;+    if (p_node->op == SpvOpMemberDecorate) {+      member_offset = 1;+    }++    // Get decoration+    uint32_t decoration = (uint32_t)INVALID_VALUE;+    CHECKED_READU32(p_parser, p_node->word_offset + member_offset + 2, decoration);++    // Filter out the decoration that do not affect reflection, otherwise+    // there will be random crashes because the nodes aren't found.+    bool skip = false;+    switch (decoration) {+      default: {+        skip = true;+      } break;+      case SpvDecorationRelaxedPrecision:+      case SpvDecorationBlock:+      case SpvDecorationBufferBlock:+      case SpvDecorationColMajor:+      case SpvDecorationRowMajor:+      case SpvDecorationArrayStride:+      case SpvDecorationMatrixStride:+      case SpvDecorationBuiltIn:+      case SpvDecorationNoPerspective:+      case SpvDecorationFlat:+      case SpvDecorationNonWritable:+      case SpvDecorationNonReadable:+      case SpvDecorationPatch:+      case SpvDecorationPerVertexKHR:+      case SpvDecorationPerTaskNV:+      case SpvDecorationLocation:+      case SpvDecorationComponent:+      case SpvDecorationBinding:+      case SpvDecorationDescriptorSet:+      case SpvDecorationOffset:+      case SpvDecorationInputAttachmentIndex:+      case SpvDecorationSpecId:+      case SpvDecorationWeightTextureQCOM:+      case SpvDecorationBlockMatchTextureQCOM:+      case SpvDecorationUserTypeGOOGLE:+      case SpvDecorationHlslCounterBufferGOOGLE:+      case SpvDecorationHlslSemanticGOOGLE: {+        skip = false;+      } break;+    }+    if (skip) {+      continue;+    }++    // Find target node+    uint32_t target_id = 0;+    CHECKED_READU32(p_parser, p_node->word_offset + 1, target_id);+    SpvReflectPrvNode* p_target_node = FindNode(p_parser, target_id);+    if (IsNull(p_target_node)) {+      if ((p_node->op == (uint32_t)SpvOpDecorate) && (decoration == SpvDecorationRelaxedPrecision)) {+        // Many OPs can be decorated that we don't care about. Ignore those.+        // See https://github.com/KhronosGroup/SPIRV-Reflect/issues/134+        continue;+      }+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }+    // Get decorations+    SpvReflectPrvDecorations* p_target_decorations = &(p_target_node->decorations);+    // Update pointer if this is a member decoration+    if (p_node->op == SpvOpMemberDecorate) {+      uint32_t member_index = (uint32_t)INVALID_VALUE;+      CHECKED_READU32(p_parser, p_node->word_offset + 2, member_index);+      p_target_decorations = &(p_target_node->member_decorations[member_index]);+    }++    switch (decoration) {+      default:+        break;++      case SpvDecorationRelaxedPrecision: {+        p_target_decorations->is_relaxed_precision = true;+      } break;++      case SpvDecorationBlock: {+        p_target_decorations->is_block = true;+      } break;++      case SpvDecorationBufferBlock: {+        p_target_decorations->is_buffer_block = true;+      } break;++      case SpvDecorationColMajor: {+        p_target_decorations->is_column_major = true;+      } break;++      case SpvDecorationRowMajor: {+        p_target_decorations->is_row_major = true;+      } break;++      case SpvDecorationArrayStride: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->array_stride);+      } break;++      case SpvDecorationMatrixStride: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->matrix_stride);+      } break;++      case SpvDecorationBuiltIn: {+        p_target_decorations->is_built_in = true;+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32_CAST(p_parser, word_offset, SpvBuiltIn, p_target_decorations->built_in);+      } break;++      case SpvDecorationNoPerspective: {+        p_target_decorations->is_noperspective = true;+      } break;++      case SpvDecorationFlat: {+        p_target_decorations->is_flat = true;+      } break;++      case SpvDecorationNonWritable: {+        p_target_decorations->is_non_writable = true;+      } break;++      case SpvDecorationNonReadable: {+        p_target_decorations->is_non_readable = true;+      } break;++      case SpvDecorationPatch: {+        p_target_decorations->is_patch = true;+      } break;++      case SpvDecorationPerVertexKHR: {+        p_target_decorations->is_per_vertex = true;+      } break;++      case SpvDecorationPerTaskNV: {+        p_target_decorations->is_per_task = true;+      } break;++      case SpvDecorationLocation: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->location.value);+        p_target_decorations->location.word_offset = word_offset;+      } break;++      case SpvDecorationComponent: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->component.value);+        p_target_decorations->component.word_offset = word_offset;+      } break;++      case SpvDecorationBinding: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->binding.value);+        p_target_decorations->binding.word_offset = word_offset;+      } break;++      case SpvDecorationDescriptorSet: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->set.value);+        p_target_decorations->set.word_offset = word_offset;+      } break;++      case SpvDecorationOffset: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->offset.value);+        p_target_decorations->offset.word_offset = word_offset;+      } break;++      case SpvDecorationInputAttachmentIndex: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->input_attachment_index.value);+        p_target_decorations->input_attachment_index.word_offset = word_offset;+      } break;++      case SpvDecorationSpecId: {+        spec_constant_count++;+      } break;++      case SpvDecorationHlslCounterBufferGOOGLE: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        CHECKED_READU32(p_parser, word_offset, p_target_decorations->uav_counter_buffer.value);+        p_target_decorations->uav_counter_buffer.word_offset = word_offset;+      } break;++      case SpvDecorationHlslSemanticGOOGLE: {+        uint32_t word_offset = p_node->word_offset + member_offset + 3;+        p_target_decorations->semantic.value = (const char*)(p_parser->spirv_code + word_offset);+        p_target_decorations->semantic.word_offset = word_offset;+      } break;++      case SpvDecorationWeightTextureQCOM: {+        p_target_decorations->is_weight_texture = true;+      } break;++      case SpvDecorationBlockMatchTextureQCOM: {+        p_target_decorations->is_block_match_texture = true;+      } break;+    }++    if (p_node->op == SpvOpDecorateString && decoration == SpvDecorationUserTypeGOOGLE) {+      uint32_t terminator = 0;+      SpvReflectResult result = ReadStr(p_parser, p_node->word_offset + 3, 0, p_node->word_count, &terminator, NULL);+      if (result != SPV_REFLECT_RESULT_SUCCESS) {+        return result;+      }+      const char* name = (const char*)(p_parser->spirv_code + p_node->word_offset + 3);+      if (UserTypeMatches(name, "cbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_CBUFFER;+      } else if (UserTypeMatches(name, "tbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TBUFFER;+      } else if (UserTypeMatches(name, "appendstructuredbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_APPEND_STRUCTURED_BUFFER;+      } else if (UserTypeMatches(name, "buffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_BUFFER;+      } else if (UserTypeMatches(name, "byteaddressbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_BYTE_ADDRESS_BUFFER;+      } else if (UserTypeMatches(name, "constantbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_CONSTANT_BUFFER;+      } else if (UserTypeMatches(name, "consumestructuredbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_CONSUME_STRUCTURED_BUFFER;+      } else if (UserTypeMatches(name, "inputpatch")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_INPUT_PATCH;+      } else if (UserTypeMatches(name, "outputpatch")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_OUTPUT_PATCH;+      } else if (UserTypeMatches(name, "rasterizerorderedbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_BUFFER;+      } else if (UserTypeMatches(name, "rasterizerorderedbyteaddressbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_BYTE_ADDRESS_BUFFER;+      } else if (UserTypeMatches(name, "rasterizerorderedstructuredbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_STRUCTURED_BUFFER;+      } else if (UserTypeMatches(name, "rasterizerorderedtexture1d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_1D;+      } else if (UserTypeMatches(name, "rasterizerorderedtexture1darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_1D_ARRAY;+      } else if (UserTypeMatches(name, "rasterizerorderedtexture2d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_2D;+      } else if (UserTypeMatches(name, "rasterizerorderedtexture2darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_2D_ARRAY;+      } else if (UserTypeMatches(name, "rasterizerorderedtexture3d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_3D;+      } else if (UserTypeMatches(name, "raytracingaccelerationstructure")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RAYTRACING_ACCELERATION_STRUCTURE;+      } else if (UserTypeMatches(name, "rwbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_BUFFER;+      } else if (UserTypeMatches(name, "rwbyteaddressbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_BYTE_ADDRESS_BUFFER;+      } else if (UserTypeMatches(name, "rwstructuredbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_STRUCTURED_BUFFER;+      } else if (UserTypeMatches(name, "rwtexture1d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_TEXTURE_1D;+      } else if (UserTypeMatches(name, "rwtexture1darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_TEXTURE_1D_ARRAY;+      } else if (UserTypeMatches(name, "rwtexture2d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_TEXTURE_2D;+      } else if (UserTypeMatches(name, "rwtexture2darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_TEXTURE_2D_ARRAY;+      } else if (UserTypeMatches(name, "rwtexture3d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_RW_TEXTURE_3D;+      } else if (UserTypeMatches(name, "structuredbuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_STRUCTURED_BUFFER;+      } else if (UserTypeMatches(name, "subpassinput")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_SUBPASS_INPUT;+      } else if (UserTypeMatches(name, "subpassinputms")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_SUBPASS_INPUT_MS;+      } else if (UserTypeMatches(name, "texture1d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_1D;+      } else if (UserTypeMatches(name, "texture1darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_1D_ARRAY;+      } else if (UserTypeMatches(name, "texture2d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_2D;+      } else if (UserTypeMatches(name, "texture2darray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_2D_ARRAY;+      } else if (UserTypeMatches(name, "texture2dms")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_2DMS;+      } else if (UserTypeMatches(name, "texture2dmsarray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_2DMS_ARRAY;+      } else if (UserTypeMatches(name, "texture3d")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_3D;+      } else if (UserTypeMatches(name, "texturebuffer")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_BUFFER;+      } else if (UserTypeMatches(name, "texturecube")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_CUBE;+      } else if (UserTypeMatches(name, "texturecubearray")) {+        p_target_decorations->user_type = SPV_REFLECT_USER_TYPE_TEXTURE_CUBE_ARRAY;+      }+    }+  }++  if (spec_constant_count > 0) {+    p_module->spec_constants = (SpvReflectSpecializationConstant*)calloc(spec_constant_count, sizeof(*p_module->spec_constants));+    if (IsNull(p_module->spec_constants)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }+  for (uint32_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (p_node->op == SpvOpDecorate) {+      uint32_t decoration = (uint32_t)INVALID_VALUE;+      CHECKED_READU32(p_parser, p_node->word_offset + 2, decoration);+      if (decoration == SpvDecorationSpecId) {+        const uint32_t count = p_module->spec_constant_count;+        CHECKED_READU32(p_parser, p_node->word_offset + 1, p_module->spec_constants[count].spirv_id);+        CHECKED_READU32(p_parser, p_node->word_offset + 3, p_module->spec_constants[count].constant_id);+        // If being used for a OpSpecConstantComposite (ex. LocalSizeId), there won't be a name+        SpvReflectPrvNode* target_node = FindNode(p_parser, p_module->spec_constants[count].spirv_id);+        if (IsNotNull(target_node)) {+          p_module->spec_constants[count].name = target_node->name;+        }+        p_module->spec_constant_count++;+      }+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult EnumerateAllUniforms(SpvReflectShaderModule* p_module, size_t* p_uniform_count, uint32_t** pp_uniforms) {+  *p_uniform_count = p_module->descriptor_binding_count;+  if (*p_uniform_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }+  *pp_uniforms = (uint32_t*)calloc(*p_uniform_count, sizeof(**pp_uniforms));++  if (IsNull(*pp_uniforms)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  for (size_t i = 0; i < *p_uniform_count; ++i) {+    (*pp_uniforms)[i] = p_module->descriptor_bindings[i].spirv_id;+  }+  qsort(*pp_uniforms, *p_uniform_count, sizeof(**pp_uniforms), SortCompareUint32);+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseType(SpvReflectPrvParser* p_parser, SpvReflectPrvNode* p_node,+                                  SpvReflectPrvDecorations* p_struct_member_decorations, SpvReflectShaderModule* p_module,+                                  SpvReflectTypeDescription* p_type) {+  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;++  if (p_node->member_count > 0) {+    p_type->struct_type_description = FindType(p_module, p_node->result_id);+    p_type->member_count = p_node->member_count;+    p_type->members = (SpvReflectTypeDescription*)calloc(p_type->member_count, sizeof(*(p_type->members)));+    if (IsNotNull(p_type->members)) {+      // Mark all members types with an invalid state+      for (size_t i = 0; i < p_type->members->member_count; ++i) {+        SpvReflectTypeDescription* p_member_type = &(p_type->members[i]);+        p_member_type->id = (uint32_t)INVALID_VALUE;+        p_member_type->op = (SpvOp)INVALID_VALUE;+        p_member_type->storage_class = (SpvStorageClass)INVALID_VALUE;+      }+    } else {+      result = SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    // Since the parse descends on type information, these will get overwritten+    // if not guarded against assignment. Only assign if the id is invalid.+    if (p_type->id == INVALID_VALUE) {+      p_type->id = p_node->result_id;+      p_type->op = p_node->op;+      p_type->decoration_flags = 0;+    }+    // Top level types need to pick up decorations from all types below it.+    // Issue and fix here: https://github.com/chaoticbob/SPIRV-Reflect/issues/64+    p_type->decoration_flags = ApplyDecorations(&p_node->decorations);++    switch (p_node->op) {+      default:+        break;+      case SpvOpTypeVoid:+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_VOID;+        break;++      case SpvOpTypeBool:+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_BOOL;+        break;++      case SpvOpTypeInt: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_INT;+        IF_READU32(result, p_parser, p_node->word_offset + 2, p_type->traits.numeric.scalar.width);+        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.scalar.signedness);+      } break;++      case SpvOpTypeFloat: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_FLOAT;+        IF_READU32(result, p_parser, p_node->word_offset + 2, p_type->traits.numeric.scalar.width);+      } break;++      case SpvOpTypeVector: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_VECTOR;+        uint32_t component_type_id = (uint32_t)INVALID_VALUE;+        IF_READU32(result, p_parser, p_node->word_offset + 2, component_type_id);+        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.vector.component_count);+        // Parse component type+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, component_type_id);+        if (IsNotNull(p_next_node)) {+          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        } else {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          SPV_REFLECT_ASSERT(false);+        }+      } break;++      case SpvOpTypeMatrix: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_MATRIX;+        uint32_t column_type_id = (uint32_t)INVALID_VALUE;+        IF_READU32(result, p_parser, p_node->word_offset + 2, column_type_id);+        IF_READU32(result, p_parser, p_node->word_offset + 3, p_type->traits.numeric.matrix.column_count);+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, column_type_id);+        if (IsNotNull(p_next_node)) {+          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        } else {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          SPV_REFLECT_ASSERT(false);+        }+        p_type->traits.numeric.matrix.row_count = p_type->traits.numeric.vector.component_count;+        p_type->traits.numeric.matrix.stride = p_node->decorations.matrix_stride;+        // NOTE: Matrix stride is decorated using OpMemberDecoreate - not OpDecoreate.+        if (IsNotNull(p_struct_member_decorations)) {+          p_type->traits.numeric.matrix.stride = p_struct_member_decorations->matrix_stride;+        }+      } break;++      case SpvOpTypeImage: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE;+        uint32_t sampled_type_id = (uint32_t)INVALID_VALUE;+        IF_READU32(result, p_parser, p_node->word_offset + 2, sampled_type_id);+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, sampled_type_id);+        if (IsNotNull(p_next_node)) {+          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        } else {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        IF_READU32_CAST(result, p_parser, p_node->word_offset + 3, SpvDim, p_type->traits.image.dim);+        IF_READU32(result, p_parser, p_node->word_offset + 4, p_type->traits.image.depth);+        IF_READU32(result, p_parser, p_node->word_offset + 5, p_type->traits.image.arrayed);+        IF_READU32(result, p_parser, p_node->word_offset + 6, p_type->traits.image.ms);+        IF_READU32(result, p_parser, p_node->word_offset + 7, p_type->traits.image.sampled);+        IF_READU32_CAST(result, p_parser, p_node->word_offset + 8, SpvImageFormat, p_type->traits.image.image_format);+      } break;++      case SpvOpTypeSampler: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLER;+      } break;++      case SpvOpTypeSampledImage: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE;+        uint32_t image_type_id = (uint32_t)INVALID_VALUE;+        IF_READU32(result, p_parser, p_node->word_offset + 2, image_type_id);+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, image_type_id);+        if (IsNotNull(p_next_node)) {+          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        } else {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          SPV_REFLECT_ASSERT(false);+        }+      } break;++      case SpvOpTypeArray: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_ARRAY;+        if (result == SPV_REFLECT_RESULT_SUCCESS) {+          uint32_t element_type_id = (uint32_t)INVALID_VALUE;+          uint32_t length_id = (uint32_t)INVALID_VALUE;+          IF_READU32(result, p_parser, p_node->word_offset + 2, element_type_id);+          IF_READU32(result, p_parser, p_node->word_offset + 3, length_id);+          // NOTE: Array stride is decorated using OpDecorate instead of+          //       OpMemberDecorate, even if the array is apart of a struct.+          p_type->traits.array.stride = p_node->decorations.array_stride;+          // Get length for current dimension+          SpvReflectPrvNode* p_length_node = FindNode(p_parser, length_id);+          if (IsNotNull(p_length_node)) {+            uint32_t dim_index = p_type->traits.array.dims_count;+            uint32_t length = 0;+            IF_READU32(result, p_parser, p_length_node->word_offset + 3, length);+            if (result == SPV_REFLECT_RESULT_SUCCESS) {+              p_type->traits.array.dims[dim_index] = length;+              p_type->traits.array.dims_count += 1;+              p_type->traits.array.spec_constant_op_ids[dim_index] =+                  IsSpecConstant(p_length_node) ? p_length_node->decorations.spec_id : (uint32_t)INVALID_VALUE;+            } else {+              result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+              SPV_REFLECT_ASSERT(false);+            }+            // Parse next dimension or element type+            SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);+            if (IsNotNull(p_next_node)) {+              result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+            }+          } else {+            result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+            SPV_REFLECT_ASSERT(false);+          }+        }+      } break;++      case SpvOpTypeRuntimeArray: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_ARRAY;+        uint32_t element_type_id = (uint32_t)INVALID_VALUE;+        IF_READU32(result, p_parser, p_node->word_offset + 2, element_type_id);+        p_type->traits.array.stride = p_node->decorations.array_stride;+        uint32_t dim_index = p_type->traits.array.dims_count;+        p_type->traits.array.dims[dim_index] = (uint32_t)SPV_REFLECT_ARRAY_DIM_RUNTIME;+        p_type->traits.array.spec_constant_op_ids[dim_index] = (uint32_t)INVALID_VALUE;+        p_type->traits.array.dims_count += 1;+        // Parse next dimension or element type+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, element_type_id);+        if (IsNotNull(p_next_node)) {+          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        } else {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          SPV_REFLECT_ASSERT(false);+        }+      } break;++      case SpvOpTypeStruct: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_STRUCT;+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_BLOCK;+        uint32_t word_index = 2;+        uint32_t member_index = 0;+        for (; word_index < p_node->word_count; ++word_index, ++member_index) {+          uint32_t member_id = (uint32_t)INVALID_VALUE;+          IF_READU32(result, p_parser, p_node->word_offset + word_index, member_id);+          // Find member node+          SpvReflectPrvNode* p_member_node = FindNode(p_parser, member_id);+          if (IsNull(p_member_node)) {+            result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+            SPV_REFLECT_ASSERT(false);+            break;+          }++          // Member decorations+          SpvReflectPrvDecorations* p_member_decorations = &p_node->member_decorations[member_index];++          assert(member_index < p_type->member_count);+          // Parse member type+          SpvReflectTypeDescription* p_member_type = &(p_type->members[member_index]);+          p_member_type->id = member_id;+          p_member_type->op = p_member_node->op;+          result = ParseType(p_parser, p_member_node, p_member_decorations, p_module, p_member_type);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            break;+          }+          // This looks wrong+          // p_member_type->type_name = p_member_node->name;+          p_member_type->struct_member_name = p_node->member_names[member_index];+        }+      } break;++      case SpvOpTypeOpaque:+        break;++      case SpvOpTypePointer: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_REF;+        IF_READU32_CAST(result, p_parser, p_node->word_offset + 2, SpvStorageClass, p_type->storage_class);++        bool found_recursion = false;+        if (p_type->storage_class == SpvStorageClassPhysicalStorageBuffer) {+          // Need to make sure we haven't started an infinite recursive loop+          for (uint32_t i = 0; i < p_parser->physical_pointer_count; i++) {+            if (p_type->id == p_parser->physical_pointer_check[i]->id) {+              found_recursion = true;+              memcpy(p_type, p_parser->physical_pointer_check[i], sizeof(SpvReflectTypeDescription));+              p_type->copied = 1;+              return SPV_REFLECT_RESULT_SUCCESS;+            }+          }+          if (!found_recursion) {+            p_parser->physical_pointer_struct_count++;+            p_parser->physical_pointer_check[p_parser->physical_pointer_count] = p_type;+            p_parser->physical_pointer_count++;+            if (p_parser->physical_pointer_count >= MAX_RECURSIVE_PHYSICAL_POINTER_CHECK) {+              return SPV_REFLECT_RESULT_ERROR_SPIRV_MAX_RECURSIVE_EXCEEDED;+            }+          }+        }++        // Parse type+        SpvReflectPrvNode* p_next_node = FindNode(p_parser, p_node->type_id);+        if (IsNull(p_next_node)) {+          result = SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          SPV_REFLECT_ASSERT(false);+        } else if (!found_recursion) {+          if (p_next_node->op == SpvOpTypeStruct) {+            p_type->struct_type_description = FindType(p_module, p_next_node->result_id);+          }++          result = ParseType(p_parser, p_next_node, NULL, p_module, p_type);+        }+      } break;++      case SpvOpTypeAccelerationStructureKHR: {+        p_type->type_flags |= SPV_REFLECT_TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE;+      } break;+    }++    if (result == SPV_REFLECT_RESULT_SUCCESS) {+      // Names get assigned on the way down. Guard against names+      // get overwritten on the way up.+      if (IsNull(p_type->type_name)) {+        p_type->type_name = p_node->name;+      }+    }+  }++  return result;+}++static SpvReflectResult ParseTypes(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  if (p_parser->type_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_module->_internal->type_description_count = p_parser->type_count;+  p_module->_internal->type_descriptions = (SpvReflectTypeDescription*)calloc(p_module->_internal->type_description_count,+                                                                              sizeof(*(p_module->_internal->type_descriptions)));+  if (IsNull(p_module->_internal->type_descriptions)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  // Mark all types with an invalid state+  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {+    SpvReflectTypeDescription* p_type = &(p_module->_internal->type_descriptions[i]);+    p_type->id = (uint32_t)INVALID_VALUE;+    p_type->op = (SpvOp)INVALID_VALUE;+    p_type->storage_class = (SpvStorageClass)INVALID_VALUE;+  }++  size_t type_index = 0;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (!p_node->is_type) {+      continue;+    }++    SpvReflectTypeDescription* p_type = &(p_module->_internal->type_descriptions[type_index]);+    p_parser->physical_pointer_count = 0;+    SpvReflectResult result = ParseType(p_parser, p_node, NULL, p_module, p_type);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }+    ++type_index;+  }++  // allocate now and fill in when parsing struct variable later+  if (p_parser->physical_pointer_struct_count > 0) {+    p_parser->physical_pointer_structs = (SpvReflectPrvPhysicalPointerStruct*)calloc(p_parser->physical_pointer_struct_count,+                                                                                     sizeof(*(p_parser->physical_pointer_structs)));+    if (IsNull(p_parser->physical_pointer_structs)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseCapabilities(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  if (p_parser->capability_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_module->capability_count = p_parser->capability_count;+  p_module->capabilities = (SpvReflectCapability*)calloc(p_module->capability_count, sizeof(*(p_module->capabilities)));+  if (IsNull(p_module->capabilities)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  // Mark all types with an invalid state+  for (size_t i = 0; i < p_module->capability_count; ++i) {+    SpvReflectCapability* p_cap = &(p_module->capabilities[i]);+    p_cap->value = SpvCapabilityMax;+    p_cap->word_offset = (uint32_t)INVALID_VALUE;+  }++  size_t capability_index = 0;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (SpvOpCapability != p_node->op) {+      continue;+    }++    SpvReflectCapability* p_cap = &(p_module->capabilities[capability_index]);+    p_cap->value = p_node->capability;+    p_cap->word_offset = p_node->word_offset + 1;+    ++capability_index;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static int SortCompareDescriptorBinding(const void* a, const void* b) {+  const SpvReflectDescriptorBinding* p_elem_a = (const SpvReflectDescriptorBinding*)a;+  const SpvReflectDescriptorBinding* p_elem_b = (const SpvReflectDescriptorBinding*)b;+  int value = (int)(p_elem_a->binding) - (int)(p_elem_b->binding);+  if (value == 0) {+    // use spirv-id as a tiebreaker to ensure a stable ordering, as they're guaranteed+    // unique.+    assert(p_elem_a->spirv_id != p_elem_b->spirv_id);+    value = (int)(p_elem_a->spirv_id) - (int)(p_elem_b->spirv_id);+  }+  return value;+}++static SpvReflectResult ParseDescriptorBindings(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  p_module->descriptor_binding_count = 0;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if ((p_node->op != SpvOpVariable) ||+        ((p_node->storage_class != SpvStorageClassUniform) && (p_node->storage_class != SpvStorageClassStorageBuffer) &&+         (p_node->storage_class != SpvStorageClassUniformConstant))) {+      continue;+    }+    if ((p_node->decorations.set.value == INVALID_VALUE) || (p_node->decorations.binding.value == INVALID_VALUE)) {+      continue;+    }++    p_module->descriptor_binding_count += 1;+  }++  if (p_module->descriptor_binding_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_module->descriptor_bindings =+      (SpvReflectDescriptorBinding*)calloc(p_module->descriptor_binding_count, sizeof(*(p_module->descriptor_bindings)));+  if (IsNull(p_module->descriptor_bindings)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  // Mark all types with an invalid state+  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);+    p_descriptor->binding = (uint32_t)INVALID_VALUE;+    p_descriptor->input_attachment_index = (uint32_t)INVALID_VALUE;+    p_descriptor->set = (uint32_t)INVALID_VALUE;+    p_descriptor->descriptor_type = (SpvReflectDescriptorType)INVALID_VALUE;+    p_descriptor->uav_counter_id = (uint32_t)INVALID_VALUE;+  }++  size_t descriptor_index = 0;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if ((p_node->op != SpvOpVariable) ||+        ((p_node->storage_class != SpvStorageClassUniform) && (p_node->storage_class != SpvStorageClassStorageBuffer) &&+         (p_node->storage_class != SpvStorageClassUniformConstant))) {+      continue;+    }+    if ((p_node->decorations.set.value == INVALID_VALUE) || (p_node->decorations.binding.value == INVALID_VALUE)) {+      continue;+    }++    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);+    if (IsNull(p_type)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }+    // If the type is a pointer, resolve it. We need to retain the storage class+    // from the pointer so that we can use it to deduce deescriptor types.+    SpvStorageClass pointer_storage_class = SpvStorageClassMax;+    if (p_type->op == SpvOpTypePointer) {+      pointer_storage_class = p_type->storage_class;+      // Find the type's node+      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+      if (IsNull(p_type_node)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+      // Should be the resolved type+      p_type = FindType(p_module, p_type_node->type_id);+      if (IsNull(p_type)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+    }++    SpvReflectDescriptorBinding* p_descriptor = &p_module->descriptor_bindings[descriptor_index];+    p_descriptor->spirv_id = p_node->result_id;+    p_descriptor->name = p_node->name;+    p_descriptor->binding = p_node->decorations.binding.value;+    p_descriptor->input_attachment_index = p_node->decorations.input_attachment_index.value;+    p_descriptor->set = p_node->decorations.set.value;+    p_descriptor->count = 1;+    p_descriptor->uav_counter_id = p_node->decorations.uav_counter_buffer.value;+    p_descriptor->type_description = p_type;+    p_descriptor->decoration_flags = ApplyDecorations(&p_node->decorations);+    p_descriptor->user_type = p_node->decorations.user_type;++    // Flags like non-writable and non-readable are found as member decorations only.+    // If all members have one of those decorations set, promote the decoration up+    // to the whole descriptor.+    const SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+    if (IsNotNull(p_type_node) && p_type_node->member_count) {+      SpvReflectPrvDecorations common_flags = p_type_node->member_decorations[0];++      for (uint32_t m = 1; m < p_type_node->member_count; ++m) {+        common_flags.is_relaxed_precision &= p_type_node->member_decorations[m].is_relaxed_precision;+        common_flags.is_block &= p_type_node->member_decorations[m].is_block;+        common_flags.is_buffer_block &= p_type_node->member_decorations[m].is_buffer_block;+        common_flags.is_row_major &= p_type_node->member_decorations[m].is_row_major;+        common_flags.is_column_major &= p_type_node->member_decorations[m].is_column_major;+        common_flags.is_built_in &= p_type_node->member_decorations[m].is_built_in;+        common_flags.is_noperspective &= p_type_node->member_decorations[m].is_noperspective;+        common_flags.is_flat &= p_type_node->member_decorations[m].is_flat;+        common_flags.is_non_writable &= p_type_node->member_decorations[m].is_non_writable;+        common_flags.is_non_readable &= p_type_node->member_decorations[m].is_non_readable;+        common_flags.is_patch &= p_type_node->member_decorations[m].is_patch;+        common_flags.is_per_vertex &= p_type_node->member_decorations[m].is_per_vertex;+        common_flags.is_per_task &= p_type_node->member_decorations[m].is_per_task;+        common_flags.is_weight_texture &= p_type_node->member_decorations[m].is_weight_texture;+        common_flags.is_block_match_texture &= p_type_node->member_decorations[m].is_block_match_texture;+      }++      p_descriptor->decoration_flags |= ApplyDecorations(&common_flags);+    }++    // If this is in the StorageBuffer storage class, it's for sure a storage+    // buffer descriptor. We need to handle this case earlier because in SPIR-V+    // there are two ways to indicate a storage buffer:+    // 1) Uniform storage class + BufferBlock decoration, or+    // 2) StorageBuffer storage class + Buffer decoration.+    // The 1) way is deprecated since SPIR-V v1.3. But the Buffer decoration is+    // also used together with Uniform storage class to mean uniform buffer..+    // We'll handle the pre-v1.3 cases in ParseDescriptorType().+    if (pointer_storage_class == SpvStorageClassStorageBuffer) {+      p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER;+    }++    // Copy image traits+    if ((p_type->type_flags & SPV_REFLECT_TYPE_FLAG_EXTERNAL_MASK) == SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE) {+      memcpy(&p_descriptor->image, &p_type->traits.image, sizeof(p_descriptor->image));+    }++    // This is a workaround for: https://github.com/KhronosGroup/glslang/issues/1096+    {+      const uint32_t resource_mask = SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE | SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE;+      if ((p_type->type_flags & resource_mask) == resource_mask) {+        memcpy(&p_descriptor->image, &p_type->traits.image, sizeof(p_descriptor->image));+      }+    }++    // Copy array traits+    if (p_type->traits.array.dims_count > 0) {+      p_descriptor->array.dims_count = p_type->traits.array.dims_count;+      for (uint32_t dim_index = 0; dim_index < p_type->traits.array.dims_count; ++dim_index) {+        uint32_t dim_value = p_type->traits.array.dims[dim_index];+        p_descriptor->array.dims[dim_index] = dim_value;+        p_descriptor->count *= dim_value;+      }+    }++    // Count++    p_descriptor->word_offset.binding = p_node->decorations.binding.word_offset;+    p_descriptor->word_offset.set = p_node->decorations.set.word_offset;++    ++descriptor_index;+  }++  if (p_module->descriptor_binding_count > 0) {+    qsort(p_module->descriptor_bindings, p_module->descriptor_binding_count, sizeof(*(p_module->descriptor_bindings)),+          SortCompareDescriptorBinding);+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseDescriptorType(SpvReflectShaderModule* p_module) {+  if (p_module->descriptor_binding_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);+    SpvReflectTypeDescription* p_type = p_descriptor->type_description;++    if ((int)p_descriptor->descriptor_type == (int)INVALID_VALUE) {+      switch (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_EXTERNAL_MASK) {+        default:+          assert(false && "unknown type flag");+          break;++        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE: {+          if (p_descriptor->image.dim == SpvDimBuffer) {+            switch (p_descriptor->image.sampled) {+              default:+                assert(false && "unknown texel buffer sampled value");+                break;+              case IMAGE_SAMPLED:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;+                break;+              case IMAGE_STORAGE:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;+                break;+            }+          } else if (p_descriptor->image.dim == SpvDimSubpassData) {+            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;+          } else {+            switch (p_descriptor->image.sampled) {+              default:+                assert(false && "unknown image sampled value");+                break;+              case IMAGE_SAMPLED:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE;+                break;+              case IMAGE_STORAGE:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE;+                break;+            }+          }+        } break;++        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLER: {+          p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER;+        } break;++        case (SPV_REFLECT_TYPE_FLAG_EXTERNAL_SAMPLED_IMAGE | SPV_REFLECT_TYPE_FLAG_EXTERNAL_IMAGE): {+          // This is a workaround for: https://github.com/KhronosGroup/glslang/issues/1096+          if (p_descriptor->image.dim == SpvDimBuffer) {+            switch (p_descriptor->image.sampled) {+              default:+                assert(false && "unknown texel buffer sampled value");+                break;+              case IMAGE_SAMPLED:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;+                break;+              case IMAGE_STORAGE:+                p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;+                break;+            }+          } else {+            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;+          }+        } break;++        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_BLOCK: {+          if (p_type->decoration_flags & SPV_REFLECT_DECORATION_BLOCK) {+            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER;+          } else if (p_type->decoration_flags & SPV_REFLECT_DECORATION_BUFFER_BLOCK) {+            p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER;+          } else {+            assert(false && "unknown struct");+          }+        } break;++        case SPV_REFLECT_TYPE_FLAG_EXTERNAL_ACCELERATION_STRUCTURE: {+          p_descriptor->descriptor_type = SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;+        } break;+      }+    }++    switch (p_descriptor->descriptor_type) {+      case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SAMPLER;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:+        p_descriptor->resource_type = (SpvReflectResourceType)(SPV_REFLECT_RESOURCE_FLAG_SAMPLER | SPV_REFLECT_RESOURCE_FLAG_SRV);+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_CBV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_CBV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_UAV;+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:+        break;+      case SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:+        p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV;+        break;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseUAVCounterBindings(SpvReflectShaderModule* p_module) {+  char name[MAX_NODE_NAME_LENGTH];+  const char* k_count_tag = "@count";++  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);++    if (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {+      continue;+    }++    SpvReflectDescriptorBinding* p_counter_descriptor = NULL;+    // Use UAV counter buffer id if present...+    if (p_descriptor->uav_counter_id != UINT32_MAX) {+      for (uint32_t counter_descriptor_index = 0; counter_descriptor_index < p_module->descriptor_binding_count;+           ++counter_descriptor_index) {+        SpvReflectDescriptorBinding* p_test_counter_descriptor = &(p_module->descriptor_bindings[counter_descriptor_index]);+        if (p_test_counter_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {+          continue;+        }+        if (p_descriptor->uav_counter_id == p_test_counter_descriptor->spirv_id) {+          p_counter_descriptor = p_test_counter_descriptor;+          break;+        }+      }+    }+    // ...otherwise use old @count convention.+    else {+      const size_t descriptor_name_length = p_descriptor->name ? strlen(p_descriptor->name) : 0;++      memset(name, 0, MAX_NODE_NAME_LENGTH);+      memcpy(name, p_descriptor->name, descriptor_name_length);+#if defined(_WIN32)+      strcat_s(name, MAX_NODE_NAME_LENGTH, k_count_tag);+#else+      strcat(name, k_count_tag);+#endif++      for (uint32_t counter_descriptor_index = 0; counter_descriptor_index < p_module->descriptor_binding_count;+           ++counter_descriptor_index) {+        SpvReflectDescriptorBinding* p_test_counter_descriptor = &(p_module->descriptor_bindings[counter_descriptor_index]);+        if (p_test_counter_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {+          continue;+        }+        if (p_test_counter_descriptor->name && strcmp(name, p_test_counter_descriptor->name) == 0) {+          p_counter_descriptor = p_test_counter_descriptor;+          break;+        }+      }+    }++    if (p_counter_descriptor != NULL) {+      p_descriptor->uav_counter_binding = p_counter_descriptor;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseDescriptorBlockVariable(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module,+                                                     SpvReflectTypeDescription* p_type, SpvReflectBlockVariable* p_var) {+  bool has_non_writable = false;++  if (IsNotNull(p_type->members) && (p_type->member_count > 0)) {+    p_var->member_count = p_type->member_count;+    p_var->members = (SpvReflectBlockVariable*)calloc(p_var->member_count, sizeof(*p_var->members));+    if (IsNull(p_var->members)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }++    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+    if (IsNull(p_type_node)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }+    // Resolve to element type if current type is array or run time array+    while (p_type_node->op == SpvOpTypeArray || p_type_node->op == SpvOpTypeRuntimeArray) {+      if (p_type_node->op == SpvOpTypeArray) {+        p_type_node = FindNode(p_parser, p_type_node->array_traits.element_type_id);+      } else {+        // Element type description+        SpvReflectTypeDescription* p_type_temp = FindType(p_module, p_type_node->array_traits.element_type_id);+        if (IsNull(p_type_temp)) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        // Element type node+        p_type_node = FindNode(p_parser, p_type_temp->id);+      }+      if (IsNull(p_type_node)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+    }++    // Parse members+    for (uint32_t member_index = 0; member_index < p_type->member_count; ++member_index) {+      SpvReflectTypeDescription* p_member_type = &p_type->members[member_index];+      SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];+      // If pointer type, treat like reference and resolve to pointee type+      SpvReflectTypeDescription* p_member_ptr_type = 0;+      bool found_recursion = false;++      if ((p_member_type->storage_class == SpvStorageClassPhysicalStorageBuffer) &&+          (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_REF)) {+        // Remember the original type+        p_member_ptr_type = p_member_type;++        // strip array+        if (p_member_type->op == SpvOpTypeArray || p_member_type->op == SpvOpTypeRuntimeArray) {+          SpvReflectPrvNode* p_node = FindNode(p_parser, p_member_type->id);+          if (p_node == NULL) {+            return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          }+          uint32_t element_type_id = p_node->array_traits.element_type_id;+          p_member_type = FindType(p_module, element_type_id);+          if (p_member_type == NULL) {+            return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+          }+        }++        // Need to make sure we haven't started an infinite recursive loop+        for (uint32_t i = 0; i < p_parser->physical_pointer_count; i++) {+          if (p_member_type->id == p_parser->physical_pointer_check[i]->id) {+            found_recursion = true;+            break;  // still need to fill in p_member_type values+          }+        }+        if (!found_recursion) {+          uint32_t struct_id = FindType(p_module, p_member_type->id)->struct_type_description->id;+          p_parser->physical_pointer_structs[p_parser->physical_pointer_struct_count].struct_id = struct_id;+          p_parser->physical_pointer_structs[p_parser->physical_pointer_struct_count].p_var = p_member_var;+          p_parser->physical_pointer_struct_count++;++          p_parser->physical_pointer_check[p_parser->physical_pointer_count] = p_member_type;+          p_parser->physical_pointer_count++;+          if (p_parser->physical_pointer_count >= MAX_RECURSIVE_PHYSICAL_POINTER_CHECK) {+            return SPV_REFLECT_RESULT_ERROR_SPIRV_MAX_RECURSIVE_EXCEEDED;+          }+        }++        SpvReflectPrvNode* p_member_type_node = FindNode(p_parser, p_member_type->id);+        if (IsNull(p_member_type_node)) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        // Should be the pointee type+        p_member_type = FindType(p_module, p_member_type_node->type_id);+        if (IsNull(p_member_type)) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+      }+      bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;+      if (is_struct) {+        if (!found_recursion) {+          SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_member_type, p_member_var);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            return result;+          }+        } else {+          // if 2 member of structs are same PhysicalPointer type, copy the+          // members values that aren't found skipping the recursion call+          for (uint32_t i = 0; i < p_parser->physical_pointer_struct_count; i++) {+            if (p_parser->physical_pointer_structs[i].struct_id == p_member_type->id) {+              p_member_var->members = p_parser->physical_pointer_structs[i].p_var->members;+              p_member_var->member_count = p_parser->physical_pointer_structs[i].p_var->member_count;+              // Set here as it is the first time we need to walk down structs+              p_member_var->flags |= SPV_REFLECT_VARIABLE_FLAGS_PHYSICAL_POINTER_COPY;+            }+          }+        }+      }++      if (p_type_node->storage_class == SpvStorageClassPhysicalStorageBuffer && !p_type_node->member_names) {+        // TODO 212 - If a buffer ref has an array of itself, all members are null+        continue;+      }++      p_member_var->name = p_type_node->member_names[member_index];+      p_member_var->offset = p_type_node->member_decorations[member_index].offset.value;+      p_member_var->decoration_flags = ApplyDecorations(&p_type_node->member_decorations[member_index]);+      p_member_var->flags |= SPV_REFLECT_VARIABLE_FLAGS_UNUSED;+      if (!has_non_writable && (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE)) {+        has_non_writable = true;+      }+      ApplyNumericTraits(p_member_type, &p_member_var->numeric);+      if (p_member_type->op == SpvOpTypeArray) {+        ApplyArrayTraits(p_member_type, &p_member_var->array);+      }++      p_member_var->word_offset.offset = p_type_node->member_decorations[member_index].offset.word_offset;+      p_member_var->type_description = p_member_ptr_type ? p_member_ptr_type : p_member_type;+    }+  }++  p_var->name = p_type->type_name;+  p_var->type_description = p_type;+  if (has_non_writable) {+    p_var->decoration_flags |= SPV_REFLECT_DECORATION_NON_WRITABLE;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static uint32_t GetPhysicalPointerStructSize(SpvReflectPrvParser* p_parser, uint32_t id) {+  for (uint32_t i = 0; i < p_parser->physical_pointer_struct_count; i++) {+    if (p_parser->physical_pointer_structs[i].struct_id == id) {+      return p_parser->physical_pointer_structs[i].p_var->size;+    }+  }+  return 0;+}++static SpvReflectResult ParseDescriptorBlockVariableSizes(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module,+                                                          bool is_parent_root, bool is_parent_aos, bool is_parent_rta,+                                                          SpvReflectBlockVariable* p_var) {+  if (p_var->member_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  bool is_parent_ref = p_var->type_description->op == SpvOpTypePointer;++  // Absolute offsets+  for (uint32_t member_index = 0; member_index < p_var->member_count; ++member_index) {+    SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];+    if (is_parent_root) {+      p_member_var->absolute_offset = p_member_var->offset;+    } else {+      p_member_var->absolute_offset =+          is_parent_aos ? 0 : (is_parent_ref ? p_member_var->offset : p_member_var->offset + p_var->absolute_offset);+    }+  }++  // Size+  for (uint32_t member_index = 0; member_index < p_var->member_count; ++member_index) {+    SpvReflectBlockVariable* p_member_var = &p_var->members[member_index];+    SpvReflectTypeDescription* p_member_type = p_member_var->type_description;++    if (!p_member_type) {+      // TODO 212 - If a buffer ref has an array of itself, all members are null+      continue;+    }+    switch (p_member_type->op) {+      case SpvOpTypeBool: {+        p_member_var->size = SPIRV_WORD_SIZE;+      } break;++      case SpvOpTypeInt:+      case SpvOpTypeFloat: {+        p_member_var->size = p_member_type->traits.numeric.scalar.width / SPIRV_BYTE_WIDTH;+      } break;++      case SpvOpTypeVector: {+        uint32_t size =+            p_member_type->traits.numeric.vector.component_count * (p_member_type->traits.numeric.scalar.width / SPIRV_BYTE_WIDTH);+        p_member_var->size = size;+      } break;++      case SpvOpTypeMatrix: {+        if (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_COLUMN_MAJOR) {+          p_member_var->size = p_member_var->numeric.matrix.column_count * p_member_var->numeric.matrix.stride;+        } else if (p_member_var->decoration_flags & SPV_REFLECT_DECORATION_ROW_MAJOR) {+          p_member_var->size = p_member_var->numeric.matrix.row_count * p_member_var->numeric.matrix.stride;+        }+      } break;++      case SpvOpTypeArray: {+        // If array of structs, parse members first...+        bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;+        if (is_struct) {+          if (p_member_var->flags & SPV_REFLECT_VARIABLE_FLAGS_PHYSICAL_POINTER_COPY) {+            p_member_var->size = GetPhysicalPointerStructSize(p_parser, p_member_type->id);+          } else {+            SpvReflectResult result =+                ParseDescriptorBlockVariableSizes(p_parser, p_module, false, true, is_parent_rta, p_member_var);+            if (result != SPV_REFLECT_RESULT_SUCCESS) {+              return result;+            }+          }+        }+        // ...then array+        uint32_t element_count = (p_member_var->array.dims_count > 0 ? 1 : 0);+        for (uint32_t i = 0; i < p_member_var->array.dims_count; ++i) {+          element_count *= p_member_var->array.dims[i];+        }+        p_member_var->size = element_count * p_member_var->array.stride;+      } break;++      case SpvOpTypeRuntimeArray: {+        bool is_struct = (p_member_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) == SPV_REFLECT_TYPE_FLAG_STRUCT;+        if (is_struct) {+          SpvReflectResult result = ParseDescriptorBlockVariableSizes(p_parser, p_module, false, true, true, p_member_var);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            return result;+          }+        }+      } break;++      case SpvOpTypePointer: {+        // Reference. Get to underlying struct type.+        SpvReflectPrvNode* p_member_type_node = FindNode(p_parser, p_member_type->id);+        if (IsNull(p_member_type_node)) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        // Get the pointee type+        p_member_type = FindType(p_module, p_member_type_node->type_id);+        if (IsNull(p_member_type)) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        assert(p_member_type->op == SpvOpTypeStruct);+        FALLTHROUGH;+      }++      case SpvOpTypeStruct: {+        if (p_member_var->flags & SPV_REFLECT_VARIABLE_FLAGS_PHYSICAL_POINTER_COPY) {+          p_member_var->size = GetPhysicalPointerStructSize(p_parser, p_member_type->id);+        } else {+          SpvReflectResult result =+              ParseDescriptorBlockVariableSizes(p_parser, p_module, false, is_parent_aos, is_parent_rta, p_member_var);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            return result;+          }+        }+      } break;++      default:+        break;+    }+  }++  // Structs can offset order don't need to match the index order, so first order by offset+  // example:+  //     OpMemberDecorate %struct 0 Offset 4+  //     OpMemberDecorate %struct 1 Offset 0+  SpvReflectBlockVariable** pp_member_offset_order =+      (SpvReflectBlockVariable**)calloc(p_var->member_count, sizeof(SpvReflectBlockVariable*));+  if (IsNull(pp_member_offset_order)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  uint32_t bottom_bound = 0;+  for (uint32_t i = 0; i < p_var->member_count; ++i) {+    uint32_t lowest_offset = UINT32_MAX;+    uint32_t member_index = 0;+    for (uint32_t j = 0; j < p_var->member_count; ++j) {+      const uint32_t offset = p_var->members[j].offset;+      if (offset < lowest_offset && offset >= bottom_bound) {+        member_index = j;+        lowest_offset = offset;+      }+    }+    pp_member_offset_order[i] = &p_var->members[member_index];+    bottom_bound = lowest_offset + 1;  // 2 index can't share the same offset+  }++  // Parse padded size using offset difference for all member except for the last entry...+  for (uint32_t i = 0; i < (p_var->member_count - 1); ++i) {+    SpvReflectBlockVariable* p_member_var = pp_member_offset_order[i];+    SpvReflectBlockVariable* p_next_member_var = pp_member_offset_order[i + 1];+    p_member_var->padded_size = p_next_member_var->offset - p_member_var->offset;+    if (p_member_var->size > p_member_var->padded_size) {+      p_member_var->size = p_member_var->padded_size;+    }+    if (is_parent_rta) {+      p_member_var->padded_size = p_member_var->size;+    }+  }++  // ...last entry just gets rounded up to near multiple of SPIRV_DATA_ALIGNMENT, which is 16 and+  // subtract the offset.+  // last entry == entry with largest offset value+  SpvReflectBlockVariable* p_last_member_var = pp_member_offset_order[p_var->member_count - 1];+  p_last_member_var->padded_size =+      RoundUp(p_last_member_var->offset + p_last_member_var->size, SPIRV_DATA_ALIGNMENT) - p_last_member_var->offset;+  if (p_last_member_var->size > p_last_member_var->padded_size) {+    p_last_member_var->size = p_last_member_var->padded_size;+  }+  if (is_parent_rta) {+    p_last_member_var->padded_size = p_last_member_var->size;+  }++  SafeFree(pp_member_offset_order);++  // If buffer ref, sizes are same as uint64_t+  if (is_parent_ref) {+    p_var->size = p_var->padded_size = 8;+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  // @TODO validate this with assertion+  p_var->size = p_last_member_var->offset + p_last_member_var->padded_size;+  p_var->padded_size = p_var->size;++  return SPV_REFLECT_RESULT_SUCCESS;+}++static void MarkSelfAndAllMemberVarsAsUsed(SpvReflectBlockVariable* p_var) {+  // Clear the current variable's UNUSED flag+  p_var->flags &= ~SPV_REFLECT_VARIABLE_FLAGS_UNUSED;++  SpvOp op_type = p_var->type_description->op;+  switch (op_type) {+    default:+      break;++    case SpvOpTypeArray: {+    } break;++    case SpvOpTypeStruct: {+      for (uint32_t i = 0; i < p_var->member_count; ++i) {+        SpvReflectBlockVariable* p_member_var = &p_var->members[i];+        MarkSelfAndAllMemberVarsAsUsed(p_member_var);+      }+    } break;+  }+}++static SpvReflectResult ParseDescriptorBlockVariableUsage(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module,+                                                          SpvReflectPrvAccessChain* p_access_chain, uint32_t index_index,+                                                          SpvOp override_op_type, SpvReflectBlockVariable* p_var) {+  // Clear the current variable's UNUSED flag+  p_var->flags &= ~SPV_REFLECT_VARIABLE_FLAGS_UNUSED;++  // Parsing arrays requires overriding the op type for+  // for the lowest dim's element type.+  SpvReflectTypeDescription* p_type = p_var->type_description;+  SpvOp op_type = p_type->op;+  if (override_op_type != (SpvOp)INVALID_VALUE) {+    op_type = override_op_type;+  }++  switch (op_type) {+    default:+      break;++    case SpvOpTypeArray: {+      // Parse through array's type hierarchy to find the actual/non-array element type+      while ((p_type->op == SpvOpTypeArray) && (index_index < p_access_chain->index_count)) {+        // Find the array element type id+        SpvReflectPrvNode* p_node = FindNode(p_parser, p_type->id);+        if (p_node == NULL) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        uint32_t element_type_id = p_node->array_traits.element_type_id;+        // Get the array element type+        p_type = FindType(p_module, element_type_id);+        if (p_type == NULL) {+          return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+        }+        // Next access chain index+        index_index += 1;+      }++      // Only continue parsing if there's remaining indices in the access+      // chain. If the end of the access chain has been reached then all+      // remaining variables (including those in struct hierarchies)+      // are considered USED.+      //+      // See: https://github.com/KhronosGroup/SPIRV-Reflect/issues/78+      //+      if (index_index < p_access_chain->index_count) {+        // Parse current var again with a type override and advanced index index+        SpvReflectResult result =+            ParseDescriptorBlockVariableUsage(p_parser, p_module, p_access_chain, index_index, p_type->op, p_var);+        if (result != SPV_REFLECT_RESULT_SUCCESS) {+          return result;+        }+      } else {+        // Clear UNUSED flag for remaining variables+        MarkSelfAndAllMemberVarsAsUsed(p_var);+      }+    } break;++    case SpvOpTypePointer: {+      // Reference. Get to underlying struct type.+      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+      if (IsNull(p_type_node)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+      // Get the pointee type+      p_type = FindType(p_module, p_type_node->type_id);+      if (IsNull(p_type)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+      if (p_type->op != SpvOpTypeStruct) {+        break;+      }+      FALLTHROUGH;+    }++    case SpvOpTypeStruct: {+      assert(p_var->member_count > 0);+      if (p_var->member_count == 0) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_UNEXPECTED_BLOCK_DATA;+      }++      // The access chain can have zero indexes, if used for a runtime array+      if (p_access_chain->index_count == 0) {+        return SPV_REFLECT_RESULT_SUCCESS;+      }++      // Get member variable at the access's chain current index+      uint32_t index = p_access_chain->indexes[index_index];+      if (index >= p_var->member_count) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_BLOCK_MEMBER_REFERENCE;+      }+      SpvReflectBlockVariable* p_member_var = &p_var->members[index];++      bool is_pointer_to_pointer = IsPointerToPointer(p_parser, p_access_chain->result_type_id);+      if (is_pointer_to_pointer) {+        // Remember block var for this access chain for downstream dereference+        p_access_chain->block_var = p_member_var;+      }++      // Next access chain index+      index_index += 1;++      // Only continue parsing if there's remaining indices in the access+      // chain. If the end of the access chain has been reach then all+      // remaining variables (including those in struct hierarchies)+      // are considered USED.+      //+      // See: https://github.com/KhronosGroup/SPIRV-Reflect/issues/78+      //+      if (index_index < p_access_chain->index_count) {+        SpvReflectResult result =+            ParseDescriptorBlockVariableUsage(p_parser, p_module, p_access_chain, index_index, (SpvOp)INVALID_VALUE, p_member_var);+        if (result != SPV_REFLECT_RESULT_SUCCESS) {+          return result;+        }+      } else if (!is_pointer_to_pointer) {+        // Clear UNUSED flag for remaining variables+        MarkSelfAndAllMemberVarsAsUsed(p_member_var);+      }+    } break;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseDescriptorBlocks(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  if (p_module->descriptor_binding_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_parser->physical_pointer_struct_count = 0;++  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);+    SpvReflectTypeDescription* p_type = p_descriptor->type_description;+    if ((p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER) &&+        (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER)) {+      continue;+    }++    // Mark UNUSED+    p_descriptor->block.flags |= SPV_REFLECT_VARIABLE_FLAGS_UNUSED;+    p_parser->physical_pointer_count = 0;+    // Parse descriptor block+    SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_type, &p_descriptor->block);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }++    for (uint32_t access_chain_index = 0; access_chain_index < p_parser->access_chain_count; ++access_chain_index) {+      SpvReflectPrvAccessChain* p_access_chain = &(p_parser->access_chains[access_chain_index]);+      // Skip any access chains that aren't touching this descriptor block+      if (p_descriptor->spirv_id != p_access_chain->base_id) {+        continue;+      }+      result = ParseDescriptorBlockVariableUsage(p_parser, p_module, p_access_chain, 0, (SpvOp)INVALID_VALUE, &p_descriptor->block);+      if (result != SPV_REFLECT_RESULT_SUCCESS) {+        return result;+      }+    }++    p_descriptor->block.name = p_descriptor->name;++    bool is_parent_rta = (p_descriptor->descriptor_type == SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER);+    result = ParseDescriptorBlockVariableSizes(p_parser, p_module, true, false, is_parent_rta, &p_descriptor->block);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }++    if (is_parent_rta) {+      p_descriptor->block.size = 0;+      p_descriptor->block.padded_size = 0;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseFormat(const SpvReflectTypeDescription* p_type, SpvReflectFormat* p_format) {+  SpvReflectResult result = SPV_REFLECT_RESULT_ERROR_INTERNAL_ERROR;+  bool signedness = (p_type->traits.numeric.scalar.signedness != 0);+  uint32_t bit_width = p_type->traits.numeric.scalar.width;+  if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_VECTOR) {+    uint32_t component_count = p_type->traits.numeric.vector.component_count;+    if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_FLOAT) {+      switch (bit_width) {+        case 16: {+          switch (component_count) {+            case 2:+              *p_format = SPV_REFLECT_FORMAT_R16G16_SFLOAT;+              break;+            case 3:+              *p_format = SPV_REFLECT_FORMAT_R16G16B16_SFLOAT;+              break;+            case 4:+              *p_format = SPV_REFLECT_FORMAT_R16G16B16A16_SFLOAT;+              break;+          }+        } break;++        case 32: {+          switch (component_count) {+            case 2:+              *p_format = SPV_REFLECT_FORMAT_R32G32_SFLOAT;+              break;+            case 3:+              *p_format = SPV_REFLECT_FORMAT_R32G32B32_SFLOAT;+              break;+            case 4:+              *p_format = SPV_REFLECT_FORMAT_R32G32B32A32_SFLOAT;+              break;+          }+        } break;++        case 64: {+          switch (component_count) {+            case 2:+              *p_format = SPV_REFLECT_FORMAT_R64G64_SFLOAT;+              break;+            case 3:+              *p_format = SPV_REFLECT_FORMAT_R64G64B64_SFLOAT;+              break;+            case 4:+              *p_format = SPV_REFLECT_FORMAT_R64G64B64A64_SFLOAT;+              break;+          }+        }+      }+      result = SPV_REFLECT_RESULT_SUCCESS;+    } else if (p_type->type_flags & (SPV_REFLECT_TYPE_FLAG_INT | SPV_REFLECT_TYPE_FLAG_BOOL)) {+      switch (bit_width) {+        case 16: {+          switch (component_count) {+            case 2:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R16G16_SINT : SPV_REFLECT_FORMAT_R16G16_UINT;+              break;+            case 3:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R16G16B16_SINT : SPV_REFLECT_FORMAT_R16G16B16_UINT;+              break;+            case 4:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R16G16B16A16_SINT : SPV_REFLECT_FORMAT_R16G16B16A16_UINT;+              break;+          }+        } break;++        case 32: {+          switch (component_count) {+            case 2:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32_SINT : SPV_REFLECT_FORMAT_R32G32_UINT;+              break;+            case 3:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32B32_SINT : SPV_REFLECT_FORMAT_R32G32B32_UINT;+              break;+            case 4:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R32G32B32A32_SINT : SPV_REFLECT_FORMAT_R32G32B32A32_UINT;+              break;+          }+        } break;++        case 64: {+          switch (component_count) {+            case 2:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64_SINT : SPV_REFLECT_FORMAT_R64G64_UINT;+              break;+            case 3:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64B64_SINT : SPV_REFLECT_FORMAT_R64G64B64_UINT;+              break;+            case 4:+              *p_format = signedness ? SPV_REFLECT_FORMAT_R64G64B64A64_SINT : SPV_REFLECT_FORMAT_R64G64B64A64_UINT;+              break;+          }+        }+      }+      result = SPV_REFLECT_RESULT_SUCCESS;+    }+  } else if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_FLOAT) {+    switch (bit_width) {+      case 16:+        *p_format = SPV_REFLECT_FORMAT_R16_SFLOAT;+        break;+      case 32:+        *p_format = SPV_REFLECT_FORMAT_R32_SFLOAT;+        break;+      case 64:+        *p_format = SPV_REFLECT_FORMAT_R64_SFLOAT;+        break;+    }+    result = SPV_REFLECT_RESULT_SUCCESS;+  } else if (p_type->type_flags & (SPV_REFLECT_TYPE_FLAG_INT | SPV_REFLECT_TYPE_FLAG_BOOL)) {+    switch (bit_width) {+      case 16:+        *p_format = signedness ? SPV_REFLECT_FORMAT_R16_SINT : SPV_REFLECT_FORMAT_R16_UINT;+        break;+        break;+      case 32:+        *p_format = signedness ? SPV_REFLECT_FORMAT_R32_SINT : SPV_REFLECT_FORMAT_R32_UINT;+        break;+        break;+      case 64:+        *p_format = signedness ? SPV_REFLECT_FORMAT_R64_SINT : SPV_REFLECT_FORMAT_R64_UINT;+        break;+    }+    result = SPV_REFLECT_RESULT_SUCCESS;+  } else if (p_type->type_flags & SPV_REFLECT_TYPE_FLAG_STRUCT) {+    *p_format = SPV_REFLECT_FORMAT_UNDEFINED;+    result = SPV_REFLECT_RESULT_SUCCESS;+  }+  return result;+}++static SpvReflectResult ParseInterfaceVariable(SpvReflectPrvParser* p_parser,+                                               const SpvReflectPrvDecorations* p_var_node_decorations,+                                               const SpvReflectPrvDecorations* p_type_node_decorations,+                                               SpvReflectShaderModule* p_module, SpvReflectTypeDescription* p_type,+                                               SpvReflectInterfaceVariable* p_var, bool* p_has_built_in) {+  SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+  if (IsNull(p_type_node)) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+  }++  if (p_type->member_count > 0) {+    p_var->member_count = p_type->member_count;+    p_var->members = (SpvReflectInterfaceVariable*)calloc(p_var->member_count, sizeof(*p_var->members));+    if (IsNull(p_var->members)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }++    for (uint32_t member_index = 0; member_index < p_type_node->member_count; ++member_index) {+      SpvReflectPrvDecorations* p_member_decorations = &p_type_node->member_decorations[member_index];+      SpvReflectTypeDescription* p_member_type = &p_type->members[member_index];+      SpvReflectInterfaceVariable* p_member_var = &p_var->members[member_index];++      // Storage class is the same throughout the whole struct+      p_member_var->storage_class = p_var->storage_class;++      SpvReflectResult result =+          ParseInterfaceVariable(p_parser, NULL, p_member_decorations, p_module, p_member_type, p_member_var, p_has_built_in);+      if (result != SPV_REFLECT_RESULT_SUCCESS) {+        SPV_REFLECT_ASSERT(false);+        return result;+      }+    }+  }++  p_var->name = p_type_node->name;+  p_var->decoration_flags = ApplyDecorations(p_type_node_decorations);+  if (p_var_node_decorations != NULL) {+    p_var->decoration_flags |= ApplyDecorations(p_var_node_decorations);+  } else {+    // Apply member decoration values to struct members+    p_var->location = p_type_node_decorations->location.value;+    p_var->component = p_type_node_decorations->component.value;+  }++  p_var->built_in = p_type_node_decorations->built_in;+  ApplyNumericTraits(p_type, &p_var->numeric);+  if (p_type->op == SpvOpTypeArray) {+    ApplyArrayTraits(p_type, &p_var->array);+  }++  p_var->type_description = p_type;++  *p_has_built_in |= p_type_node_decorations->is_built_in;++  // Only parse format for interface variables that are input or output+  if ((p_var->storage_class == SpvStorageClassInput) || (p_var->storage_class == SpvStorageClassOutput)) {+    SpvReflectResult result = ParseFormat(p_var->type_description, &p_var->format);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      SPV_REFLECT_ASSERT(false);+      return result;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseInterfaceVariables(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module,+                                                SpvReflectEntryPoint* p_entry, uint32_t interface_variable_count,+                                                uint32_t* p_interface_variable_ids) {+  if (interface_variable_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_entry->interface_variable_count = interface_variable_count;+  p_entry->input_variable_count = 0;+  p_entry->output_variable_count = 0;+  for (size_t i = 0; i < interface_variable_count; ++i) {+    uint32_t var_result_id = *(p_interface_variable_ids + i);+    SpvReflectPrvNode* p_node = FindNode(p_parser, var_result_id);+    if (IsNull(p_node)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }++    if (p_node->storage_class == SpvStorageClassInput) {+      p_entry->input_variable_count += 1;+    } else if (p_node->storage_class == SpvStorageClassOutput) {+      p_entry->output_variable_count += 1;+    }+  }++  if (p_entry->input_variable_count > 0) {+    p_entry->input_variables =+        (SpvReflectInterfaceVariable**)calloc(p_entry->input_variable_count, sizeof(*(p_entry->input_variables)));+    if (IsNull(p_entry->input_variables)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  if (p_entry->output_variable_count > 0) {+    p_entry->output_variables =+        (SpvReflectInterfaceVariable**)calloc(p_entry->output_variable_count, sizeof(*(p_entry->output_variables)));+    if (IsNull(p_entry->output_variables)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  if (p_entry->interface_variable_count > 0) {+    p_entry->interface_variables =+        (SpvReflectInterfaceVariable*)calloc(p_entry->interface_variable_count, sizeof(*(p_entry->interface_variables)));+    if (IsNull(p_entry->interface_variables)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  size_t input_index = 0;+  size_t output_index = 0;+  for (size_t i = 0; i < interface_variable_count; ++i) {+    uint32_t var_result_id = *(p_interface_variable_ids + i);+    SpvReflectPrvNode* p_node = FindNode(p_parser, var_result_id);+    if (IsNull(p_node)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }++    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);+    if (IsNull(p_node) || IsNull(p_type)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }+    // If the type is a pointer, resolve it+    if (p_type->op == SpvOpTypePointer) {+      // Find the type's node+      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+      if (IsNull(p_type_node)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+      // Should be the resolved type+      p_type = FindType(p_module, p_type_node->type_id);+      if (IsNull(p_type)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+    }++    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+    if (IsNull(p_type_node)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }++    SpvReflectInterfaceVariable* p_var = &(p_entry->interface_variables[i]);+    p_var->storage_class = p_node->storage_class;++    bool has_built_in = p_node->decorations.is_built_in;+    SpvReflectResult result =+        ParseInterfaceVariable(p_parser, &p_node->decorations, &p_type_node->decorations, p_module, p_type, p_var, &has_built_in);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      SPV_REFLECT_ASSERT(false);+      return result;+    }++    // Input and output variables+    if (p_var->storage_class == SpvStorageClassInput) {+      p_entry->input_variables[input_index] = p_var;+      ++input_index;+    } else if (p_node->storage_class == SpvStorageClassOutput) {+      p_entry->output_variables[output_index] = p_var;+      ++output_index;+    }++    // SPIR-V result id+    p_var->spirv_id = p_node->result_id;+    // Name+    p_var->name = p_node->name;+    // Semantic+    p_var->semantic = p_node->decorations.semantic.value;++    // Decorate with built-in if any member is built-in+    if (has_built_in) {+      p_var->decoration_flags |= SPV_REFLECT_DECORATION_BUILT_IN;+    }++    // Location is decorated on OpVariable node, not the type node.+    p_var->location = p_node->decorations.location.value;+    p_var->component = p_node->decorations.component.value;+    p_var->word_offset.location = p_node->decorations.location.word_offset;++    // Built in+    if (p_node->decorations.is_built_in) {+      p_var->built_in = p_node->decorations.built_in;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult EnumerateAllPushConstants(SpvReflectShaderModule* p_module, size_t* p_push_constant_count,+                                                  uint32_t** p_push_constants) {+  *p_push_constant_count = p_module->push_constant_block_count;+  if (*p_push_constant_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }+  *p_push_constants = (uint32_t*)calloc(*p_push_constant_count, sizeof(**p_push_constants));++  if (IsNull(*p_push_constants)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  for (size_t i = 0; i < *p_push_constant_count; ++i) {+    (*p_push_constants)[i] = p_module->push_constant_blocks[i].spirv_id;+  }+  qsort(*p_push_constants, *p_push_constant_count, sizeof(**p_push_constants), SortCompareUint32);+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult TraverseCallGraph(SpvReflectPrvParser* p_parser, SpvReflectPrvFunction* p_func, size_t* p_func_count,+                                          uint32_t* p_func_ids, uint32_t depth) {+  if (depth > p_parser->function_count) {+    // Vulkan does not permit recursion (Vulkan spec Appendix A):+    //   "Recursion: The static function-call graph for an entry point must not+    //    contain cycles."+    return SPV_REFLECT_RESULT_ERROR_SPIRV_RECURSION;+  }+  if (IsNotNull(p_func_ids)) {+    p_func_ids[(*p_func_count)++] = p_func->id;+  } else {+    ++*p_func_count;+  }+  for (size_t i = 0; i < p_func->callee_count; ++i) {+    SpvReflectResult result = TraverseCallGraph(p_parser, p_func->callee_ptrs[i], p_func_count, p_func_ids, depth + 1);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++static uint32_t GetUint32Constant(SpvReflectPrvParser* p_parser, uint32_t id) {+  uint32_t result = (uint32_t)INVALID_VALUE;+  SpvReflectPrvNode* p_node = FindNode(p_parser, id);+  if (p_node && p_node->op == SpvOpConstant) {+    UNCHECKED_READU32(p_parser, p_node->word_offset + 3, result);+  }+  return result;+}++static bool HasByteAddressBufferOffset(SpvReflectPrvNode* p_node, SpvReflectDescriptorBinding* p_binding) {+  return IsNotNull(p_node) && IsNotNull(p_binding) && p_node->op == SpvOpAccessChain && p_node->word_count == 6 &&+         (p_binding->user_type == SPV_REFLECT_USER_TYPE_BYTE_ADDRESS_BUFFER ||+          p_binding->user_type == SPV_REFLECT_USER_TYPE_RW_BYTE_ADDRESS_BUFFER);+}++static SpvReflectResult ParseByteAddressBuffer(SpvReflectPrvParser* p_parser, SpvReflectPrvNode* p_node,+                                               SpvReflectDescriptorBinding* p_binding) {+  const SpvReflectResult not_found = SPV_REFLECT_RESULT_SUCCESS;+  if (!HasByteAddressBufferOffset(p_node, p_binding)) {+    return not_found;+  }++  uint32_t offset = 0;  // starting offset++  uint32_t base_id = 0;+  // expect first index of 2D access is zero+  UNCHECKED_READU32(p_parser, p_node->word_offset + 4, base_id);+  if (GetUint32Constant(p_parser, base_id) != 0) {+    return not_found;+  }+  UNCHECKED_READU32(p_parser, p_node->word_offset + 5, base_id);+  SpvReflectPrvNode* p_next_node = FindNode(p_parser, base_id);+  if (IsNull(p_next_node)) {+    return not_found;+  } else if (p_next_node->op == SpvOpConstant) {+    // The access chain might just be a constant right to the offset+    offset = GetUint32Constant(p_parser, base_id);+    p_binding->byte_address_buffer_offsets[p_binding->byte_address_buffer_offset_count] = offset;+    p_binding->byte_address_buffer_offset_count++;+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  // there is usually 2 (sometimes 3) instrucitons that make up the arithmetic logic to calculate the offset+  SpvReflectPrvNode* arithmetic_node_stack[8];+  uint32_t arithmetic_count = 0;++  while (IsNotNull(p_next_node)) {+    if (p_next_node->op == SpvOpLoad || p_next_node->op == SpvOpBitcast || p_next_node->op == SpvOpConstant) {+      break;  // arithmetic starts here+    }+    arithmetic_node_stack[arithmetic_count++] = p_next_node;+    if (arithmetic_count >= 8) {+      return not_found;+    }++    UNCHECKED_READU32(p_parser, p_next_node->word_offset + 3, base_id);+    p_next_node = FindNode(p_parser, base_id);+  }++  const uint32_t count = arithmetic_count;+  for (uint32_t i = 0; i < count; i++) {+    p_next_node = arithmetic_node_stack[--arithmetic_count];+    // All arithmetic ops takes 2 operands, assumption is the 2nd operand has the constant+    UNCHECKED_READU32(p_parser, p_next_node->word_offset + 4, base_id);+    uint32_t value = GetUint32Constant(p_parser, base_id);+    if (value == INVALID_VALUE) {+      return not_found;+    }++    switch (p_next_node->op) {+      case SpvOpShiftRightLogical:+        offset >>= value;+        break;+      case SpvOpIAdd:+        offset += value;+        break;+      case SpvOpISub:+        offset -= value;+        break;+      case SpvOpIMul:+        offset *= value;+        break;+      case SpvOpUDiv:+        offset /= value;+        break;+      case SpvOpSDiv:+        // OpConstant might be signed, but value should never be negative+        assert((int32_t)value > 0);+        offset /= value;+        break;+      default:+        return not_found;+    }+  }++  p_binding->byte_address_buffer_offsets[p_binding->byte_address_buffer_offset_count] = offset;+  p_binding->byte_address_buffer_offset_count++;+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseFunctionParameterAccess(SpvReflectPrvParser* p_parser, uint32_t callee_function_id,+                                                     uint32_t function_parameter_index, uint32_t* p_accessed) {+  SpvReflectPrvFunction* p_func = NULL;+  for (size_t i = 0; i < p_parser->function_count; ++i) {+    if (p_parser->functions[i].id == callee_function_id) {+      p_func = &(p_parser->functions[i]);+      break;+    }+  }+  if (p_func == NULL) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+  }++  assert(function_parameter_index < p_func->parameter_count);++  for (size_t i = 0; i < p_func->accessed_variable_count; ++i) {+    if (p_func->parameters[function_parameter_index] == p_func->accessed_variables[i].variable_ptr) {+      SpvReflectPrvAccessedVariable* p_var = &p_func->accessed_variables[i];+      if (p_var->function_id > 0) {+        SpvReflectResult result =+            ParseFunctionParameterAccess(p_parser, p_var->function_id, p_var->function_parameter_index, p_accessed);+        if (result != SPV_REFLECT_RESULT_SUCCESS) {+          return result;+        }+      } else {+        *p_accessed = 1;+      }+      // Early out as soon as p_accessed is true+      if (*p_accessed) {+        return SPV_REFLECT_RESULT_SUCCESS;+      }+    }+  }++  *p_accessed = 0;+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseStaticallyUsedResources(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module,+                                                     SpvReflectEntryPoint* p_entry, size_t uniform_count, uint32_t* uniforms,+                                                     size_t push_constant_count, uint32_t* push_constants) {+  // Find function with the right id+  SpvReflectPrvFunction* p_func = NULL;+  for (size_t i = 0; i < p_parser->function_count; ++i) {+    if (p_parser->functions[i].id == p_entry->id) {+      p_func = &(p_parser->functions[i]);+      break;+    }+  }+  if (p_func == NULL) {+    return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+  }++  size_t called_function_count = 0;+  SpvReflectResult result = TraverseCallGraph(p_parser, p_func, &called_function_count, NULL, 0);+  if (result != SPV_REFLECT_RESULT_SUCCESS) {+    return result;+  }++  uint32_t* p_called_functions = NULL;+  if (called_function_count > 0) {+    p_called_functions = (uint32_t*)calloc(called_function_count, sizeof(*p_called_functions));+    if (IsNull(p_called_functions)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }++  called_function_count = 0;+  result = TraverseCallGraph(p_parser, p_func, &called_function_count, p_called_functions, 0);+  if (result != SPV_REFLECT_RESULT_SUCCESS) {+    SafeFree(p_called_functions);+    return result;+  }++  if (called_function_count > 0) {+    qsort(p_called_functions, called_function_count, sizeof(*p_called_functions), SortCompareUint32);+  }+  called_function_count = DedupSortedUint32(p_called_functions, called_function_count);++  uint32_t used_acessed_count = 0;+  for (size_t i = 0, j = 0; i < called_function_count; ++i) {+    // No need to bounds check j because a missing ID issue would have been+    // found during TraverseCallGraph+    while (p_parser->functions[j].id != p_called_functions[i]) {+      ++j;+    }+    used_acessed_count += p_parser->functions[j].accessed_variable_count;+  }+  SpvReflectPrvAccessedVariable* p_used_accesses = NULL;+  if (used_acessed_count > 0) {+    p_used_accesses = (SpvReflectPrvAccessedVariable*)calloc(used_acessed_count, sizeof(SpvReflectPrvAccessedVariable));+    if (IsNull(p_used_accesses)) {+      SafeFree(p_called_functions);+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+  }+  used_acessed_count = 0;+  for (size_t i = 0, j = 0; i < called_function_count; ++i) {+    while (p_parser->functions[j].id != p_called_functions[i]) {+      ++j;+    }++    memcpy(&p_used_accesses[used_acessed_count], p_parser->functions[j].accessed_variables,+           p_parser->functions[j].accessed_variable_count * sizeof(SpvReflectPrvAccessedVariable));+    used_acessed_count += p_parser->functions[j].accessed_variable_count;+  }+  SafeFree(p_called_functions);++  if (used_acessed_count > 0) {+    qsort(p_used_accesses, used_acessed_count, sizeof(*p_used_accesses), SortCompareAccessedVariable);+  }++  // Do set intersection to find the used uniform and push constants+  size_t used_uniform_count = 0;+  result = IntersectSortedAccessedVariable(p_used_accesses, used_acessed_count, uniforms, uniform_count, &p_entry->used_uniforms,+                                           &used_uniform_count);+  if (result != SPV_REFLECT_RESULT_SUCCESS) {+    SafeFree(p_used_accesses);+    return result;+  }++  size_t used_push_constant_count = 0;+  result = IntersectSortedAccessedVariable(p_used_accesses, used_acessed_count, push_constants, push_constant_count,+                                           &p_entry->used_push_constants, &used_push_constant_count);+  if (result != SPV_REFLECT_RESULT_SUCCESS) {+    SafeFree(p_used_accesses);+    return result;+  }++  for (uint32_t i = 0; i < p_module->descriptor_binding_count; ++i) {+    SpvReflectDescriptorBinding* p_binding = &p_module->descriptor_bindings[i];+    uint32_t byte_address_buffer_offset_count = 0;++    for (uint32_t j = 0; j < used_acessed_count; j++) {+      SpvReflectPrvAccessedVariable* p_var = &p_used_accesses[j];+      if (p_var->variable_ptr == p_binding->spirv_id) {+        if (p_var->function_id > 0) {+          result =+              ParseFunctionParameterAccess(p_parser, p_var->function_id, p_var->function_parameter_index, &p_binding->accessed);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            SafeFree(p_used_accesses);+            return result;+          }+        } else {+          p_binding->accessed = 1;+        }++        if (HasByteAddressBufferOffset(p_used_accesses[j].p_node, p_binding)) {+          byte_address_buffer_offset_count++;+        }+      }+    }++    // only if SPIR-V has ByteAddressBuffer user type+    if (byte_address_buffer_offset_count > 0) {+      bool multi_entrypoint = p_binding->byte_address_buffer_offset_count > 0;+      if (multi_entrypoint) {+        // If there is a 2nd entrypoint, we can have multiple entry points, in this case we want to just combine the accessed+        // offsets and then de-duplicate it+        uint32_t* prev_byte_address_buffer_offsets = p_binding->byte_address_buffer_offsets;+        p_binding->byte_address_buffer_offsets =+            (uint32_t*)calloc(byte_address_buffer_offset_count + p_binding->byte_address_buffer_offset_count, sizeof(uint32_t));+        memcpy(p_binding->byte_address_buffer_offsets, prev_byte_address_buffer_offsets,+               sizeof(uint32_t) * p_binding->byte_address_buffer_offset_count);+        SafeFree(prev_byte_address_buffer_offsets);+      } else {+        // possible not all allocated offset slots are used, but this will be a max per binding+        p_binding->byte_address_buffer_offsets = (uint32_t*)calloc(byte_address_buffer_offset_count, sizeof(uint32_t));+      }++      if (IsNull(p_binding->byte_address_buffer_offsets)) {+        SafeFree(p_used_accesses);+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }++      for (uint32_t j = 0; j < used_acessed_count; j++) {+        if (p_used_accesses[j].variable_ptr == p_binding->spirv_id) {+          result = ParseByteAddressBuffer(p_parser, p_used_accesses[j].p_node, p_binding);+          if (result != SPV_REFLECT_RESULT_SUCCESS) {+            SafeFree(p_used_accesses);+            return result;+          }+        }+      }++      if (multi_entrypoint) {+        qsort(p_binding->byte_address_buffer_offsets, p_binding->byte_address_buffer_offset_count,+              sizeof(*(p_binding->byte_address_buffer_offsets)), SortCompareUint32);+        p_binding->byte_address_buffer_offset_count =+            (uint32_t)DedupSortedUint32(p_binding->byte_address_buffer_offsets, p_binding->byte_address_buffer_offset_count);+      }+    }+  }++  SafeFree(p_used_accesses);++  p_entry->used_uniform_count = (uint32_t)used_uniform_count;+  p_entry->used_push_constant_count = (uint32_t)used_push_constant_count;++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseEntryPoints(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  if (p_parser->entry_point_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_module->entry_point_count = p_parser->entry_point_count;+  p_module->entry_points = (SpvReflectEntryPoint*)calloc(p_module->entry_point_count, sizeof(*(p_module->entry_points)));+  if (IsNull(p_module->entry_points)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  SpvReflectResult result;+  size_t uniform_count = 0;+  uint32_t* uniforms = NULL;+  if ((result = EnumerateAllUniforms(p_module, &uniform_count, &uniforms)) != SPV_REFLECT_RESULT_SUCCESS) {+    return result;+  }+  size_t push_constant_count = 0;+  uint32_t* push_constants = NULL;+  if ((result = EnumerateAllPushConstants(p_module, &push_constant_count, &push_constants)) != SPV_REFLECT_RESULT_SUCCESS) {+    return result;+  }++  size_t entry_point_index = 0;+  for (size_t i = 0; entry_point_index < p_parser->entry_point_count && i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if (p_node->op != SpvOpEntryPoint) {+      continue;+    }++    SpvReflectEntryPoint* p_entry_point = &(p_module->entry_points[entry_point_index]);+    CHECKED_READU32_CAST(p_parser, p_node->word_offset + 1, SpvExecutionModel, p_entry_point->spirv_execution_model);+    CHECKED_READU32(p_parser, p_node->word_offset + 2, p_entry_point->id);++    switch (p_entry_point->spirv_execution_model) {+      default:+        break;+      case SpvExecutionModelVertex:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_VERTEX_BIT;+        break;+      case SpvExecutionModelTessellationControl:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TESSELLATION_CONTROL_BIT;+        break;+      case SpvExecutionModelTessellationEvaluation:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;+        break;+      case SpvExecutionModelGeometry:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_GEOMETRY_BIT;+        break;+      case SpvExecutionModelFragment:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_FRAGMENT_BIT;+        break;+      case SpvExecutionModelGLCompute:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_COMPUTE_BIT;+        break;+      case SpvExecutionModelTaskNV:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TASK_BIT_NV;+        break;+      case SpvExecutionModelTaskEXT:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_TASK_BIT_EXT;+        break;+      case SpvExecutionModelMeshNV:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_MESH_BIT_NV;+        break;+      case SpvExecutionModelMeshEXT:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_MESH_BIT_EXT;+        break;+      case SpvExecutionModelRayGenerationKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_RAYGEN_BIT_KHR;+        break;+      case SpvExecutionModelIntersectionKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_INTERSECTION_BIT_KHR;+        break;+      case SpvExecutionModelAnyHitKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_ANY_HIT_BIT_KHR;+        break;+      case SpvExecutionModelClosestHitKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;+        break;+      case SpvExecutionModelMissKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_MISS_BIT_KHR;+        break;+      case SpvExecutionModelCallableKHR:+        p_entry_point->shader_stage = SPV_REFLECT_SHADER_STAGE_CALLABLE_BIT_KHR;+        break;+    }++    ++entry_point_index;++    // Name length is required to calculate next operand+    uint32_t name_start_word_offset = 3;+    uint32_t name_length_with_terminator = 0;+    result =+        ReadStr(p_parser, p_node->word_offset + name_start_word_offset, 0, p_node->word_count, &name_length_with_terminator, NULL);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }+    p_entry_point->name = (const char*)(p_parser->spirv_code + p_node->word_offset + name_start_word_offset);++    uint32_t name_word_count = RoundUp(name_length_with_terminator, SPIRV_WORD_SIZE) / SPIRV_WORD_SIZE;+    uint32_t interface_variable_count = (p_node->word_count - (name_start_word_offset + name_word_count));+    uint32_t* p_interface_variables = NULL;+    if (interface_variable_count > 0) {+      p_interface_variables = (uint32_t*)calloc(interface_variable_count, sizeof(*(p_interface_variables)));+      if (IsNull(p_interface_variables)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }+    }++    for (uint32_t var_index = 0; var_index < interface_variable_count; ++var_index) {+      uint32_t var_result_id = (uint32_t)INVALID_VALUE;+      uint32_t offset = name_start_word_offset + name_word_count + var_index;+      CHECKED_READU32(p_parser, p_node->word_offset + offset, var_result_id);+      p_interface_variables[var_index] = var_result_id;+    }++    result = ParseInterfaceVariables(p_parser, p_module, p_entry_point, interface_variable_count, p_interface_variables);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }+    SafeFree(p_interface_variables);++    result = ParseStaticallyUsedResources(p_parser, p_module, p_entry_point, uniform_count, uniforms, push_constant_count,+                                          push_constants);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }+  }++  SafeFree(uniforms);+  SafeFree(push_constants);++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseExecutionModes(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  assert(IsNotNull(p_parser));+  assert(IsNotNull(p_parser->nodes));+  assert(IsNotNull(p_module));++  if (IsNotNull(p_parser) && IsNotNull(p_parser->spirv_code) && IsNotNull(p_parser->nodes)) {+    for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[node_idx]);+      if (p_node->op != SpvOpExecutionMode && p_node->op != SpvOpExecutionModeId) {+        continue;+      }++      // Read entry point id+      uint32_t entry_point_id = 0;+      CHECKED_READU32(p_parser, p_node->word_offset + 1, entry_point_id);++      // Find entry point+      SpvReflectEntryPoint* p_entry_point = NULL;+      for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {+        if (p_module->entry_points[entry_point_idx].id == entry_point_id) {+          p_entry_point = &p_module->entry_points[entry_point_idx];+          break;+        }+      }+      // Bail if entry point is null+      if (IsNull(p_entry_point)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ENTRY_POINT;+      }++      // Read execution mode+      uint32_t execution_mode = (uint32_t)INVALID_VALUE;+      CHECKED_READU32(p_parser, p_node->word_offset + 2, execution_mode);++      // Parse execution mode+      switch (execution_mode) {+        case SpvExecutionModeInvocations: {+          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->invocations);+        } break;++        case SpvExecutionModeLocalSize: {+          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->local_size.x);+          CHECKED_READU32(p_parser, p_node->word_offset + 4, p_entry_point->local_size.y);+          CHECKED_READU32(p_parser, p_node->word_offset + 5, p_entry_point->local_size.z);+        } break;+        case SpvExecutionModeLocalSizeId: {+          uint32_t local_size_x_id = 0;+          uint32_t local_size_y_id = 0;+          uint32_t local_size_z_id = 0;+          CHECKED_READU32(p_parser, p_node->word_offset + 3, local_size_x_id);+          CHECKED_READU32(p_parser, p_node->word_offset + 4, local_size_y_id);+          CHECKED_READU32(p_parser, p_node->word_offset + 5, local_size_z_id);++          SpvReflectPrvNode* x_node = FindNode(p_parser, local_size_x_id);+          SpvReflectPrvNode* y_node = FindNode(p_parser, local_size_y_id);+          SpvReflectPrvNode* z_node = FindNode(p_parser, local_size_z_id);+          if (IsNotNull(x_node) && IsNotNull(y_node) && IsNotNull(z_node)) {+            if (IsSpecConstant(x_node)) {+              p_entry_point->local_size.x = (uint32_t)SPV_REFLECT_EXECUTION_MODE_SPEC_CONSTANT;+            } else {+              CHECKED_READU32(p_parser, x_node->word_offset + 3, p_entry_point->local_size.x);+            }++            if (IsSpecConstant(y_node)) {+              p_entry_point->local_size.y = (uint32_t)SPV_REFLECT_EXECUTION_MODE_SPEC_CONSTANT;+            } else {+              CHECKED_READU32(p_parser, y_node->word_offset + 3, p_entry_point->local_size.y);+            }++            if (IsSpecConstant(z_node)) {+              p_entry_point->local_size.z = (uint32_t)SPV_REFLECT_EXECUTION_MODE_SPEC_CONSTANT;+            } else {+              CHECKED_READU32(p_parser, z_node->word_offset + 3, p_entry_point->local_size.z);+            }+          }+        } break;++        case SpvExecutionModeOutputVertices: {+          CHECKED_READU32(p_parser, p_node->word_offset + 3, p_entry_point->output_vertices);+        } break;++        default:+          break;+      }+      p_entry_point->execution_mode_count++;+    }+    uint32_t* indices = (uint32_t*)calloc(p_module->entry_point_count, sizeof(indices));+    if (IsNull(indices)) {+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+    for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {+      SpvReflectEntryPoint* p_entry_point = &p_module->entry_points[entry_point_idx];+      if (p_entry_point->execution_mode_count > 0) {+        p_entry_point->execution_modes =+            (SpvExecutionMode*)calloc(p_entry_point->execution_mode_count, sizeof(*p_entry_point->execution_modes));+        if (IsNull(p_entry_point->execution_modes)) {+          SafeFree(indices);+          return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+        }+      }+    }++    for (size_t node_idx = 0; node_idx < p_parser->node_count; ++node_idx) {+      SpvReflectPrvNode* p_node = &(p_parser->nodes[node_idx]);+      if (p_node->op != SpvOpExecutionMode) {+        continue;+      }++      // Read entry point id+      uint32_t entry_point_id = 0;+      CHECKED_READU32(p_parser, p_node->word_offset + 1, entry_point_id);++      // Find entry point+      SpvReflectEntryPoint* p_entry_point = NULL;+      uint32_t* idx = NULL;+      for (size_t entry_point_idx = 0; entry_point_idx < p_module->entry_point_count; ++entry_point_idx) {+        if (p_module->entry_points[entry_point_idx].id == entry_point_id) {+          p_entry_point = &p_module->entry_points[entry_point_idx];+          idx = &indices[entry_point_idx];+          break;+        }+      }++      // Read execution mode+      uint32_t execution_mode = (uint32_t)INVALID_VALUE;+      CHECKED_READU32(p_parser, p_node->word_offset + 2, execution_mode);+      p_entry_point->execution_modes[(*idx)++] = (SpvExecutionMode)execution_mode;+    }+    SafeFree(indices);+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParsePushConstantBlocks(SpvReflectPrvParser* p_parser, SpvReflectShaderModule* p_module) {+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if ((p_node->op != SpvOpVariable) || (p_node->storage_class != SpvStorageClassPushConstant)) {+      continue;+    }++    p_module->push_constant_block_count += 1;+  }++  if (p_module->push_constant_block_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  p_module->push_constant_blocks =+      (SpvReflectBlockVariable*)calloc(p_module->push_constant_block_count, sizeof(*p_module->push_constant_blocks));+  if (IsNull(p_module->push_constant_blocks)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }++  p_parser->physical_pointer_struct_count = 0;+  uint32_t push_constant_index = 0;+  for (size_t i = 0; i < p_parser->node_count; ++i) {+    SpvReflectPrvNode* p_node = &(p_parser->nodes[i]);+    if ((p_node->op != SpvOpVariable) || (p_node->storage_class != SpvStorageClassPushConstant)) {+      continue;+    }++    SpvReflectTypeDescription* p_type = FindType(p_module, p_node->type_id);+    if (IsNull(p_node) || IsNull(p_type)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }+    // If the type is a pointer, resolve it+    if (p_type->op == SpvOpTypePointer) {+      // Find the type's node+      SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+      if (IsNull(p_type_node)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+      // Should be the resolved type+      p_type = FindType(p_module, p_type_node->type_id);+      if (IsNull(p_type)) {+        return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+      }+    }++    SpvReflectPrvNode* p_type_node = FindNode(p_parser, p_type->id);+    if (IsNull(p_type_node)) {+      return SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ID_REFERENCE;+    }++    SpvReflectBlockVariable* p_push_constant = &p_module->push_constant_blocks[push_constant_index];+    p_push_constant->spirv_id = p_node->result_id;+    p_parser->physical_pointer_count = 0;+    SpvReflectResult result = ParseDescriptorBlockVariable(p_parser, p_module, p_type, p_push_constant);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }++    for (uint32_t access_chain_index = 0; access_chain_index < p_parser->access_chain_count; ++access_chain_index) {+      SpvReflectPrvAccessChain* p_access_chain = &(p_parser->access_chains[access_chain_index]);+      // Skip any access chains that aren't touching this push constant block+      if (p_push_constant->spirv_id != FindAccessChainBaseVariable(p_parser, p_access_chain)) {+        continue;+      }+      SpvReflectBlockVariable* p_var =+          (p_access_chain->base_id == p_push_constant->spirv_id) ? p_push_constant : GetRefBlkVar(p_parser, p_access_chain);+      result = ParseDescriptorBlockVariableUsage(p_parser, p_module, p_access_chain, 0, (SpvOp)INVALID_VALUE, p_var);+      if (result != SPV_REFLECT_RESULT_SUCCESS) {+        return result;+      }+    }++    p_push_constant->name = p_node->name;+    result = ParseDescriptorBlockVariableSizes(p_parser, p_module, true, false, false, p_push_constant);+    if (result != SPV_REFLECT_RESULT_SUCCESS) {+      return result;+    }++    // Get minimum offset for whole Push Constant block+    // It is not valid SPIR-V to have an empty Push Constant Block+    p_push_constant->offset = UINT32_MAX;+    for (uint32_t k = 0; k < p_push_constant->member_count; ++k) {+      const uint32_t member_offset = p_push_constant->members[k].offset;+      p_push_constant->offset = Min(p_push_constant->offset, member_offset);+    }++    ++push_constant_index;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static int SortCompareDescriptorSet(const void* a, const void* b) {+  const SpvReflectDescriptorSet* p_elem_a = (const SpvReflectDescriptorSet*)a;+  const SpvReflectDescriptorSet* p_elem_b = (const SpvReflectDescriptorSet*)b;+  int value = (int)(p_elem_a->set) - (int)(p_elem_b->set);+  // We should never see duplicate descriptor set numbers in a shader; if so, a tiebreaker+  // would be needed here.+  assert(value != 0);+  return value;+}++static SpvReflectResult ParseEntrypointDescriptorSets(SpvReflectShaderModule* p_module) {+  // Update the entry point's sets+  for (uint32_t i = 0; i < p_module->entry_point_count; ++i) {+    SpvReflectEntryPoint* p_entry = &p_module->entry_points[i];+    for (uint32_t j = 0; j < p_entry->descriptor_set_count; ++j) {+      SafeFree(p_entry->descriptor_sets[j].bindings);+    }+    SafeFree(p_entry->descriptor_sets);+    p_entry->descriptor_set_count = 0;+    for (uint32_t j = 0; j < p_module->descriptor_set_count; ++j) {+      const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];+      for (uint32_t k = 0; k < p_set->binding_count; ++k) {+        bool found = SearchSortedUint32(p_entry->used_uniforms, p_entry->used_uniform_count, p_set->bindings[k]->spirv_id);+        if (found) {+          ++p_entry->descriptor_set_count;+          break;+        }+      }+    }++    p_entry->descriptor_sets = NULL;+    if (p_entry->descriptor_set_count > 0) {+      p_entry->descriptor_sets = (SpvReflectDescriptorSet*)calloc(p_entry->descriptor_set_count, sizeof(*p_entry->descriptor_sets));+      if (IsNull(p_entry->descriptor_sets)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }+    }+    p_entry->descriptor_set_count = 0;+    for (uint32_t j = 0; j < p_module->descriptor_set_count; ++j) {+      const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];+      uint32_t count = 0;+      for (uint32_t k = 0; k < p_set->binding_count; ++k) {+        bool found = SearchSortedUint32(p_entry->used_uniforms, p_entry->used_uniform_count, p_set->bindings[k]->spirv_id);+        if (found) {+          ++count;+        }+      }+      if (count == 0) {+        continue;+      }+      SpvReflectDescriptorSet* p_entry_set = &p_entry->descriptor_sets[p_entry->descriptor_set_count++];+      p_entry_set->set = p_set->set;+      p_entry_set->bindings = (SpvReflectDescriptorBinding**)calloc(count, sizeof(*p_entry_set->bindings));+      if (IsNull(p_entry_set->bindings)) {+        return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+      }+      for (uint32_t k = 0; k < p_set->binding_count; ++k) {+        bool found = SearchSortedUint32(p_entry->used_uniforms, p_entry->used_uniform_count, p_set->bindings[k]->spirv_id);+        if (found) {+          p_entry_set->bindings[p_entry_set->binding_count++] = p_set->bindings[k];+        }+      }+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult ParseDescriptorSets(SpvReflectShaderModule* p_module) {+  // Count the descriptors in each set+  for (uint32_t i = 0; i < p_module->descriptor_binding_count; ++i) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[i]);++    // Look for a target set using the descriptor's set number+    SpvReflectDescriptorSet* p_target_set = NULL;+    for (uint32_t j = 0; j < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++j) {+      SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];+      if (p_set->set == p_descriptor->set) {+        p_target_set = p_set;+        break;+      }+    }++    // If a target set isn't found, find the first available one.+    if (IsNull(p_target_set)) {+      for (uint32_t j = 0; j < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++j) {+        SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[j];+        if (p_set->set == (uint32_t)INVALID_VALUE) {+          p_target_set = p_set;+          p_target_set->set = p_descriptor->set;+          break;+        }+      }+    }++    if (IsNull(p_target_set)) {+      return SPV_REFLECT_RESULT_ERROR_INTERNAL_ERROR;+    }++    p_target_set->binding_count += 1;+  }++  // Count the descriptor sets+  for (uint32_t i = 0; i < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++i) {+    const SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];+    if (p_set->set != (uint32_t)INVALID_VALUE) {+      p_module->descriptor_set_count += 1;+    }+  }++  // Sort the descriptor sets based on numbers+  if (p_module->descriptor_set_count > 0) {+    qsort(p_module->descriptor_sets, p_module->descriptor_set_count, sizeof(*(p_module->descriptor_sets)),+          SortCompareDescriptorSet);+  }++  // Build descriptor pointer array+  for (uint32_t i = 0; i < p_module->descriptor_set_count; ++i) {+    SpvReflectDescriptorSet* p_set = &(p_module->descriptor_sets[i]);+    p_set->bindings = (SpvReflectDescriptorBinding**)calloc(p_set->binding_count, sizeof(*(p_set->bindings)));++    uint32_t descriptor_index = 0;+    for (uint32_t j = 0; j < p_module->descriptor_binding_count; ++j) {+      SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[j]);+      if (p_descriptor->set == p_set->set) {+        assert(descriptor_index < p_set->binding_count);+        p_set->bindings[descriptor_index] = p_descriptor;+        ++descriptor_index;+      }+    }+  }++  return ParseEntrypointDescriptorSets(p_module);+}++static SpvReflectResult DisambiguateStorageBufferSrvUav(SpvReflectShaderModule* p_module) {+  if (p_module->descriptor_binding_count == 0) {+    return SPV_REFLECT_RESULT_SUCCESS;+  }++  for (uint32_t descriptor_index = 0; descriptor_index < p_module->descriptor_binding_count; ++descriptor_index) {+    SpvReflectDescriptorBinding* p_descriptor = &(p_module->descriptor_bindings[descriptor_index]);+    // Skip everything that isn't a STORAGE_BUFFER descriptor+    if (p_descriptor->descriptor_type != SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER) {+      continue;+    }++    //+    // Vulkan doesn't disambiguate between SRVs and UAVs so they+    // come back as STORAGE_BUFFER. The block parsing process will+    // mark a block as non-writable should any member of the block+    // or its descendants are non-writable.+    //+    if (p_descriptor->block.decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE) {+      p_descriptor->resource_type = SPV_REFLECT_RESOURCE_FLAG_SRV;+    }+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++static SpvReflectResult SynchronizeDescriptorSets(SpvReflectShaderModule* p_module) {+  // Free and reset all descriptor set numbers+  for (uint32_t i = 0; i < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++i) {+    SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];+    SafeFree(p_set->bindings);+    p_set->binding_count = 0;+    p_set->set = (uint32_t)INVALID_VALUE;+  }+  // Set descriptor set count to zero+  p_module->descriptor_set_count = 0;++  SpvReflectResult result = ParseDescriptorSets(p_module);+  return result;+}++static SpvReflectResult CreateShaderModule(uint32_t flags, size_t size, const void* p_code, SpvReflectShaderModule* p_module) {+  // Initialize all module fields to zero+  memset(p_module, 0, sizeof(*p_module));++  // Allocate module internals+#ifdef __cplusplus+  p_module->_internal = (SpvReflectShaderModule::Internal*)calloc(1, sizeof(*(p_module->_internal)));+#else+  p_module->_internal = calloc(1, sizeof(*(p_module->_internal)));+#endif+  if (IsNull(p_module->_internal)) {+    return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+  }+  // Copy flags+  p_module->_internal->module_flags = flags;+  // Figure out if we need to copy the SPIR-V code or not+  if (flags & SPV_REFLECT_MODULE_FLAG_NO_COPY) {+    // Set internal size and pointer to args passed in+    p_module->_internal->spirv_size = size;+#if defined(__cplusplus)+    p_module->_internal->spirv_code = const_cast<uint32_t*>(static_cast<const uint32_t*>(p_code));  // cast that const away+#else+    p_module->_internal->spirv_code = (void*)p_code;  // cast that const away+#endif+    p_module->_internal->spirv_word_count = (uint32_t)(size / SPIRV_WORD_SIZE);+  } else {+    // Allocate SPIR-V code storage+    p_module->_internal->spirv_size = size;+    p_module->_internal->spirv_code = (uint32_t*)calloc(1, p_module->_internal->spirv_size);+    p_module->_internal->spirv_word_count = (uint32_t)(size / SPIRV_WORD_SIZE);+    if (IsNull(p_module->_internal->spirv_code)) {+      SafeFree(p_module->_internal);+      return SPV_REFLECT_RESULT_ERROR_ALLOC_FAILED;+    }+    // Copy SPIR-V to code storage+    memcpy(p_module->_internal->spirv_code, p_code, size);+  }++  // Initialize everything to zero+  SpvReflectPrvParser parser;+  memset(&parser, 0, sizeof(SpvReflectPrvParser));++  // Create parser+  SpvReflectResult result = CreateParser(p_module->_internal->spirv_size, p_module->_internal->spirv_code, &parser);++  // Generator+  {+    const uint32_t* p_ptr = (const uint32_t*)p_module->_internal->spirv_code;+    p_module->generator = (SpvReflectGenerator)((*(p_ptr + 2) & 0xFFFF0000) >> 16);+  }++  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseNodes(&parser);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseStrings(&parser);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseSource(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseFunctions(&parser);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseMemberCounts(&parser);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseNames(&parser);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseDecorations(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }++  // Start of reflection data parsing+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    p_module->source_language = parser.source_language;+    p_module->source_language_version = parser.source_language_version;++    // Zero out descriptor set data+    p_module->descriptor_set_count = 0;+    memset(p_module->descriptor_sets, 0, SPV_REFLECT_MAX_DESCRIPTOR_SETS * sizeof(*p_module->descriptor_sets));+    // Initialize descriptor set numbers+    for (uint32_t set_number = 0; set_number < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++set_number) {+      p_module->descriptor_sets[set_number].set = (uint32_t)INVALID_VALUE;+    }+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseTypes(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseDescriptorBindings(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseDescriptorType(p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseUAVCounterBindings(p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseDescriptorBlocks(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParsePushConstantBlocks(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseEntryPoints(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseCapabilities(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS && p_module->entry_point_count > 0) {+    SpvReflectEntryPoint* p_entry = &(p_module->entry_points[0]);+    p_module->entry_point_name = p_entry->name;+    p_module->entry_point_id = p_entry->id;+    p_module->spirv_execution_model = p_entry->spirv_execution_model;+    p_module->shader_stage = p_entry->shader_stage;+    p_module->input_variable_count = p_entry->input_variable_count;+    p_module->input_variables = p_entry->input_variables;+    p_module->output_variable_count = p_entry->output_variable_count;+    p_module->output_variables = p_entry->output_variables;+    p_module->interface_variable_count = p_entry->interface_variable_count;+    p_module->interface_variables = p_entry->interface_variables;+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = DisambiguateStorageBufferSrvUav(p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = SynchronizeDescriptorSets(p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }+  if (result == SPV_REFLECT_RESULT_SUCCESS) {+    result = ParseExecutionModes(&parser, p_module);+    SPV_REFLECT_ASSERT(result == SPV_REFLECT_RESULT_SUCCESS);+  }++  // Destroy module if parse was not successful+  if (result != SPV_REFLECT_RESULT_SUCCESS) {+    spvReflectDestroyShaderModule(p_module);+  }++  DestroyParser(&parser);++  return result;+}++SpvReflectResult spvReflectCreateShaderModule(size_t size, const void* p_code, SpvReflectShaderModule* p_module) {+  return CreateShaderModule(0, size, p_code, p_module);+}++SpvReflectResult spvReflectCreateShaderModule2(uint32_t flags, size_t size, const void* p_code, SpvReflectShaderModule* p_module) {+  return CreateShaderModule(flags, size, p_code, p_module);+}++SpvReflectResult spvReflectGetShaderModule(size_t size, const void* p_code, SpvReflectShaderModule* p_module) {+  return spvReflectCreateShaderModule(size, p_code, p_module);+}++static void SafeFreeTypes(SpvReflectTypeDescription* p_type) {+  if (IsNull(p_type) || p_type->copied) {+    return;+  }++  if (IsNotNull(p_type->members)) {+    for (size_t i = 0; i < p_type->member_count; ++i) {+      SpvReflectTypeDescription* p_member = &p_type->members[i];+      SafeFreeTypes(p_member);+    }++    SafeFree(p_type->members);+    p_type->members = NULL;+  }+}++static void SafeFreeBlockVariables(SpvReflectBlockVariable* p_block) {+  if (IsNull(p_block)) {+    return;+  }++  // We share pointers to Physical Pointer structs and don't want to double free+  if (p_block->flags & SPV_REFLECT_VARIABLE_FLAGS_PHYSICAL_POINTER_COPY) {+    return;+  }++  if (IsNotNull(p_block->members)) {+    for (size_t i = 0; i < p_block->member_count; ++i) {+      SpvReflectBlockVariable* p_member = &p_block->members[i];+      SafeFreeBlockVariables(p_member);+    }++    SafeFree(p_block->members);+    p_block->members = NULL;+  }+}++static void SafeFreeInterfaceVariable(SpvReflectInterfaceVariable* p_interface) {+  if (IsNull(p_interface)) {+    return;+  }++  if (IsNotNull(p_interface->members)) {+    for (size_t i = 0; i < p_interface->member_count; ++i) {+      SpvReflectInterfaceVariable* p_member = &p_interface->members[i];+      SafeFreeInterfaceVariable(p_member);+    }++    SafeFree(p_interface->members);+    p_interface->members = NULL;+  }+}++void spvReflectDestroyShaderModule(SpvReflectShaderModule* p_module) {+  if (IsNull(p_module->_internal)) {+    return;+  }++  SafeFree(p_module->source_source);++  // Descriptor set bindings+  for (size_t i = 0; i < p_module->descriptor_set_count; ++i) {+    SpvReflectDescriptorSet* p_set = &p_module->descriptor_sets[i];+    free(p_set->bindings);+  }++  // Descriptor binding blocks+  for (size_t i = 0; i < p_module->descriptor_binding_count; ++i) {+    SpvReflectDescriptorBinding* p_descriptor = &p_module->descriptor_bindings[i];+    if (IsNotNull(p_descriptor->byte_address_buffer_offsets)) {+      SafeFree(p_descriptor->byte_address_buffer_offsets);+    }+    SafeFreeBlockVariables(&p_descriptor->block);+  }+  SafeFree(p_module->descriptor_bindings);++  // Entry points+  for (size_t i = 0; i < p_module->entry_point_count; ++i) {+    SpvReflectEntryPoint* p_entry = &p_module->entry_points[i];+    for (size_t j = 0; j < p_entry->interface_variable_count; j++) {+      SafeFreeInterfaceVariable(&p_entry->interface_variables[j]);+    }+    for (uint32_t j = 0; j < p_entry->descriptor_set_count; ++j) {+      SafeFree(p_entry->descriptor_sets[j].bindings);+    }+    SafeFree(p_entry->descriptor_sets);+    SafeFree(p_entry->input_variables);+    SafeFree(p_entry->output_variables);+    SafeFree(p_entry->interface_variables);+    SafeFree(p_entry->used_uniforms);+    SafeFree(p_entry->used_push_constants);+    SafeFree(p_entry->execution_modes);+  }+  SafeFree(p_module->capabilities);+  SafeFree(p_module->entry_points);+  SafeFree(p_module->spec_constants);++  // Push constants+  for (size_t i = 0; i < p_module->push_constant_block_count; ++i) {+    SafeFreeBlockVariables(&p_module->push_constant_blocks[i]);+  }+  SafeFree(p_module->push_constant_blocks);++  // Type infos+  for (size_t i = 0; i < p_module->_internal->type_description_count; ++i) {+    SpvReflectTypeDescription* p_type = &p_module->_internal->type_descriptions[i];+    if (IsNotNull(p_type->members)) {+      SafeFreeTypes(p_type);+    }+    SafeFree(p_type->members);+  }+  SafeFree(p_module->_internal->type_descriptions);++  // Free SPIR-V code if there was a copy+  if ((p_module->_internal->module_flags & SPV_REFLECT_MODULE_FLAG_NO_COPY) == 0) {+    SafeFree(p_module->_internal->spirv_code);+  }+  // Free internal+  SafeFree(p_module->_internal);+}++uint32_t spvReflectGetCodeSize(const SpvReflectShaderModule* p_module) {+  if (IsNull(p_module)) {+    return 0;+  }++  return (uint32_t)(p_module->_internal->spirv_size);+}++const uint32_t* spvReflectGetCode(const SpvReflectShaderModule* p_module) {+  if (IsNull(p_module)) {+    return NULL;+  }++  return p_module->_internal->spirv_code;+}++const SpvReflectEntryPoint* spvReflectGetEntryPoint(const SpvReflectShaderModule* p_module, const char* entry_point) {+  if (IsNull(p_module) || IsNull(entry_point)) {+    return NULL;+  }++  for (uint32_t i = 0; i < p_module->entry_point_count; ++i) {+    if (strcmp(p_module->entry_points[i].name, entry_point) == 0) {+      return &p_module->entry_points[i];+    }+  }+  return NULL;+}++SpvReflectResult spvReflectEnumerateDescriptorBindings(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                       SpvReflectDescriptorBinding** pp_bindings) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_bindings)) {+    if (*p_count != p_module->descriptor_binding_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectDescriptorBinding* p_bindings = (SpvReflectDescriptorBinding*)&p_module->descriptor_bindings[index];+      pp_bindings[index] = p_bindings;+    }+  } else {+    *p_count = p_module->descriptor_binding_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateEntryPointDescriptorBindings(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                                 uint32_t* p_count, SpvReflectDescriptorBinding** pp_bindings) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  uint32_t count = 0;+  for (uint32_t i = 0; i < p_module->descriptor_binding_count; ++i) {+    bool found = SearchSortedUint32(p_entry->used_uniforms, p_entry->used_uniform_count, p_module->descriptor_bindings[i].spirv_id);+    if (found) {+      if (IsNotNull(pp_bindings)) {+        if (count >= *p_count) {+          return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+        }+        pp_bindings[count++] = (SpvReflectDescriptorBinding*)&p_module->descriptor_bindings[i];+      } else {+        ++count;+      }+    }+  }+  if (IsNotNull(pp_bindings)) {+    if (count != *p_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }+  } else {+    *p_count = count;+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateDescriptorSets(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                   SpvReflectDescriptorSet** pp_sets) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_sets)) {+    if (*p_count != p_module->descriptor_set_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectDescriptorSet* p_set = (SpvReflectDescriptorSet*)&p_module->descriptor_sets[index];+      pp_sets[index] = p_set;+    }+  } else {+    *p_count = p_module->descriptor_set_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateEntryPointDescriptorSets(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                             uint32_t* p_count, SpvReflectDescriptorSet** pp_sets) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  if (IsNotNull(pp_sets)) {+    if (*p_count != p_entry->descriptor_set_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectDescriptorSet* p_set = (SpvReflectDescriptorSet*)&p_entry->descriptor_sets[index];+      pp_sets[index] = p_set;+    }+  } else {+    *p_count = p_entry->descriptor_set_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateInterfaceVariables(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                       SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_module->interface_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = &p_module->interface_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_module->interface_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateEntryPointInterfaceVariables(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                                 uint32_t* p_count, SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_entry->interface_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = &p_entry->interface_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_entry->interface_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateInputVariables(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                   SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_module->input_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = p_module->input_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_module->input_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateEntryPointInputVariables(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                             uint32_t* p_count, SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_entry->input_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = p_entry->input_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_entry->input_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateOutputVariables(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                    SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_module->output_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = p_module->output_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_module->output_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateEntryPointOutputVariables(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                              uint32_t* p_count, SpvReflectInterfaceVariable** pp_variables) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  if (IsNotNull(pp_variables)) {+    if (*p_count != p_entry->output_variable_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectInterfaceVariable* p_var = p_entry->output_variables[index];+      pp_variables[index] = p_var;+    }+  } else {+    *p_count = p_entry->output_variable_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumeratePushConstantBlocks(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                       SpvReflectBlockVariable** pp_blocks) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (pp_blocks != NULL) {+    if (*p_count != p_module->push_constant_block_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectBlockVariable* p_push_constant_blocks = (SpvReflectBlockVariable*)&p_module->push_constant_blocks[index];+      pp_blocks[index] = p_push_constant_blocks;+    }+  } else {+    *p_count = p_module->push_constant_block_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}+SpvReflectResult spvReflectEnumeratePushConstants(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                  SpvReflectBlockVariable** pp_blocks) {+  return spvReflectEnumeratePushConstantBlocks(p_module, p_count, pp_blocks);+}++SpvReflectResult spvReflectEnumerateEntryPointPushConstantBlocks(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                                 uint32_t* p_count, SpvReflectBlockVariable** pp_blocks) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+  }++  uint32_t count = 0;+  for (uint32_t i = 0; i < p_module->push_constant_block_count; ++i) {+    bool found = SearchSortedUint32(p_entry->used_push_constants, p_entry->used_push_constant_count,+                                    p_module->push_constant_blocks[i].spirv_id);+    if (found) {+      if (IsNotNull(pp_blocks)) {+        if (count >= *p_count) {+          return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+        }+        pp_blocks[count++] = (SpvReflectBlockVariable*)&p_module->push_constant_blocks[i];+      } else {+        ++count;+      }+    }+  }+  if (IsNotNull(pp_blocks)) {+    if (count != *p_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }+  } else {+    *p_count = count;+  }+  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectEnumerateSpecializationConstants(const SpvReflectShaderModule* p_module, uint32_t* p_count,+                                                            SpvReflectSpecializationConstant** pp_constants) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_count)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  if (IsNotNull(pp_constants)) {+    if (*p_count != p_module->spec_constant_count) {+      return SPV_REFLECT_RESULT_ERROR_COUNT_MISMATCH;+    }++    for (uint32_t index = 0; index < *p_count; ++index) {+      SpvReflectSpecializationConstant* p_constant = (SpvReflectSpecializationConstant*)&p_module->spec_constants[index];+      pp_constants[index] = p_constant;+    }+  } else {+    *p_count = p_module->spec_constant_count;+  }++  return SPV_REFLECT_RESULT_SUCCESS;+}++const SpvReflectDescriptorBinding* spvReflectGetDescriptorBinding(const SpvReflectShaderModule* p_module, uint32_t binding_number,+                                                                  uint32_t set_number, SpvReflectResult* p_result) {+  const SpvReflectDescriptorBinding* p_descriptor = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {+      const SpvReflectDescriptorBinding* p_potential = &p_module->descriptor_bindings[index];+      if ((p_potential->binding == binding_number) && (p_potential->set == set_number)) {+        p_descriptor = p_potential;+        break;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_descriptor)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_descriptor;+}++const SpvReflectDescriptorBinding* spvReflectGetEntryPointDescriptorBinding(const SpvReflectShaderModule* p_module,+                                                                            const char* entry_point, uint32_t binding_number,+                                                                            uint32_t set_number, SpvReflectResult* p_result) {+  const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+  if (IsNull(p_entry)) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectDescriptorBinding* p_descriptor = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {+      const SpvReflectDescriptorBinding* p_potential = &p_module->descriptor_bindings[index];+      bool found = SearchSortedUint32(p_entry->used_uniforms, p_entry->used_uniform_count, p_potential->spirv_id);+      if ((p_potential->binding == binding_number) && (p_potential->set == set_number) && found) {+        p_descriptor = p_potential;+        break;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_descriptor)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_descriptor;+}++const SpvReflectDescriptorSet* spvReflectGetDescriptorSet(const SpvReflectShaderModule* p_module, uint32_t set_number,+                                                          SpvReflectResult* p_result) {+  const SpvReflectDescriptorSet* p_set = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->descriptor_set_count; ++index) {+      const SpvReflectDescriptorSet* p_potential = &p_module->descriptor_sets[index];+      if (p_potential->set == set_number) {+        p_set = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_set)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_set;+}++const SpvReflectDescriptorSet* spvReflectGetEntryPointDescriptorSet(const SpvReflectShaderModule* p_module, const char* entry_point,+                                                                    uint32_t set_number, SpvReflectResult* p_result) {+  const SpvReflectDescriptorSet* p_set = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t index = 0; index < p_entry->descriptor_set_count; ++index) {+      const SpvReflectDescriptorSet* p_potential = &p_entry->descriptor_sets[index];+      if (p_potential->set == set_number) {+        p_set = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_set)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_set;+}++const SpvReflectInterfaceVariable* spvReflectGetInputVariableByLocation(const SpvReflectShaderModule* p_module, uint32_t location,+                                                                        SpvReflectResult* p_result) {+  if (location == INVALID_VALUE) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_module->input_variables[index];+      if (p_potential->location == location) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}+const SpvReflectInterfaceVariable* spvReflectGetInputVariable(const SpvReflectShaderModule* p_module, uint32_t location,+                                                              SpvReflectResult* p_result) {+  return spvReflectGetInputVariableByLocation(p_module, location, p_result);+}++const SpvReflectInterfaceVariable* spvReflectGetEntryPointInputVariableByLocation(const SpvReflectShaderModule* p_module,+                                                                                  const char* entry_point, uint32_t location,+                                                                                  SpvReflectResult* p_result) {+  if (location == INVALID_VALUE) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }++  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t index = 0; index < p_entry->input_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_entry->input_variables[index];+      if (p_potential->location == location) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectInterfaceVariable* spvReflectGetInputVariableBySemantic(const SpvReflectShaderModule* p_module,+                                                                        const char* semantic, SpvReflectResult* p_result) {+  if (IsNull(semantic)) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+    }+    return NULL;+  }+  if (semantic[0] == '\0') {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_module->input_variables[index];+      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectInterfaceVariable* spvReflectGetEntryPointInputVariableBySemantic(const SpvReflectShaderModule* p_module,+                                                                                  const char* entry_point, const char* semantic,+                                                                                  SpvReflectResult* p_result) {+  if (IsNull(semantic)) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+    }+    return NULL;+  }+  if (semantic[0] == '\0') {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t index = 0; index < p_entry->input_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_entry->input_variables[index];+      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectInterfaceVariable* spvReflectGetOutputVariableByLocation(const SpvReflectShaderModule* p_module, uint32_t location,+                                                                         SpvReflectResult* p_result) {+  if (location == INVALID_VALUE) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_module->output_variables[index];+      if (p_potential->location == location) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}+const SpvReflectInterfaceVariable* spvReflectGetOutputVariable(const SpvReflectShaderModule* p_module, uint32_t location,+                                                               SpvReflectResult* p_result) {+  return spvReflectGetOutputVariableByLocation(p_module, location, p_result);+}++const SpvReflectInterfaceVariable* spvReflectGetEntryPointOutputVariableByLocation(const SpvReflectShaderModule* p_module,+                                                                                   const char* entry_point, uint32_t location,+                                                                                   SpvReflectResult* p_result) {+  if (location == INVALID_VALUE) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }++  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t index = 0; index < p_entry->output_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_entry->output_variables[index];+      if (p_potential->location == location) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectInterfaceVariable* spvReflectGetOutputVariableBySemantic(const SpvReflectShaderModule* p_module,+                                                                         const char* semantic, SpvReflectResult* p_result) {+  if (IsNull(semantic)) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+    }+    return NULL;+  }+  if (semantic[0] == '\0') {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_module->output_variables[index];+      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectInterfaceVariable* spvReflectGetEntryPointOutputVariableBySemantic(const SpvReflectShaderModule* p_module,+                                                                                   const char* entry_point, const char* semantic,+                                                                                   SpvReflectResult* p_result) {+  if (IsNull(semantic)) {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+    }+    return NULL;+  }+  if (semantic[0] == '\0') {+    if (IsNotNull(p_result)) {+      *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+    }+    return NULL;+  }+  const SpvReflectInterfaceVariable* p_var = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t index = 0; index < p_entry->output_variable_count; ++index) {+      const SpvReflectInterfaceVariable* p_potential = p_entry->output_variables[index];+      if (p_potential->semantic != NULL && strcmp(p_potential->semantic, semantic) == 0) {+        p_var = p_potential;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_var)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_var;+}++const SpvReflectBlockVariable* spvReflectGetPushConstantBlock(const SpvReflectShaderModule* p_module, uint32_t index,+                                                              SpvReflectResult* p_result) {+  const SpvReflectBlockVariable* p_push_constant = NULL;+  if (IsNotNull(p_module)) {+    if (index < p_module->push_constant_block_count) {+      p_push_constant = &p_module->push_constant_blocks[index];+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_push_constant)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_push_constant;+}+const SpvReflectBlockVariable* spvReflectGetPushConstant(const SpvReflectShaderModule* p_module, uint32_t index,+                                                         SpvReflectResult* p_result) {+  return spvReflectGetPushConstantBlock(p_module, index, p_result);+}++const SpvReflectBlockVariable* spvReflectGetEntryPointPushConstantBlock(const SpvReflectShaderModule* p_module,+                                                                        const char* entry_point, SpvReflectResult* p_result) {+  const SpvReflectBlockVariable* p_push_constant = NULL;+  if (IsNotNull(p_module)) {+    const SpvReflectEntryPoint* p_entry = spvReflectGetEntryPoint(p_module, entry_point);+    if (IsNull(p_entry)) {+      if (IsNotNull(p_result)) {+        *p_result = SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+      }+      return NULL;+    }+    for (uint32_t i = 0; i < p_module->push_constant_block_count; ++i) {+      bool found = SearchSortedUint32(p_entry->used_push_constants, p_entry->used_push_constant_count,+                                      p_module->push_constant_blocks[i].spirv_id);+      if (found) {+        p_push_constant = &p_module->push_constant_blocks[i];+        break;+      }+    }+  }+  if (IsNotNull(p_result)) {+    *p_result = IsNotNull(p_push_constant)+                    ? SPV_REFLECT_RESULT_SUCCESS+                    : (IsNull(p_module) ? SPV_REFLECT_RESULT_ERROR_NULL_POINTER : SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND);+  }+  return p_push_constant;+}++SpvReflectResult spvReflectChangeDescriptorBindingNumbers(SpvReflectShaderModule* p_module,+                                                          const SpvReflectDescriptorBinding* p_binding, uint32_t new_binding_number,+                                                          uint32_t new_set_binding) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_binding)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }++  SpvReflectDescriptorBinding* p_target_descriptor = NULL;+  for (uint32_t index = 0; index < p_module->descriptor_binding_count; ++index) {+    if (&p_module->descriptor_bindings[index] == p_binding) {+      p_target_descriptor = &p_module->descriptor_bindings[index];+      break;+    }+  }++  if (IsNotNull(p_target_descriptor)) {+    if (p_target_descriptor->word_offset.binding > (p_module->_internal->spirv_word_count - 1)) {+      return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;+    }+    // Binding number+    if (new_binding_number != (uint32_t)SPV_REFLECT_BINDING_NUMBER_DONT_CHANGE) {+      uint32_t* p_code = p_module->_internal->spirv_code + p_target_descriptor->word_offset.binding;+      *p_code = new_binding_number;+      p_target_descriptor->binding = new_binding_number;+    }+    // Set number+    if (new_set_binding != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {+      uint32_t* p_code = p_module->_internal->spirv_code + p_target_descriptor->word_offset.set;+      *p_code = new_set_binding;+      p_target_descriptor->set = new_set_binding;+    }+  }++  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;+  if (new_set_binding != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {+    result = SynchronizeDescriptorSets(p_module);+  }+  return result;+}+SpvReflectResult spvReflectChangeDescriptorBindingNumber(SpvReflectShaderModule* p_module,+                                                         const SpvReflectDescriptorBinding* p_descriptor_binding,+                                                         uint32_t new_binding_number, uint32_t optional_new_set_number) {+  return spvReflectChangeDescriptorBindingNumbers(p_module, p_descriptor_binding, new_binding_number, optional_new_set_number);+}++SpvReflectResult spvReflectChangeDescriptorSetNumber(SpvReflectShaderModule* p_module, const SpvReflectDescriptorSet* p_set,+                                                     uint32_t new_set_number) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_set)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  SpvReflectDescriptorSet* p_target_set = NULL;+  for (uint32_t index = 0; index < SPV_REFLECT_MAX_DESCRIPTOR_SETS; ++index) {+    // The descriptor sets for specific entry points might not be in this set,+    // so just match on set index.+    if (p_module->descriptor_sets[index].set == p_set->set) {+      p_target_set = (SpvReflectDescriptorSet*)p_set;+      break;+    }+  }++  SpvReflectResult result = SPV_REFLECT_RESULT_SUCCESS;+  if (IsNotNull(p_target_set) && new_set_number != (uint32_t)SPV_REFLECT_SET_NUMBER_DONT_CHANGE) {+    for (uint32_t index = 0; index < p_target_set->binding_count; ++index) {+      SpvReflectDescriptorBinding* p_descriptor = p_target_set->bindings[index];+      if (p_descriptor->word_offset.set > (p_module->_internal->spirv_word_count - 1)) {+        return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;+      }++      uint32_t* p_code = p_module->_internal->spirv_code + p_descriptor->word_offset.set;+      *p_code = new_set_number;+      p_descriptor->set = new_set_number;+    }++    result = SynchronizeDescriptorSets(p_module);+  }++  return result;+}++static SpvReflectResult ChangeVariableLocation(SpvReflectShaderModule* p_module, SpvReflectInterfaceVariable* p_variable,+                                               uint32_t new_location) {+  if (p_variable->word_offset.location > (p_module->_internal->spirv_word_count - 1)) {+    return SPV_REFLECT_RESULT_ERROR_RANGE_EXCEEDED;+  }+  uint32_t* p_code = p_module->_internal->spirv_code + p_variable->word_offset.location;+  *p_code = new_location;+  p_variable->location = new_location;+  return SPV_REFLECT_RESULT_SUCCESS;+}++SpvReflectResult spvReflectChangeInputVariableLocation(SpvReflectShaderModule* p_module,+                                                       const SpvReflectInterfaceVariable* p_input_variable, uint32_t new_location) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_input_variable)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  for (uint32_t index = 0; index < p_module->input_variable_count; ++index) {+    if (p_module->input_variables[index] == p_input_variable) {+      return ChangeVariableLocation(p_module, p_module->input_variables[index], new_location);+    }+  }+  return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+}++SpvReflectResult spvReflectChangeOutputVariableLocation(SpvReflectShaderModule* p_module,+                                                        const SpvReflectInterfaceVariable* p_output_variable,+                                                        uint32_t new_location) {+  if (IsNull(p_module)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  if (IsNull(p_output_variable)) {+    return SPV_REFLECT_RESULT_ERROR_NULL_POINTER;+  }+  for (uint32_t index = 0; index < p_module->output_variable_count; ++index) {+    if (p_module->output_variables[index] == p_output_variable) {+      return ChangeVariableLocation(p_module, p_module->output_variables[index], new_location);+    }+  }+  return SPV_REFLECT_RESULT_ERROR_ELEMENT_NOT_FOUND;+}++const char* spvReflectSourceLanguage(SpvSourceLanguage source_lang) {+  switch (source_lang) {+    case SpvSourceLanguageESSL:+      return "ESSL";+    case SpvSourceLanguageGLSL:+      return "GLSL";+    case SpvSourceLanguageOpenCL_C:+      return "OpenCL_C";+    case SpvSourceLanguageOpenCL_CPP:+      return "OpenCL_CPP";+    case SpvSourceLanguageHLSL:+      return "HLSL";+    case SpvSourceLanguageCPP_for_OpenCL:+      return "CPP_for_OpenCL";+    case SpvSourceLanguageSYCL:+      return "SYCL";+    case SpvSourceLanguageHERO_C:+      return "Hero C";+    case SpvSourceLanguageNZSL:+      return "NZSL";+    default:+      break;+  }+  // The source language is SpvSourceLanguageUnknown, SpvSourceLanguageMax, or+  // some other value that does not correspond to a knonwn language.+  return "Unknown";+}++const char* spvReflectBlockVariableTypeName(const SpvReflectBlockVariable* p_var) {+  if (p_var == NULL) {+    return NULL;+  }+  return p_var->type_description->type_name; }
cbits/spirv_reflect.h view
@@ -22,6 +22,7 @@  */ +// clang-format off /*!   @file spirv_reflect.h@@ -79,15 +80,16 @@   SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_BLOCK_MEMBER_REFERENCE,   SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_ENTRY_POINT,   SPV_REFLECT_RESULT_ERROR_SPIRV_INVALID_EXECUTION_MODE,+  SPV_REFLECT_RESULT_ERROR_SPIRV_MAX_RECURSIVE_EXCEEDED, } SpvReflectResult;  /*! @enum SpvReflectModuleFlagBits -SPV_REFLECT_MODULE_FLAG_NO_COPY - Disables copying of SPIR-V code -  when a SPIRV-Reflect shader module is created. It is the +SPV_REFLECT_MODULE_FLAG_NO_COPY - Disables copying of SPIR-V code+  when a SPIRV-Reflect shader module is created. It is the   responsibility of the calling program to ensure that the pointer   remains valid and the memory it's pointing to is not freed while-  SPIRV-Reflect operations are taking place. Freeing the backing +  SPIRV-Reflect operations are taking place. Freeing the backing   memory will cause undefined behavior or most likely a crash.   This is flag is intended for cases where the memory overhead of   storing the copied SPIR-V is undesirable.@@ -119,6 +121,7 @@   SPV_REFLECT_TYPE_FLAG_EXTERNAL_MASK                   = 0x00FF0000,   SPV_REFLECT_TYPE_FLAG_STRUCT                          = 0x10000000,   SPV_REFLECT_TYPE_FLAG_ARRAY                           = 0x20000000,+  SPV_REFLECT_TYPE_FLAG_REF                             = 0x40000000, } SpvReflectTypeFlagBits;  typedef uint32_t SpvReflectTypeFlags;@@ -132,6 +135,9 @@       SPIRV-Reflect reads the data as is and does not make any       attempt to correct it to match what's in the source. +      The Patch, PerVertex, and PerTask are used for Interface+      variables that can have array+ */ typedef enum SpvReflectDecorationFlagBits {   SPV_REFLECT_DECORATION_NONE                   = 0x00000000,@@ -145,10 +151,59 @@   SPV_REFLECT_DECORATION_NON_WRITABLE           = 0x00000080,   SPV_REFLECT_DECORATION_RELAXED_PRECISION      = 0x00000100,   SPV_REFLECT_DECORATION_NON_READABLE           = 0x00000200,+  SPV_REFLECT_DECORATION_PATCH                  = 0x00000400,+  SPV_REFLECT_DECORATION_PER_VERTEX             = 0x00000800,+  SPV_REFLECT_DECORATION_PER_TASK               = 0x00001000,+  SPV_REFLECT_DECORATION_WEIGHT_TEXTURE         = 0x00002000,+  SPV_REFLECT_DECORATION_BLOCK_MATCH_TEXTURE    = 0x00004000, } SpvReflectDecorationFlagBits;  typedef uint32_t SpvReflectDecorationFlags; +// Based of SPV_GOOGLE_user_type+typedef enum SpvReflectUserType {+  SPV_REFLECT_USER_TYPE_INVALID = 0,+  SPV_REFLECT_USER_TYPE_CBUFFER,+  SPV_REFLECT_USER_TYPE_TBUFFER,+  SPV_REFLECT_USER_TYPE_APPEND_STRUCTURED_BUFFER,+  SPV_REFLECT_USER_TYPE_BUFFER,+  SPV_REFLECT_USER_TYPE_BYTE_ADDRESS_BUFFER,+  SPV_REFLECT_USER_TYPE_CONSTANT_BUFFER,+  SPV_REFLECT_USER_TYPE_CONSUME_STRUCTURED_BUFFER,+  SPV_REFLECT_USER_TYPE_INPUT_PATCH,+  SPV_REFLECT_USER_TYPE_OUTPUT_PATCH,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_BUFFER,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_BYTE_ADDRESS_BUFFER,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_STRUCTURED_BUFFER,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_1D,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_1D_ARRAY,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_2D,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_2D_ARRAY,+  SPV_REFLECT_USER_TYPE_RASTERIZER_ORDERED_TEXTURE_3D,+  SPV_REFLECT_USER_TYPE_RAYTRACING_ACCELERATION_STRUCTURE,+  SPV_REFLECT_USER_TYPE_RW_BUFFER,+  SPV_REFLECT_USER_TYPE_RW_BYTE_ADDRESS_BUFFER,+  SPV_REFLECT_USER_TYPE_RW_STRUCTURED_BUFFER,+  SPV_REFLECT_USER_TYPE_RW_TEXTURE_1D,+  SPV_REFLECT_USER_TYPE_RW_TEXTURE_1D_ARRAY,+  SPV_REFLECT_USER_TYPE_RW_TEXTURE_2D,+  SPV_REFLECT_USER_TYPE_RW_TEXTURE_2D_ARRAY,+  SPV_REFLECT_USER_TYPE_RW_TEXTURE_3D,+  SPV_REFLECT_USER_TYPE_STRUCTURED_BUFFER,+  SPV_REFLECT_USER_TYPE_SUBPASS_INPUT,+  SPV_REFLECT_USER_TYPE_SUBPASS_INPUT_MS,+  SPV_REFLECT_USER_TYPE_TEXTURE_1D,+  SPV_REFLECT_USER_TYPE_TEXTURE_1D_ARRAY,+  SPV_REFLECT_USER_TYPE_TEXTURE_2D,+  SPV_REFLECT_USER_TYPE_TEXTURE_2D_ARRAY,+  SPV_REFLECT_USER_TYPE_TEXTURE_2DMS,+  SPV_REFLECT_USER_TYPE_TEXTURE_2DMS_ARRAY,+  SPV_REFLECT_USER_TYPE_TEXTURE_3D,+  SPV_REFLECT_USER_TYPE_TEXTURE_BUFFER,+  SPV_REFLECT_USER_TYPE_TEXTURE_CUBE,+  SPV_REFLECT_USER_TYPE_TEXTURE_CUBE_ARRAY,+} SpvReflectUserType;+ /*! @enum SpvReflectResourceType  */@@ -165,6 +220,18 @@ */ typedef enum SpvReflectFormat {   SPV_REFLECT_FORMAT_UNDEFINED           =   0, // = VK_FORMAT_UNDEFINED+  SPV_REFLECT_FORMAT_R16_UINT            =  74, // = VK_FORMAT_R16_UINT+  SPV_REFLECT_FORMAT_R16_SINT            =  75, // = VK_FORMAT_R16_SINT+  SPV_REFLECT_FORMAT_R16_SFLOAT          =  76, // = VK_FORMAT_R16_SFLOAT+  SPV_REFLECT_FORMAT_R16G16_UINT         =  81, // = VK_FORMAT_R16G16_UINT+  SPV_REFLECT_FORMAT_R16G16_SINT         =  82, // = VK_FORMAT_R16G16_SINT+  SPV_REFLECT_FORMAT_R16G16_SFLOAT       =  83, // = VK_FORMAT_R16G16_SFLOAT+  SPV_REFLECT_FORMAT_R16G16B16_UINT      =  88, // = VK_FORMAT_R16G16B16_UINT+  SPV_REFLECT_FORMAT_R16G16B16_SINT      =  89, // = VK_FORMAT_R16G16B16_SINT+  SPV_REFLECT_FORMAT_R16G16B16_SFLOAT    =  90, // = VK_FORMAT_R16G16B16_SFLOAT+  SPV_REFLECT_FORMAT_R16G16B16A16_UINT   =  95, // = VK_FORMAT_R16G16B16A16_UINT+  SPV_REFLECT_FORMAT_R16G16B16A16_SINT   =  96, // = VK_FORMAT_R16G16B16A16_SINT+  SPV_REFLECT_FORMAT_R16G16B16A16_SFLOAT =  97, // = VK_FORMAT_R16G16B16A16_SFLOAT   SPV_REFLECT_FORMAT_R32_UINT            =  98, // = VK_FORMAT_R32_UINT   SPV_REFLECT_FORMAT_R32_SINT            =  99, // = VK_FORMAT_R32_SINT   SPV_REFLECT_FORMAT_R32_SFLOAT          = 100, // = VK_FORMAT_R32_SFLOAT@@ -197,6 +264,8 @@ enum SpvReflectVariableFlagBits{   SPV_REFLECT_VARIABLE_FLAGS_NONE   = 0x00000000,   SPV_REFLECT_VARIABLE_FLAGS_UNUSED = 0x00000001,+  // If variable points to a copy of the PhysicalStorageBuffer struct+  SPV_REFLECT_VARIABLE_FLAGS_PHYSICAL_POINTER_COPY = 0x00000002, };  typedef uint32_t SpvReflectVariableFlags;@@ -230,7 +299,9 @@   SPV_REFLECT_SHADER_STAGE_FRAGMENT_BIT                = 0x00000010, // = VK_SHADER_STAGE_FRAGMENT_BIT   SPV_REFLECT_SHADER_STAGE_COMPUTE_BIT                 = 0x00000020, // = VK_SHADER_STAGE_COMPUTE_BIT   SPV_REFLECT_SHADER_STAGE_TASK_BIT_NV                 = 0x00000040, // = VK_SHADER_STAGE_TASK_BIT_NV+  SPV_REFLECT_SHADER_STAGE_TASK_BIT_EXT                = SPV_REFLECT_SHADER_STAGE_TASK_BIT_NV, // = VK_SHADER_STAGE_CALLABLE_BIT_EXT   SPV_REFLECT_SHADER_STAGE_MESH_BIT_NV                 = 0x00000080, // = VK_SHADER_STAGE_MESH_BIT_NV+  SPV_REFLECT_SHADER_STAGE_MESH_BIT_EXT                = SPV_REFLECT_SHADER_STAGE_MESH_BIT_NV, // = VK_SHADER_STAGE_CALLABLE_BIT_EXT   SPV_REFLECT_SHADER_STAGE_RAYGEN_BIT_KHR              = 0x00000100, // = VK_SHADER_STAGE_RAYGEN_BIT_KHR   SPV_REFLECT_SHADER_STAGE_ANY_HIT_BIT_KHR             = 0x00000200, // = VK_SHADER_STAGE_ANY_HIT_BIT_KHR   SPV_REFLECT_SHADER_STAGE_CLOSEST_HIT_BIT_KHR         = 0x00000400, // = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR@@ -292,10 +363,16 @@   SpvImageFormat                    image_format; } SpvReflectImageTraits; +typedef enum SpvReflectArrayDimType {+  SPV_REFLECT_ARRAY_DIM_RUNTIME       = 0,         // OpTypeRuntimeArray+} SpvReflectArrayDimType;+ typedef struct SpvReflectArrayTraits {   uint32_t                          dims_count;-  // Each entry is: 0xFFFFFFFF for a specialization constant dimension,-  // 0 for a runtime array dimension, and the array length otherwise.+  // Each entry is either:+  // - specialization constant dimension+  // - OpTypeRuntimeArray+  // - the array length otherwise   uint32_t                          dims[SPV_REFLECT_MAX_ARRAY_DIMS];   // Stores Ids for dimensions that are specialization constants   uint32_t                          spec_constant_op_ids[SPV_REFLECT_MAX_ARRAY_DIMS];@@ -308,12 +385,13 @@ } SpvReflectBindingArrayTraits;  /*! @struct SpvReflectTypeDescription-+    @brief Information about an OpType* instruction */ typedef struct SpvReflectTypeDescription {   uint32_t                          id;   SpvOp                             op;   const char*                       type_name;+  // Non-NULL if type is member of a struct   const char*                       struct_member_name;   SpvStorageClass                   storage_class;   SpvReflectTypeFlags               type_flags;@@ -325,18 +403,29 @@     SpvReflectArrayTraits           array;   } traits; +  // If underlying type is a struct (ex. array of structs)+  // this gives access to the OpTypeStruct+  struct SpvReflectTypeDescription* struct_type_description;++  // Some pointers to SpvReflectTypeDescription are really+  // just copies of another reference to the same OpType+  uint32_t                          copied;++  // @deprecated use struct_type_description instead   uint32_t                          member_count;+  // @deprecated use struct_type_description instead   struct SpvReflectTypeDescription* members; } SpvReflectTypeDescription;   /*! @struct SpvReflectInterfaceVariable-+    @brief The OpVariable that is either an Input or Output to the module */ typedef struct SpvReflectInterfaceVariable {   uint32_t                            spirv_id;   const char*                         name;   uint32_t                            location;+  uint32_t                            component;   SpvStorageClass                     storage_class;   const char*                         semantic;   SpvReflectDecorationFlags           decoration_flags;@@ -366,6 +455,7 @@ typedef struct SpvReflectBlockVariable {   uint32_t                          spirv_id;   const char*                       name;+  // For Push Constants, this is the lowest offset of all memebers   uint32_t                          offset;           // Measured in bytes   uint32_t                          absolute_offset;  // Measured in bytes   uint32_t                          size;             // Measured in bytes@@ -379,6 +469,11 @@   struct SpvReflectBlockVariable*   members;    SpvReflectTypeDescription*        type_description;++  struct {+    uint32_t                          offset;+  } word_offset;+ } SpvReflectBlockVariable;  /*! @struct SpvReflectDescriptorBinding@@ -399,6 +494,8 @@   uint32_t                            accessed;   uint32_t                            uav_counter_id;   struct SpvReflectDescriptorBinding* uav_counter_binding;+  uint32_t                            byte_address_buffer_offset_count;+  uint32_t*                           byte_address_buffer_offsets;    SpvReflectTypeDescription*          type_description; @@ -408,6 +505,8 @@   } word_offset;    SpvReflectDecorationFlags           decoration_flags;+  // Requires SPV_GOOGLE_user_type+  SpvReflectUserType                  user_type; } SpvReflectDescriptorBinding;  /*! @struct SpvReflectDescriptorSet@@ -419,6 +518,10 @@   SpvReflectDescriptorBinding**     bindings; } SpvReflectDescriptorSet; +typedef enum SpvReflectExecutionModeValue {+  SPV_REFLECT_EXECUTION_MODE_SPEC_CONSTANT = 0xFFFFFFFF // specialization constant+} SpvReflectExecutionModeValue;+ /*! @struct SpvReflectEntryPoint   */@@ -429,10 +532,10 @@   SpvExecutionModel                 spirv_execution_model;   SpvReflectShaderStageFlagBits     shader_stage; -  uint32_t                          input_variable_count;  -  SpvReflectInterfaceVariable**     input_variables;       -  uint32_t                          output_variable_count; -  SpvReflectInterfaceVariable**     output_variables;      +  uint32_t                          input_variable_count;+  SpvReflectInterfaceVariable**     input_variables;+  uint32_t                          output_variable_count;+  SpvReflectInterfaceVariable**     output_variables;   uint32_t                          interface_variable_count;   SpvReflectInterfaceVariable*      interface_variables; @@ -464,6 +567,16 @@   uint32_t                          word_offset; } SpvReflectCapability; ++/*! @struct SpvReflectSpecId++*/+typedef struct SpvReflectSpecializationConstant {+  uint32_t spirv_id;+  uint32_t constant_id;+  const char* name;+} SpvReflectSpecializationConstant;+ /*! @struct SpvReflectShaderModule  */@@ -493,6 +606,8 @@   SpvReflectInterfaceVariable*      interface_variables;                              // Uses value(s) from first entry point   uint32_t                          push_constant_block_count;                        // Uses value(s) from first entry point   SpvReflectBlockVariable*          push_constant_blocks;                             // Uses value(s) from first entry point+  uint32_t                          spec_constant_count;                              // Uses value(s) from first entry point+  SpvReflectSpecializationConstant* spec_constants;                                   // Uses value(s) from first entry point    struct Internal {     SpvReflectModuleFlags           module_flags;@@ -904,6 +1019,25 @@ );  +/*! @fn spvReflectEnumerateSpecializationConstants+ @param  p_module      Pointer to an instance of SpvReflectShaderModule.+ @param  p_count       If pp_blocks is NULL, the module's specialization constant+                       count will be stored here. If pp_blocks is not NULL, *p_count+                       must contain the module's specialization constant count.+ @param  pp_constants  If NULL, the module's specialization constant count+                       will be written to *p_count. If non-NULL, pp_blocks must+                       point to an array with *p_count entries, where pointers to+                       the module's specialization constant blocks will be written.+                       The caller must not free the  variables written to this array.+ @return               If successful, returns SPV_REFLECT_RESULT_SUCCESS.+                       Otherwise, the error code indicates the cause of the failure.+*/+SpvReflectResult spvReflectEnumerateSpecializationConstants(+  const SpvReflectShaderModule*      p_module,+  uint32_t*                          p_count,+  SpvReflectSpecializationConstant** pp_constants+);+ /*! @fn spvReflectGetDescriptorBinding   @param  p_module        Pointer to an instance of SpvReflectShaderModule.@@ -1436,7 +1570,7 @@ }; #endif -#if defined(__cplusplus)+#if defined(__cplusplus) && !defined(SPIRV_REFLECT_DISABLE_CPP_BINDINGS) #include <cstdlib> #include <string> #include <vector>@@ -1494,6 +1628,7 @@   SpvReflectResult  EnumeratePushConstants(uint32_t* p_count, SpvReflectBlockVariable** pp_blocks) const {     return EnumeratePushConstantBlocks(p_count, pp_blocks);   }+  SpvReflectResult  EnumerateSpecializationConstants(uint32_t* p_count, SpvReflectSpecializationConstant** pp_constants) const;    const SpvReflectDescriptorBinding*  GetDescriptorBinding(uint32_t binding_number, uint32_t set_number, SpvReflectResult* p_result = nullptr) const;   const SpvReflectDescriptorBinding*  GetEntryPointDescriptorBinding(const char* entry_point, uint32_t binding_number, uint32_t set_number, SpvReflectResult* p_result = nullptr) const;@@ -1572,7 +1707,7 @@ /*! @fn ShaderModule    @param  code-  + */ inline ShaderModule::ShaderModule(const std::vector<uint8_t>& code, SpvReflectModuleFlags flags) {   m_result = spvReflectCreateShaderModule2(@@ -1585,7 +1720,7 @@ /*! @fn ShaderModule    @param  code-  + */ inline ShaderModule::ShaderModule(const std::vector<uint32_t>& code, SpvReflectModuleFlags flags) {   m_result = spvReflectCreateShaderModule2(@@ -1666,9 +1801,9 @@   return this->GetEntryPointName(0); } -/*! @fn GetEntryPoint+/*! @fn GetSourceFile -  @return Returns entry point+  @return Returns source file  */ inline const char* ShaderModule::GetSourceFile() const {@@ -1941,6 +2076,24 @@   return m_result; } +/*! @fn EnumerateSpecializationConstants+  @param  p_count+  @param  pp_constants+  @return+*/+inline SpvReflectResult ShaderModule::EnumerateSpecializationConstants(+    uint32_t*                          p_count,+    SpvReflectSpecializationConstant** pp_constants+) const+{+  m_result = spvReflectEnumerateSpecializationConstants(+    &m_module,+    p_count,+    pp_constants+  );+  return m_result;+}+ /*! @fn EnumerateEntryPointPushConstantBlocks    @param  entry_point@@ -2288,5 +2441,7 @@ }  } // namespace spv_reflect-#endif // defined(__cplusplus)+#endif // defined(__cplusplus) && !defined(SPIRV_REFLECT_DISABLE_CPP_WRAPPER) #endif // SPIRV_REFLECT_H++// clang-format on
lib/Data/SpirV/Reflect/FFI.hs view
@@ -1,16 +1,19 @@+{-# LANGUAGE Strict #-}+ module Data.SpirV.Reflect.FFI   ( Module   , load   , loadBytes   ) where -import Control.Exception (finally)+import Control.Exception (onException) import Control.Monad.IO.Class (MonadIO(..)) import Data.ByteString (ByteString) import Data.ByteString qualified as ByteString import Data.ByteString.Unsafe (unsafeUseAsCStringLen) import Data.SpirV.Reflect.FFI.Internal qualified as C-import Foreign (allocaBytes, castPtr)+import Foreign (callocBytes, castPtr, free)+import System.Mem.Weak (addFinalizer)  import Data.SpirV.Reflect.Module (Module) @@ -21,14 +24,17 @@ loadBytes :: MonadIO io => ByteString -> io Module loadBytes bytes = liftIO do   unsafeUseAsCStringLen bytes \(code, size) -> do-    allocaBytes C.shaderModuleSize \smPtr -> do+    smPtr <- callocBytes C.shaderModuleSize+    flip onException (free smPtr) do       res <- C.createShaderModule2         C.SpvReflectModuleFlagNoCopy         (fromIntegral size)         (castPtr code)         smPtr       case res of-        C.SpvReflectResultSuccess ->-          C.inflateModule smPtr `finally` C.destroyShaderModule smPtr+        C.SpvReflectResultSuccess -> do+          m <- C.inflateModule smPtr `onException` C.destroyShaderModule smPtr+          addFinalizer m $ C.destroyShaderModule smPtr+          pure m         err ->           error $ "spvReflectCreateShaderModule2:" <> show err
lib/Data/SpirV/Reflect/FFI/Internal.chs view
@@ -1,15 +1,19 @@ {-# LANGUAGE MagicHash #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Strict #-}  module Data.SpirV.Reflect.FFI.Internal where  import Data.Coerce (Coercible, coerce)-import Data.List (sortOn)+import Data.Ord (comparing)+import Data.SpirV.Enum qualified as SpirV+import Data.SpirV.Enum.StorageClass qualified as StorageClass import Data.Text (Text) import Data.Text qualified as Text import Data.Vector (Vector) import Data.Vector qualified as Vector+import Data.Vector.Algorithms.Heap qualified as Heap import Data.Word (Word32) import Foreign.C.String (CString) import Foreign.C.Types (CULong)@@ -24,7 +28,7 @@ import Data.SpirV.Reflect.DescriptorBinding qualified as DescriptorBinding import Data.SpirV.Reflect.DescriptorSet (DescriptorSet) import Data.SpirV.Reflect.DescriptorSet qualified as DescriptorSet-import Data.SpirV.Reflect.Enums qualified as Enums+import Data.SpirV.Reflect.Enums qualified as Reflect import Data.SpirV.Reflect.InterfaceVariable (InterfaceVariable) import Data.SpirV.Reflect.InterfaceVariable qualified as InterfaceVariable import Data.SpirV.Reflect.Module (Module)@@ -32,6 +36,8 @@ import Data.SpirV.Reflect.Traits qualified as Traits import Data.SpirV.Reflect.TypeDescription (TypeDescription) import Data.SpirV.Reflect.TypeDescription qualified as TypeDescription+import Data.SpirV.Reflect.SpecializationConstant (SpecializationConstant)+import Data.SpirV.Reflect.SpecializationConstant qualified as SpecializationConstant  #include "spirv_reflect.h" @@ -137,16 +143,15 @@       location      pickIvs query =-      Vector.fromList . sortOn ivLocation . filter query $-        Vector.toList interface_variables+      Vector.modify (Heap.sortBy $ comparing ivLocation) $ Vector.filter query interface_variables      input_variables =       pickIvs $-        (== Enums.StorageClassInput) . InterfaceVariable.storage_class+        (== StorageClass.Input) . InterfaceVariable.storage_class      output_variables =       pickIvs $-        (== Enums.StorageClassOutput) . InterfaceVariable.storage_class+        (== StorageClass.Output) . InterfaceVariable.storage_class    push_constants <-     inflateVector@@ -155,20 +160,20 @@       {#sizeof SpvReflectBlockVariable #}       inflateBlockVariable -  pure Module.Module{..}+  spec_constants <-+    inflateVector+      ({#get SpvReflectShaderModule->spec_constant_count #} sm)+      ({#get SpvReflectShaderModule->spec_constants #} sm)+      {#sizeof SpvReflectSpecializationConstant #}+      inflateSpecConstant -inflateVector :: Integral i => IO i -> IO (Ptr p) -> Int -> (Ptr p -> IO a) -> IO (Vector a)-inflateVector getCount getItems itemSize inflate = do-  count <- getCount-  itemsPtr <- getItems-  Vector.generateM (fromIntegral count) \pos -> do-    inflate $ itemsPtr `plusPtr` (itemSize * pos)+  pure Module.Module{..}  {#pointer *SpvReflectDescriptorBinding as DescriptorBindingPtr #}  inflateDescriptorBinding :: DescriptorBindingPtr -> IO DescriptorBinding inflateDescriptorBinding db = do-  spirv_id <- fmap Just . inflateIntegral $+  spirv_id <- fmap just . inflateIntegral $     {#get SpvReflectDescriptorBinding->spirv_id #} db    name <- inflateText $@@ -203,7 +208,7 @@       db       {#offsetof SpvReflectDescriptorBinding->array #} -  count <- fmap Just . inflateIntegral $+  count <- fmap just . inflateIntegral $     {#get SpvReflectDescriptorBinding->count #} db    accessed <- inflateIntegral $@@ -225,16 +230,39 @@   decoration_flags <- inflateFlags32 $     {#get SpvReflectDescriptorBinding->decoration_flags #} db +  byte_address_buffer_offsets <-+    inflateVector+      ({#get SpvReflectDescriptorBinding->byte_address_buffer_offset_count #} db)+      ({#get SpvReflectDescriptorBinding->byte_address_buffer_offsets #} db)+      {#sizeof uint32_t #}+      (fmap fromIntegral . peek)++  user_type <- inflateMaybe (Reflect.UserType 0) inflateEnum $+    {#get SpvReflectDescriptorBinding->user_type #} db+   pure DescriptorBinding.DescriptorBinding{..} +inflateSpecConstant :: Ptr () -> IO SpecializationConstant+inflateSpecConstant sc = do+  spirv_id <- fmap just . inflateIntegral $+    {#get SpvReflectSpecializationConstant->spirv_id #} sc++  constant_id <- inflateIntegral $+    {#get SpvReflectSpecializationConstant->constant_id #} sc++  name <- inflateMaybe "" inflateText $+    {#get SpvReflectSpecializationConstant->name #} sc++  pure SpecializationConstant.SpecializationConstant {..}+ {#pointer *SpvReflectBlockVariable as BlockVariablePtr #}  inflateBlockVariable :: BlockVariablePtr -> IO BlockVariable inflateBlockVariable bv = do-  spirv_id <- fmap Just . inflateIntegral $+  spirv_id <- fmap just . inflateIntegral $     {#get SpvReflectBlockVariable->spirv_id #} bv -  name <- fmap Just . inflateText $+  name <- inflateMaybe "" inflateText $     {#get SpvReflectBlockVariable->name #} bv    offset <- inflateIntegral $@@ -270,28 +298,32 @@       inflateBlockVariable    type_description <--    {#get SpvReflectBlockVariable->members #} bv >>=+    {#get SpvReflectBlockVariable->type_description #} bv >>=       maybePeek inflateTypeDescription +  word_offset <-+    fmap (Just . BlockVariable.WordOffset) . inflateIntegral $+      {#get SpvReflectBlockVariable->word_offset.offset #} bv+   pure BlockVariable.BlockVariable{..}  {#pointer *SpvReflectTypeDescription as TypeDescriptionPtr #}  inflateTypeDescription :: TypeDescriptionPtr -> IO TypeDescription inflateTypeDescription td = do-  id_ <- fmap Just . inflateIntegral $+  id_ <- fmap just . inflateIntegral $     {#get SpvReflectTypeDescription->id #} td -  op <- fmap Just . inflateEnum $+  op <- fmap (just . SpirV.Op) . inflateIntegral $     {#get SpvReflectTypeDescription->op #} td -  type_name <- fmap Just . inflateText $+  type_name <- inflateMaybe "" inflateText $     {#get SpvReflectTypeDescription->type_name #} td -  struct_member_name <- fmap Just . inflateText $+  struct_member_name <- inflateMaybe "" inflateText $     {#get SpvReflectTypeDescription->struct_member_name #} td -  storage_class <- inflateEnum $+  storage_class <- fmap SpirV.StorageClass . inflateIntegral $     {#get SpvReflectTypeDescription->storage_class #} td    type_flags <- inflateFlags32 $@@ -312,8 +344,20 @@       td       {#offsetof SpvReflectTypeDescription->traits.array #} -  let traits = Just TypeDescription.Traits{..}+  let+    traits' = Just TypeDescription.Traits{..}+    traits = if traits' == Just TypeDescription.emptyTraits then Nothing else traits' +  struct_type_description <-+    {#get SpvReflectTypeDescription->struct_type_description #} td >>=+      maybePeek inflateTypeDescription++  copied <-+    fmap (\n -> if n > 0 then Just n else Nothing) . inflateIntegral $+      {#get SpvReflectTypeDescription->copied #} td++  -- XXX: deprecated, but struct_type_description isn't always available for structs+  -- BUG: trips up on recusive types   members <-     inflateVector       ({#get SpvReflectTypeDescription->member_count #} td)@@ -344,25 +388,28 @@  inflateInterfaceVariable :: InterfaceVariablePtr -> IO InterfaceVariable inflateInterfaceVariable iv = do-  spirv_id <- fmap Just . inflateIntegral $+  spirv_id <- fmap just . inflateIntegral $     {#get SpvReflectInterfaceVariable->spirv_id #} iv -  name <- fmap Just . inflateText $+  name <- inflateMaybe "" inflateText $     {#get SpvReflectInterfaceVariable->name #} iv    location <- inflateIntegral $     {#get SpvReflectInterfaceVariable->location #} iv -  storage_class <- inflateEnum $+  component <- inflateMaybe 4294967295 inflateIntegral $+    {#get SpvReflectInterfaceVariable->component #} iv++  storage_class <- fmap SpirV.StorageClass . inflateIntegral $     {#get SpvReflectInterfaceVariable->storage_class #} iv -  semantic <- fmap Just . inflateText $+  semantic <- inflateMaybe "" inflateText $     {#get SpvReflectInterfaceVariable->semantic #} iv    decoration_flags <- inflateFlags32 $     {#get SpvReflectInterfaceVariable->decoration_flags #} iv -  built_in <- inflateEnum $+  built_in <- inflateMaybe (SpirV.BuiltIn maxBound) (fmap SpirV.BuiltIn . inflateIntegral) $     {#get SpvReflectInterfaceVariable->built_in #} iv    numeric <-@@ -403,7 +450,7 @@ inflateImageTraits src offset = do   let it = castPtr src `plusPtr` offset -  dim <- inflateEnum $+  dim <- fmap SpirV.Dim . inflateIntegral $     {#get SpvReflectImageTraits->dim #} it    depth <- inflateIntegral $@@ -418,7 +465,7 @@   sampled <- inflateIntegral $     {#get SpvReflectImageTraits->sampled #} it -  image_format <- inflateEnum $+  image_format <- fmap SpirV.ImageFormat . inflateEnum $     {#get SpvReflectImageTraits->image_format #} it    pure Traits.Image{..}@@ -433,6 +480,7 @@     {#get SpvReflectNumericTraits.scalar.width #} nt   signedness <- inflateIntegral $     {#get SpvReflectNumericTraits.scalar.signedness #} nt+  let signed = signedness /= (0 :: C2HSImp.CUInt)   let scalar = Traits.Scalar{..}    component_count <- inflateIntegral $@@ -464,27 +512,35 @@     {#sizeof uint32_t #}     (fmap fromIntegral . peek) -  stride <- fmap Just . inflateIntegral $+  stride <- inflateMaybe 0 inflateIntegral $     {#get SpvReflectArrayTraits->stride #} at    pure Traits.Array{..} --- * Atomic types+-- * Primitive types +inflateVector :: Integral i => IO i -> IO (Ptr p) -> Int -> (Ptr p -> IO a) -> IO (Vector a)+inflateVector getCount getItems itemSize inflate = do+  count <- getCount+  itemsPtr <- getItems+  Vector.generateM (fromIntegral count) \pos -> do+    x <- inflate $ itemsPtr `plusPtr` (itemSize * pos)+    pure $! x+ inflateIntegral :: (Integral a, Num b) => IO a -> IO b inflateIntegral getIntegral =-  getIntegral >>=-      pure . fromIntegral+  getIntegral >>= \i ->+    pure $! fromIntegral i  inflateEnum :: (Integral a, Enum b) => IO a -> IO b inflateEnum getEnum =-  getEnum >>=-      pure . toEnum . fromIntegral+  getEnum >>= \i ->+    pure $! toEnum (fromIntegral i)  inflateFlags32 :: forall a b . (Integral a, Coercible Word32 b) => IO a -> IO b inflateFlags32 gitBits =-  gitBits >>=-      pure . coerce @Word32 @b . fromIntegral+  gitBits >>= \i ->+    pure $! coerce @Word32 @b (fromIntegral i)  inflateText :: IO CString -> IO Text inflateText getPtr =@@ -495,3 +551,9 @@       case ptr of         GHC.Ptr addr ->           pure $! Text.unpackCString# addr++inflateMaybe :: Eq b => b -> (IO a -> IO b) -> IO a -> IO (Maybe b)+inflateMaybe nothingBurger inflate = fmap (\x -> if x == nothingBurger then Nothing else Just x) . inflate++just :: a -> Maybe a+just x = x `seq` Just x
spirv-reflect-ffi.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4.+-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack  name:           spirv-reflect-ffi-version:        0.2+version:        0.3 synopsis:       C-library loader for spirv-reflect tool. category:       Graphics author:         IC Rainbow@@ -60,9 +60,11 @@   build-depends:       base >=4.7 && <5     , bytestring-    , spirv-reflect-types >=0.2+    , spirv-enum ==0.1.*+    , spirv-reflect-types ==0.3.*     , text     , vector+    , vector-algorithms   default-language: Haskell2010  test-suite spirv-reflect-yaml-test@@ -94,6 +96,6 @@     , spirv-reflect-ffi     , tasty     , tasty-hunit+  default-language: Haskell2010   if !flag(tests)     buildable: False-  default-language: Haskell2010
test/Main.hs view
@@ -5,6 +5,7 @@ import Control.Monad (guard) import System.Directory (doesDirectoryExist, listDirectory) import System.FilePath (splitExtension, takeFileName, (</>))+import System.Timeout (timeout) import Test.Tasty (TestTree, defaultMain, testGroup) import Test.Tasty.HUnit (testCase) @@ -47,7 +48,12 @@ mkTest (name, file) =   testCase name do     -- putStrLn $ file <> " >>>>"-    !_loaded <- FFI.load file+    !_loaded <- timeout 500000 $ FFI.load file+    case _loaded of+      Just _ ->+        pure ()+      Nothing ->+        fail "loader timed out"     -- writeFile (file <> "_ffi.hs") (show _loaded)     pure ()     -- print _loaded