// Copyright (c) 2015-2016 The Khronos Group Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "source/spirv_target_env.h" #include <cstring> #include "source/spirv_constant.h" #include "spirv-tools/libspirv.h" const char* spvTargetEnvDescription(spv_target_env env) { switch (env) { case SPV_ENV_UNIVERSAL_1_0: return "SPIR-V 1.0"; case SPV_ENV_VULKAN_1_0: return "SPIR-V 1.0 (under Vulkan 1.0 semantics)"; case SPV_ENV_UNIVERSAL_1_1: return "SPIR-V 1.1"; case SPV_ENV_OPENCL_1_2: return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)"; case SPV_ENV_OPENCL_EMBEDDED_1_2: return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)"; case SPV_ENV_OPENCL_2_0: return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)"; case SPV_ENV_OPENCL_EMBEDDED_2_0: return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)"; case SPV_ENV_OPENCL_2_1: return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)"; case SPV_ENV_OPENCL_EMBEDDED_2_1: return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)"; case SPV_ENV_OPENCL_2_2: return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)"; case SPV_ENV_OPENCL_EMBEDDED_2_2: return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)"; case SPV_ENV_OPENGL_4_0: return "SPIR-V 1.0 (under OpenGL 4.0 semantics)"; case SPV_ENV_OPENGL_4_1: return "SPIR-V 1.0 (under OpenGL 4.1 semantics)"; case SPV_ENV_OPENGL_4_2: return "SPIR-V 1.0 (under OpenGL 4.2 semantics)"; case SPV_ENV_OPENGL_4_3: return "SPIR-V 1.0 (under OpenGL 4.3 semantics)"; case SPV_ENV_OPENGL_4_5: return "SPIR-V 1.0 (under OpenGL 4.5 semantics)"; case SPV_ENV_UNIVERSAL_1_2: return "SPIR-V 1.2"; case SPV_ENV_UNIVERSAL_1_3: return "SPIR-V 1.3"; case SPV_ENV_VULKAN_1_1: return "SPIR-V 1.3 (under Vulkan 1.1 semantics)"; case SPV_ENV_WEBGPU_0: return "SPIR-V 1.3 (under WIP WebGPU semantics)"; } return ""; } uint32_t spvVersionForTargetEnv(spv_target_env env) { switch (env) { case SPV_ENV_UNIVERSAL_1_0: case SPV_ENV_VULKAN_1_0: case SPV_ENV_OPENCL_1_2: case SPV_ENV_OPENCL_EMBEDDED_1_2: case SPV_ENV_OPENCL_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_0: case SPV_ENV_OPENCL_2_1: case SPV_ENV_OPENCL_EMBEDDED_2_1: case SPV_ENV_OPENGL_4_0: case SPV_ENV_OPENGL_4_1: case SPV_ENV_OPENGL_4_2: case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: return SPV_SPIRV_VERSION_WORD(1, 0); case SPV_ENV_UNIVERSAL_1_1: return SPV_SPIRV_VERSION_WORD(1, 1); case SPV_ENV_UNIVERSAL_1_2: case SPV_ENV_OPENCL_2_2: case SPV_ENV_OPENCL_EMBEDDED_2_2: return SPV_SPIRV_VERSION_WORD(1, 2); case SPV_ENV_UNIVERSAL_1_3: case SPV_ENV_VULKAN_1_1: case SPV_ENV_WEBGPU_0: return SPV_SPIRV_VERSION_WORD(1, 3); } return SPV_SPIRV_VERSION_WORD(0, 0); } bool spvParseTargetEnv(const char* s, spv_target_env* env) { auto match = [s](const char* b) { return s && (0 == strncmp(s, b, strlen(b))); }; if (match("vulkan1.0")) { if (env) *env = SPV_ENV_VULKAN_1_0; return true; } else if (match("vulkan1.1")) { if (env) *env = SPV_ENV_VULKAN_1_1; return true; } else if (match("spv1.0")) { if (env) *env = SPV_ENV_UNIVERSAL_1_0; return true; } else if (match("spv1.1")) { if (env) *env = SPV_ENV_UNIVERSAL_1_1; return true; } else if (match("spv1.2")) { if (env) *env = SPV_ENV_UNIVERSAL_1_2; return true; } else if (match("spv1.3")) { if (env) *env = SPV_ENV_UNIVERSAL_1_3; return true; } else if (match("opencl1.2embedded")) { if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2; return true; } else if (match("opencl1.2")) { if (env) *env = SPV_ENV_OPENCL_1_2; return true; } else if (match("opencl2.0embedded")) { if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0; return true; } else if (match("opencl2.0")) { if (env) *env = SPV_ENV_OPENCL_2_0; return true; } else if (match("opencl2.1embedded")) { if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1; return true; } else if (match("opencl2.1")) { if (env) *env = SPV_ENV_OPENCL_2_1; return true; } else if (match("opencl2.2embedded")) { if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2; return true; } else if (match("opencl2.2")) { if (env) *env = SPV_ENV_OPENCL_2_2; return true; } else if (match("opengl4.0")) { if (env) *env = SPV_ENV_OPENGL_4_0; return true; } else if (match("opengl4.1")) { if (env) *env = SPV_ENV_OPENGL_4_1; return true; } else if (match("opengl4.2")) { if (env) *env = SPV_ENV_OPENGL_4_2; return true; } else if (match("opengl4.3")) { if (env) *env = SPV_ENV_OPENGL_4_3; return true; } else if (match("opengl4.5")) { if (env) *env = SPV_ENV_OPENGL_4_5; return true; } else if (match("webgpu0")) { if (env) *env = SPV_ENV_WEBGPU_0; return true; } else { if (env) *env = SPV_ENV_UNIVERSAL_1_0; return false; } } bool spvIsVulkanEnv(spv_target_env env) { switch (env) { case SPV_ENV_UNIVERSAL_1_0: case SPV_ENV_OPENCL_1_2: case SPV_ENV_OPENCL_EMBEDDED_1_2: case SPV_ENV_OPENCL_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_0: case SPV_ENV_OPENCL_2_1: case SPV_ENV_OPENCL_EMBEDDED_2_1: case SPV_ENV_OPENGL_4_0: case SPV_ENV_OPENGL_4_1: case SPV_ENV_OPENGL_4_2: case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: case SPV_ENV_UNIVERSAL_1_1: case SPV_ENV_UNIVERSAL_1_2: case SPV_ENV_OPENCL_2_2: case SPV_ENV_OPENCL_EMBEDDED_2_2: case SPV_ENV_UNIVERSAL_1_3: case SPV_ENV_WEBGPU_0: return false; case SPV_ENV_VULKAN_1_0: case SPV_ENV_VULKAN_1_1: return true; } return false; } bool spvIsOpenCLEnv(spv_target_env env) { switch (env) { case SPV_ENV_UNIVERSAL_1_0: case SPV_ENV_VULKAN_1_0: case SPV_ENV_UNIVERSAL_1_1: case SPV_ENV_OPENGL_4_0: case SPV_ENV_OPENGL_4_1: case SPV_ENV_OPENGL_4_2: case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: case SPV_ENV_UNIVERSAL_1_2: case SPV_ENV_UNIVERSAL_1_3: case SPV_ENV_VULKAN_1_1: case SPV_ENV_WEBGPU_0: return false; case SPV_ENV_OPENCL_1_2: case SPV_ENV_OPENCL_EMBEDDED_1_2: case SPV_ENV_OPENCL_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_1: case SPV_ENV_OPENCL_EMBEDDED_2_2: case SPV_ENV_OPENCL_2_1: case SPV_ENV_OPENCL_2_2: return true; } return false; } bool spvIsWebGPUEnv(spv_target_env env) { switch (env) { case SPV_ENV_UNIVERSAL_1_0: case SPV_ENV_VULKAN_1_0: case SPV_ENV_UNIVERSAL_1_1: case SPV_ENV_OPENGL_4_0: case SPV_ENV_OPENGL_4_1: case SPV_ENV_OPENGL_4_2: case SPV_ENV_OPENGL_4_3: case SPV_ENV_OPENGL_4_5: case SPV_ENV_UNIVERSAL_1_2: case SPV_ENV_UNIVERSAL_1_3: case SPV_ENV_VULKAN_1_1: case SPV_ENV_OPENCL_1_2: case SPV_ENV_OPENCL_EMBEDDED_1_2: case SPV_ENV_OPENCL_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_0: case SPV_ENV_OPENCL_EMBEDDED_2_1: case SPV_ENV_OPENCL_EMBEDDED_2_2: case SPV_ENV_OPENCL_2_1: case SPV_ENV_OPENCL_2_2: return false; case SPV_ENV_WEBGPU_0: return true; } return false; }