| // 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; |
| } |