diff options
Diffstat (limited to '3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp')
-rw-r--r-- | 3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp | 278 |
1 files changed, 212 insertions, 66 deletions
diff --git a/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp b/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp index 7a11630c724..86f2c8d1f10 100644 --- a/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp +++ b/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp @@ -14,8 +14,8 @@ #include "source/spirv_target_env.h" -#include <cassert> #include <cstring> +#include <string> #include "source/spirv_constant.h" #include "spirv-tools/libspirv.h" @@ -62,8 +62,13 @@ const char* spvTargetEnvDescription(spv_target_env env) { return "SPIR-V 1.3 (under Vulkan 1.1 semantics)"; case SPV_ENV_WEBGPU_0: return "SPIR-V 1.3 (under WIP WebGPU semantics)"; + case SPV_ENV_UNIVERSAL_1_4: + return "SPIR-V 1.4"; + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + return "SPIR-V 1.4 (under Vulkan 1.1 semantics)"; + case SPV_ENV_UNIVERSAL_1_5: + return "SPIR-V 1.5"; } - assert(0 && "Unhandled SPIR-V target environment"); return ""; } @@ -93,79 +98,55 @@ uint32_t spvVersionForTargetEnv(spv_target_env env) { case SPV_ENV_VULKAN_1_1: case SPV_ENV_WEBGPU_0: return SPV_SPIRV_VERSION_WORD(1, 3); + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + return SPV_SPIRV_VERSION_WORD(1, 4); + case SPV_ENV_UNIVERSAL_1_5: + return SPV_SPIRV_VERSION_WORD(1, 5); } - assert(0 && "Unhandled SPIR-V target environment"); return SPV_SPIRV_VERSION_WORD(0, 0); } +static const std::pair<const char*, spv_target_env> spvTargetEnvNameMap[] = { + {"vulkan1.1spv1.4", SPV_ENV_VULKAN_1_1_SPIRV_1_4}, + {"vulkan1.0", SPV_ENV_VULKAN_1_0}, + {"vulkan1.1", SPV_ENV_VULKAN_1_1}, + {"spv1.0", SPV_ENV_UNIVERSAL_1_0}, + {"spv1.1", SPV_ENV_UNIVERSAL_1_1}, + {"spv1.2", SPV_ENV_UNIVERSAL_1_2}, + {"spv1.3", SPV_ENV_UNIVERSAL_1_3}, + {"spv1.4", SPV_ENV_UNIVERSAL_1_4}, + {"spv1.5", SPV_ENV_UNIVERSAL_1_5}, + {"opencl1.2embedded", SPV_ENV_OPENCL_EMBEDDED_1_2}, + {"opencl1.2", SPV_ENV_OPENCL_1_2}, + {"opencl2.0embedded", SPV_ENV_OPENCL_EMBEDDED_2_0}, + {"opencl2.0", SPV_ENV_OPENCL_2_0}, + {"opencl2.1embedded", SPV_ENV_OPENCL_EMBEDDED_2_1}, + {"opencl2.1", SPV_ENV_OPENCL_2_1}, + {"opencl2.2embedded", SPV_ENV_OPENCL_EMBEDDED_2_2}, + {"opencl2.2", SPV_ENV_OPENCL_2_2}, + {"opengl4.0", SPV_ENV_OPENGL_4_0}, + {"opengl4.1", SPV_ENV_OPENGL_4_1}, + {"opengl4.2", SPV_ENV_OPENGL_4_2}, + {"opengl4.3", SPV_ENV_OPENGL_4_3}, + {"opengl4.5", SPV_ENV_OPENGL_4_5}, + {"webgpu0", SPV_ENV_WEBGPU_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; + for (auto& name_env : spvTargetEnvNameMap) { + if (match(name_env.first)) { + if (env) { + *env = name_env.second; + } + return true; + } } + if (env) *env = SPV_ENV_UNIVERSAL_1_0; + return false; } bool spvIsVulkanEnv(spv_target_env env) { @@ -188,10 +169,175 @@ bool spvIsVulkanEnv(spv_target_env env) { case SPV_ENV_OPENCL_EMBEDDED_2_2: case SPV_ENV_UNIVERSAL_1_3: case SPV_ENV_WEBGPU_0: + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_UNIVERSAL_1_5: return false; case SPV_ENV_VULKAN_1_0: case SPV_ENV_VULKAN_1_1: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + 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: + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + case SPV_ENV_UNIVERSAL_1_5: + 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: + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + case SPV_ENV_UNIVERSAL_1_5: + return false; + case SPV_ENV_WEBGPU_0: return true; } return false; } + +bool spvIsOpenGLEnv(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_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: + case SPV_ENV_WEBGPU_0: + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: + case SPV_ENV_UNIVERSAL_1_5: + return false; + 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 true; + } + return false; +} + +bool spvIsVulkanOrWebGPUEnv(spv_target_env env) { + return spvIsVulkanEnv(env) || spvIsWebGPUEnv(env); +} + +std::string spvLogStringForEnv(spv_target_env env) { + switch (env) { + case SPV_ENV_OPENCL_1_2: + case SPV_ENV_OPENCL_2_0: + case SPV_ENV_OPENCL_2_1: + case SPV_ENV_OPENCL_2_2: + case SPV_ENV_OPENCL_EMBEDDED_1_2: + case SPV_ENV_OPENCL_EMBEDDED_2_0: + case SPV_ENV_OPENCL_EMBEDDED_2_1: + case SPV_ENV_OPENCL_EMBEDDED_2_2: { + return "OpenCL"; + } + 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 "OpenGL"; + } + case SPV_ENV_VULKAN_1_0: + case SPV_ENV_VULKAN_1_1: + case SPV_ENV_VULKAN_1_1_SPIRV_1_4: { + return "Vulkan"; + } + case SPV_ENV_WEBGPU_0: { + return "WebGPU"; + } + case SPV_ENV_UNIVERSAL_1_0: + case SPV_ENV_UNIVERSAL_1_1: + case SPV_ENV_UNIVERSAL_1_2: + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_UNIVERSAL_1_4: + case SPV_ENV_UNIVERSAL_1_5: { + return "Universal"; + } + } + return "Unknown"; +} + +std::string spvTargetEnvList(const int pad, const int wrap) { + std::string ret; + size_t max_line_len = wrap - pad; // The first line isn't padded + std::string line; + std::string sep = ""; + + for (auto& name_env : spvTargetEnvNameMap) { + std::string word = sep + name_env.first; + if (line.length() + word.length() > max_line_len) { + // Adding one word wouldn't fit, commit the line in progress and + // start a new one. + ret += line + "\n"; + line.assign(pad, ' '); + // The first line is done. The max length now comprises the + // padding. + max_line_len = wrap; + } + line += word; + sep = "|"; + } + + ret += line; + + return ret; +} |