summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp
diff options
context:
space:
mode:
author Julian Sikorski <belegdol+github@gmail.com>2019-10-13 13:50:38 +0200
committer R. Belmont <rb6502@users.noreply.github.com>2019-10-13 07:50:38 -0400
commit0837e7451a84f95c29dbdb9bd6b8b931fee1635d (patch)
tree626bcbd250a7fbebdf5958a288d2f438d4f9fb5a /3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp
parentc913ccb59d713ce0b91135520719ac5385e54358 (diff)
WIP: sync bgfx, bx and bimg with latest upstream (#5723)
* Sync with bgfx upstream revision b91d0b6 * Sync with bx upstream revision d60912b * Sync with bimg upstream revision bd81f60 * Add astc-codec decoder * Rename VertexDecl to VertexLayout * Rename UniformType enum Int1 to Sampler. * Add NVN stub * Fix unused-const-variable error on macOS * Drop redundant explicit language parameters buildoptions_cpp are only applied to c++ files and buildoptions_objcpp are only applied to objective c++ files. As such, hardcoding -x offers no benefit while preventing overrides (such as one needed by 3rdparty/bgfx/src/renderer_vk.cpp on macOS) from working. * Re-introduce -x c++ in places where C code is compiled as C++ to prevent clang from throwing a warning * Build bgfx as Objective-C++ on macOS It is needed due to included headers * Enable Direct3D12 and Vulkan bgfx rendering backends * Enable building of spirv shaders * Properly escape /c in cmd call * Comment out dx12 bgfx renderer * Honor VERBOSE setting during shaders build * Only invert hlsl shader XYZ_TO_sRGB matrix for opengl * Add spirv shaders * OpenGL ES needs transposed matrix too * Metal needs transposed matrix as well
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;
+}