summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp
diff options
context:
space:
mode:
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.cpp278
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;
+}