1 //===- SPIRVEnums.cpp - MLIR SPIR-V Enums ---------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the C/C++ enums from SPIR-V spec. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "mlir/Dialect/SPIRV/IR/SPIRVEnums.h" 14 15 #include "mlir/IR/BuiltinTypes.h" 16 17 #include "llvm/ADT/SetVector.h" 18 #include "llvm/ADT/StringExtras.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/StringSwitch.h" 21 22 using namespace mlir; 23 24 // Pull in all enum utility function definitions 25 #include "mlir/Dialect/SPIRV/IR/SPIRVEnums.cpp.inc" 26 27 // Pull in all enum type availability query function definitions 28 #include "mlir/Dialect/SPIRV/IR/SPIRVEnumAvailability.cpp.inc" 29 30 //===----------------------------------------------------------------------===// 31 // Availability relationship 32 //===----------------------------------------------------------------------===// 33 34 ArrayRef<spirv::Extension> spirv::getImpliedExtensions(spirv::Version version) { 35 // Note: the following lists are from "Appendix A: Changes" of the spec. 36 37 #define V_1_3_IMPLIED_EXTS \ 38 Extension::SPV_KHR_shader_draw_parameters, Extension::SPV_KHR_16bit_storage, \ 39 Extension::SPV_KHR_device_group, Extension::SPV_KHR_multiview, \ 40 Extension::SPV_KHR_storage_buffer_storage_class, \ 41 Extension::SPV_KHR_variable_pointers 42 43 #define V_1_4_IMPLIED_EXTS \ 44 Extension::SPV_KHR_no_integer_wrap_decoration, \ 45 Extension::SPV_GOOGLE_decorate_string, \ 46 Extension::SPV_GOOGLE_hlsl_functionality1, \ 47 Extension::SPV_KHR_float_controls 48 49 #define V_1_5_IMPLIED_EXTS \ 50 Extension::SPV_KHR_8bit_storage, Extension::SPV_EXT_descriptor_indexing, \ 51 Extension::SPV_EXT_shader_viewport_index_layer, \ 52 Extension::SPV_EXT_physical_storage_buffer, \ 53 Extension::SPV_KHR_physical_storage_buffer, \ 54 Extension::SPV_KHR_vulkan_memory_model 55 56 switch (version) { 57 default: 58 return {}; 59 case Version::V_1_3: { 60 // The following manual ArrayRef constructor call is to satisfy GCC 5. 61 static const Extension exts[] = {V_1_3_IMPLIED_EXTS}; 62 return ArrayRef<spirv::Extension>(exts, llvm::array_lengthof(exts)); 63 } 64 case Version::V_1_4: { 65 static const Extension exts[] = {V_1_3_IMPLIED_EXTS, V_1_4_IMPLIED_EXTS}; 66 return ArrayRef<spirv::Extension>(exts, llvm::array_lengthof(exts)); 67 } 68 case Version::V_1_5: { 69 static const Extension exts[] = {V_1_3_IMPLIED_EXTS, V_1_4_IMPLIED_EXTS, 70 V_1_5_IMPLIED_EXTS}; 71 return ArrayRef<spirv::Extension>(exts, llvm::array_lengthof(exts)); 72 } 73 } 74 75 #undef V_1_5_IMPLIED_EXTS 76 #undef V_1_4_IMPLIED_EXTS 77 #undef V_1_3_IMPLIED_EXTS 78 } 79 80 // Pull in utility function definition for implied capabilities 81 #include "mlir/Dialect/SPIRV/IR/SPIRVCapabilityImplication.inc" 82 83 SmallVector<spirv::Capability, 0> 84 spirv::getRecursiveImpliedCapabilities(spirv::Capability cap) { 85 ArrayRef<spirv::Capability> directCaps = getDirectImpliedCapabilities(cap); 86 llvm::SetVector<spirv::Capability, SmallVector<spirv::Capability, 0>> allCaps( 87 directCaps.begin(), directCaps.end()); 88 89 // TODO: This is insufficient; find a better way to handle this 90 // (e.g., using static lists) if this turns out to be a bottleneck. 91 for (unsigned i = 0; i < allCaps.size(); ++i) 92 for (Capability c : getDirectImpliedCapabilities(allCaps[i])) 93 allCaps.insert(c); 94 95 return allCaps.takeVector(); 96 } 97