10e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//===- SPIRVEnum.h - SPIR-V enums -------------------------------*- C++ -*-===//
20e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
30e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//                     The LLVM/SPIRV Translator
40e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
50e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// This file is distributed under the University of Illinois Open Source
60e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// License. See LICENSE.TXT for details.
70e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
80e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved.
90e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
100e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Permission is hereby granted, free of charge, to any person obtaining a
110e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// copy of this software and associated documentation files (the "Software"),
120e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// to deal with the Software without restriction, including without limitation
130e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// the rights to use, copy, modify, merge, publish, distribute, sublicense,
140e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// and/or sell copies of the Software, and to permit persons to whom the
150e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Software is furnished to do so, subject to the following conditions:
160e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
170e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Redistributions of source code must retain the above copyright notice,
180e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// this list of conditions and the following disclaimers.
190e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Redistributions in binary form must reproduce the above copyright notice,
200e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// this list of conditions and the following disclaimers in the documentation
210e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// and/or other materials provided with the distribution.
220e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Neither the names of Advanced Micro Devices, Inc., nor the names of its
230e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// contributors may be used to endorse or promote products derived from this
240e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// Software without specific prior written permission.
250e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
260e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
270e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
280e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
290e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
300e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
310e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung// THE SOFTWARE.
320e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//
330e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//===----------------------------------------------------------------------===//
340e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung/// \file
350e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung///
360e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung/// This file defines SPIR-V enums.
370e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung///
380e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung//===----------------------------------------------------------------------===//
390e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
400e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#ifndef SPIRVENUM_HPP_
410e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#define SPIRVENUM_HPP_
420e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
430e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#include "spirv.hpp"
440e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#include "SPIRVOpCode.h"
450e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#include <cstdint>
460e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungusing namespace spv;
470e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
480e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungnamespace SPIRV{
490e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
500e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef uint32_t SPIRVWord;
510e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef uint32_t SPIRVId;
520e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#define SPIRVID_MAX       ~0U
530e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#define SPIRVID_INVALID   ~0U
540e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#define SPIRVWORD_MAX     ~0U
550e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
560e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sunginline bool
570e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungisValidId(SPIRVId Id) { return Id != SPIRVID_INVALID && Id != 0;}
580e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
590e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sunginline SPIRVWord
600e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungmkWord(unsigned WordCount, Op OpCode) {
610e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  return (WordCount << 16) | OpCode;
620e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
630e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
640e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungconst static unsigned kSPIRVMemOrderSemanticMask = 0x1F;
650e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
660e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVVersion : SPIRVWord {
670e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRV_1_0 = 0x00010000,
680e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRV_1_1 = 0x00010100
690e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
700e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
710e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVGeneratorKind {
720e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVGEN_KhronosLLVMSPIRVTranslator   = 6,
730e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVGEN_KhronosSPIRVAssembler        = 7,
740e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
750e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
760e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVInstructionSchemaKind {
770e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVISCH_Default,
780e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
790e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
800e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVExtInstSetKind {
810e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVEIS_OpenCL,
820e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVEIS_Count,
830e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
840e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
850e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVSamplerAddressingModeKind {
860e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_None = 0,
870e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_ClampEdge = 2,
880e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_Clamp = 4,
890e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_Repeat = 6,
900e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_RepeatMirrored = 8,
910e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSAM_Invalid = 255,
920e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
930e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
940e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungenum SPIRVSamplerFilterModeKind {
950e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSFM_Nearest = 16,
960e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSFM_Linear = 32,
970e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVSFM_Invalid = 255,
980e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung};
990e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1000e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::Capability SPIRVCapabilityKind;
1010e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::ExecutionModel SPIRVExecutionModelKind;
1020e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::ExecutionMode SPIRVExecutionModeKind;
1030e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::AccessQualifier SPIRVAccessQualifierKind;
1040e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::AddressingModel SPIRVAddressingModelKind;
1050e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::LinkageType SPIRVLinkageTypeKind;
1060e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::MemoryModel SPIRVMemoryModelKind;
1070e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::StorageClass SPIRVStorageClassKind;
1080e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::FunctionControlMask SPIRVFunctionControlMaskKind;
1090e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::FPRoundingMode SPIRVFPRoundingModeKind;
1100e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::FunctionParameterAttribute SPIRVFuncParamAttrKind;
1110e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::BuiltIn SPIRVBuiltinVariableKind;
1120e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::MemoryAccessMask SPIRVMemoryAccessKind;
1130e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::GroupOperation SPIRVGroupOperationKind;
1140e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef spv::Dim SPIRVImageDimKind;
1150e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef std::vector<SPIRVCapabilityKind> SPIRVCapVec;
1160e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1170e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
1180e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVExtInstSetKind, std::string>::init() {
1190e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  add(SPIRVEIS_OpenCL, "OpenCL.std");
1200e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
1210e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtypedef SPIRVMap<SPIRVExtInstSetKind, std::string> SPIRVBuiltinSetNameMap;
1220e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1230e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<typename K>
1240e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVCapVec
1250e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SunggetCapability(K Key) {
1260e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVCapVec V;
1270e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVMap<K, SPIRVCapVec>::find(Key, &V);
1280e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  return V;
1290e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
1300e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1310e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#define ADD_VEC_INIT(Cap, ...)                                                 \
1320e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung{                                                                              \
1330e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVCapabilityKind C[] = __VA_ARGS__;                                       \
1340e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  SPIRVCapVec V(C, C + sizeof(C) / sizeof(C[0]));                              \
1350e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  add(Cap, V);                                                                 \
1360e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
1370e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1380e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
1390e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVCapabilityKind, SPIRVCapVec>::init() {
1400e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityShader, { CapabilityMatrix });
1410e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityGeometry, { CapabilityShader });
1420e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityTessellation, { CapabilityShader });
1430e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityVector16, { CapabilityKernel });
1440e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityFloat16Buffer, { CapabilityKernel });
1450e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityInt64Atomics, { CapabilityInt64 });
1460e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageBasic, { CapabilityKernel });
1470e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageReadWrite, { CapabilityImageBasic });
1480e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageMipmap, { CapabilityImageBasic });
1490e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityPipes, { CapabilityKernel });
1500e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityDeviceEnqueue, { CapabilityKernel });
1510e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityLiteralSampler, { CapabilityKernel });
1520e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityAtomicStorage, { CapabilityShader });
1530e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityTessellationPointSize, { CapabilityTessellation });
1540e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityGeometryPointSize, { CapabilityGeometry });
1550e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageGatherExtended, { CapabilityShader });
1560e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageImageMultisample, { CapabilityShader });
1570e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityUniformBufferArrayDynamicIndexing, { CapabilityShader });
1580e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampledImageArrayDynamicIndexing, { CapabilityShader });
1590e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageBufferArrayDynamicIndexing, { CapabilityShader });
1600e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageImageArrayDynamicIndexing, { CapabilityShader });
1610e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityClipDistance, { CapabilityShader });
1620e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityCullDistance, { CapabilityShader });
1630e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageCubeArray, { CapabilitySampledCubeArray });
1640e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampleRateShading, { CapabilityShader });
1650e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageRect, { CapabilitySampledRect });
1660e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampledRect, { CapabilityShader });
1670e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityGenericPointer, { CapabilityAddresses });
1680e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityInt8, { CapabilityKernel });
1690e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityInputAttachment, { CapabilityShader });
1700e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySparseResidency, { CapabilityShader });
1710e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityMinLod, { CapabilityShader });
1720e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampled1D, { CapabilityShader });
1730e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImage1D, { CapabilitySampled1D });
1740e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampledCubeArray, { CapabilityShader });
1750e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilitySampledBuffer, { CapabilityShader });
1760e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageBuffer, { CapabilitySampledBuffer });
1770e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageMSArray, { CapabilityShader });
1780e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageImageExtendedFormats, { CapabilityShader });
1790e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityImageQuery, { CapabilityShader });
1800e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityDerivativeControl, { CapabilityShader });
1810e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityInterpolationFunction, { CapabilityShader });
1820e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityTransformFeedback, { CapabilityShader });
1830e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityGeometryStreams, { CapabilityGeometry });
1840e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageImageReadWithoutFormat, { CapabilityShader });
1850e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityStorageImageWriteWithoutFormat, { CapabilityShader });
1860e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(CapabilityMultiViewport, { CapabilityGeometry });
1870e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
1880e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
1890e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
1900e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVExecutionModelKind, SPIRVCapVec>::init() {
1910e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelVertex, { CapabilityShader });
1920e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelTessellationControl, { CapabilityTessellation });
1930e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelTessellationEvaluation, { CapabilityTessellation });
1940e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelGeometry, { CapabilityGeometry });
1950e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelFragment, { CapabilityShader });
1960e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelGLCompute, { CapabilityShader });
1970e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModelKernel, { CapabilityKernel });
1980e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
1990e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
2000e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
2010e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVExecutionModeKind, SPIRVCapVec>::init() {
2020e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeInvocations, { CapabilityGeometry });
2030e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeSpacingEqual, { CapabilityTessellation });
2040e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeSpacingFractionalEven, { CapabilityTessellation });
2050e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeSpacingFractionalOdd, { CapabilityTessellation });
2060e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeVertexOrderCw, { CapabilityTessellation });
2070e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeVertexOrderCcw, { CapabilityTessellation });
2080e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModePixelCenterInteger, { CapabilityShader });
2090e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOriginUpperLeft, { CapabilityShader });
2100e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOriginLowerLeft, { CapabilityShader });
2110e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeEarlyFragmentTests, { CapabilityShader });
2120e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModePointMode, { CapabilityTessellation });
2130e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeXfb, { CapabilityTransformFeedback });
2140e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeDepthReplacing, { CapabilityShader });
2150e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeDepthGreater, { CapabilityShader });
2160e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeDepthLess, { CapabilityShader });
2170e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeDepthUnchanged, { CapabilityShader });
2180e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeLocalSizeHint, { CapabilityKernel });
2190e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeInputPoints, { CapabilityGeometry });
2200e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeInputLines, { CapabilityGeometry });
2210e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeInputLinesAdjacency, { CapabilityGeometry });
2220e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeTriangles, { CapabilityGeometry, CapabilityTessellation });
2230e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeInputTrianglesAdjacency, { CapabilityGeometry });
2240e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeQuads, { CapabilityTessellation });
2250e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeIsolines, { CapabilityTessellation });
2260e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOutputVertices, { CapabilityGeometry, CapabilityTessellation });
2270e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOutputPoints, { CapabilityGeometry });
2280e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOutputLineStrip, { CapabilityGeometry });
2290e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeOutputTriangleStrip, { CapabilityGeometry });
2300e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeVecTypeHint, { CapabilityKernel });
2310e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ExecutionModeContractionOff, { CapabilityKernel });
2320e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
2330e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
2340e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
2350e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVMemoryModelKind, SPIRVCapVec>::init() {
2360e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(MemoryModelSimple, { CapabilityShader });
2370e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(MemoryModelGLSL450, { CapabilityShader });
2380e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(MemoryModelOpenCL, { CapabilityKernel });
2390e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
2400e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
2410e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
2420e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVStorageClassKind, SPIRVCapVec>::init() {
2430e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassInput, { CapabilityShader });
2440e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassUniform, { CapabilityShader });
2450e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassOutput, { CapabilityShader });
2460e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassPrivate, { CapabilityShader });
2470e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassGeneric, { CapabilityGenericPointer });
2480e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassPushConstant, { CapabilityShader });
2490e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(StorageClassAtomicCounter, { CapabilityAtomicStorage });
2500e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
2510e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
2520e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
2530e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<SPIRVImageDimKind, SPIRVCapVec>::init() {
2540e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(Dim1D, { CapabilitySampled1D });
2550e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DimCube, { CapabilityShader });
2560e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DimRect, { CapabilitySampledRect });
2570e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DimBuffer, { CapabilitySampledBuffer });
2580e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DimSubpassData, {CapabilityInputAttachment });
2590e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
2600e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
2610e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
2620e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<ImageFormat, SPIRVCapVec>::init() {
2630e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba32f, { CapabilityShader });
2640e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba16f, { CapabilityShader });
2650e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR32f, { CapabilityShader });
2660e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba8, { CapabilityShader });
2670e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba8Snorm, { CapabilityShader });
2680e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg32f, { CapabilityStorageImageExtendedFormats });
2690e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg16f, { CapabilityStorageImageExtendedFormats });
2700e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR11fG11fB10f, { CapabilityStorageImageExtendedFormats });
2710e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR16f, { CapabilityStorageImageExtendedFormats });
2720e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba16, { CapabilityStorageImageExtendedFormats });
2730e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgb10A2, { CapabilityStorageImageExtendedFormats });
2740e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg16, { CapabilityStorageImageExtendedFormats });
2750e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg8, { CapabilityStorageImageExtendedFormats });
2760e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR16, { CapabilityStorageImageExtendedFormats });
2770e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR8, { CapabilityStorageImageExtendedFormats });
2780e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba16Snorm, { CapabilityStorageImageExtendedFormats });
2790e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg16Snorm, { CapabilityStorageImageExtendedFormats });
2800e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg8Snorm, { CapabilityStorageImageExtendedFormats });
2810e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR16Snorm, { CapabilityStorageImageExtendedFormats });
2820e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR8Snorm, { CapabilityStorageImageExtendedFormats });
2830e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba32i, { CapabilityShader });
2840e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba16i, { CapabilityShader });
2850e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba8i, { CapabilityShader });
2860e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR32i, { CapabilityShader });
2870e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg32i, { CapabilityStorageImageExtendedFormats });
2880e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg16i, { CapabilityStorageImageExtendedFormats });
2890e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg8i, { CapabilityStorageImageExtendedFormats });
2900e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR16i, { CapabilityStorageImageExtendedFormats });
2910e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR8i, { CapabilityStorageImageExtendedFormats });
2920e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba32ui, { CapabilityShader });
2930e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba16ui, { CapabilityShader });
2940e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgba8ui, { CapabilityShader });
2950e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR32ui, { CapabilityShader });
2960e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRgb10a2ui, { CapabilityStorageImageExtendedFormats });
2970e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg32ui, { CapabilityStorageImageExtendedFormats });
2980e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatRg16ui, { CapabilityStorageImageExtendedFormats });
2990e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR16ui, { CapabilityStorageImageExtendedFormats });
3000e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageFormatR8ui, { CapabilityStorageImageExtendedFormats });
3010e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
3020e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3030e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
3040e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<ImageOperandsMask, SPIRVCapVec>::init() {
3050e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageOperandsBiasMask, { CapabilityShader });
3060e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageOperandsOffsetMask, { CapabilityImageGatherExtended });
3070e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(ImageOperandsMinLodMask, { CapabilityMinLod });
3080e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
3090e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3100e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
3110e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<Decoration, SPIRVCapVec>::init() {
3120e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationRelaxedPrecision, { CapabilityShader });
3130e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationSpecId, { CapabilityShader });
3140e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationBlock, { CapabilityShader });
3150e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationBufferBlock, { CapabilityShader });
3160e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationRowMajor, { CapabilityMatrix });
3170e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationColMajor, { CapabilityMatrix });
3180e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationArrayStride, { CapabilityShader });
3190e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationMatrixStride, { CapabilityMatrix });
3200e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationGLSLShared, { CapabilityShader });
3210e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationGLSLPacked, { CapabilityShader });
3220e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationCPacked, { CapabilityKernel });
3230e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationNoPerspective, { CapabilityShader });
3240e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationFlat, { CapabilityShader });
3250e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationPatch, { CapabilityTessellation });
3260e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationCentroid, { CapabilityShader });
3270e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationSample, { CapabilitySampleRateShading });
3280e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationInvariant, { CapabilityShader });
3290e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationConstant, { CapabilityKernel });
3300e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationUniform, { CapabilityShader });
3310e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationSaturatedConversion, { CapabilityKernel });
3320e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationStream, { CapabilityGeometryStreams });
3330e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationLocation, { CapabilityShader });
3340e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationComponent, { CapabilityShader });
3350e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationIndex, { CapabilityShader });
3360e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationBinding, { CapabilityShader });
3370e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationDescriptorSet, { CapabilityShader });
3380e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationOffset, { CapabilityShader });
3390e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationXfbBuffer, { CapabilityTransformFeedback });
3400e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationXfbStride, { CapabilityTransformFeedback });
3410e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationFuncParamAttr, { CapabilityKernel });
3420e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationFPRoundingMode, { CapabilityKernel });
3430e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationFPFastMathMode, { CapabilityKernel });
3440e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationLinkageAttributes, { CapabilityLinkage });
3450e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationNoContraction, { CapabilityShader });
3460e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationInputAttachmentIndex, { CapabilityInputAttachment });
3470e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(DecorationAlignment, { CapabilityKernel });
3480e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
3490e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3500e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
3510e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<BuiltIn, SPIRVCapVec>::init() {
3520e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInPosition, { CapabilityShader });
3530e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInPointSize, { CapabilityShader });
3540e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInClipDistance, { CapabilityClipDistance });
3550e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInCullDistance, { CapabilityCullDistance });
3560e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInVertexId, { CapabilityShader });
3570e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInInstanceId, { CapabilityShader });
3580e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInPrimitiveId, { CapabilityGeometry, CapabilityTessellation });
3590e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInInvocationId, { CapabilityGeometry, CapabilityTessellation });
3600e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInLayer, { CapabilityGeometry });
3610e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInViewportIndex, { CapabilityMultiViewport });
3620e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInTessLevelOuter, { CapabilityTessellation });
3630e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInTessLevelInner, { CapabilityTessellation });
3640e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInTessCoord, { CapabilityTessellation });
3650e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInPatchVertices, { CapabilityTessellation });
3660e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInFragCoord, { CapabilityShader });
3670e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInPointCoord, { CapabilityShader });
3680e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInFrontFacing, { CapabilityShader });
3690e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSampleId, { CapabilitySampleRateShading });
3700e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSamplePosition, { CapabilitySampleRateShading });
3710e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSampleMask, { CapabilitySampleRateShading });
3720e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInFragDepth, { CapabilityShader });
3730e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInHelperInvocation, { CapabilityShader });
3740e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInWorkDim, { CapabilityKernel });
3750e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInGlobalSize, { CapabilityKernel });
3760e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInEnqueuedWorkgroupSize, { CapabilityKernel });
3770e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInGlobalOffset, { CapabilityKernel });
3780e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInGlobalLinearId, { CapabilityKernel });
3790e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSubgroupSize, { CapabilityKernel });
3800e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSubgroupMaxSize, { CapabilityKernel });
3810e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInNumSubgroups, { CapabilityKernel });
3820e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInNumEnqueuedSubgroups, { CapabilityKernel });
3830e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSubgroupId, { CapabilityKernel });
3840e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInSubgroupLocalInvocationId, { CapabilityKernel });
3850e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInVertexIndex, { CapabilityShader });
3860e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(BuiltInInstanceIndex, { CapabilityShader });
3870e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
3880e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3890e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sungtemplate<> inline void
3900e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungSPIRVMap<MemorySemanticsMask, SPIRVCapVec>::init() {
3910e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(MemorySemanticsUniformMemoryMask, { CapabilityShader });
3920e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  ADD_VEC_INIT(MemorySemanticsAtomicCounterMemoryMask, { CapabilityAtomicStorage });
3930e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
3940e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3950e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#undef ADD_VEC_INIT
3960e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
3970e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sunginline unsigned
3980e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SunggetImageDimension(SPIRVImageDimKind K) {
3990e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  switch(K){
4000e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case Dim1D:      return 1;
4010e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case Dim2D:      return 2;
4020e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case Dim3D:      return 3;
4030e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case DimCube:    return 2;
4040e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case DimRect:    return 2;
4050e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  case DimBuffer:  return 1;
4060e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  default:              return 0;
4070e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  }
4080e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
4090e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
4100e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung/// Extract memory order part of SPIR-V memory semantics.
4110e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sunginline unsigned
4120e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) SungextractSPIRVMemOrderSemantic(unsigned Sema) {
4130e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung  return Sema & kSPIRVMemOrderSemanticMask;
4140e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
4150e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
4160e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
4170e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung}
4180e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
4190e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung
4200e839d7e9d7e5a096949e39a4c6e00670c8dee64I-Jui (Ray) Sung#endif /* SPIRVENUM_HPP_ */
421