Skip to content

Commit

Permalink
Deprecate WebGPU SPIRV support (#1167)
Browse files Browse the repository at this point in the history
* Deprecate WebGPU SPIRV support

Roll third_party/spirv-tools/ 1bb80d277..ee39b5db5 (16 commits)

KhronosGroup/SPIRV-Tools@1bb80d2...ee39b5d

$ git log 1bb80d277..ee39b5db5 --date=short --no-merges --format='%ad %ae %s'
2021-01-15 46493288+sfricke-samsung spirv-val: Add Vulkan Addressing Model check (#4107)
2021-01-14 rharrison Remove WebGPU support (#4108)
2021-01-14 46493288+sfricke-samsung spirv-val: Vulkan atomic storage class (#4079)
2021-01-13 jaebaek Avoid integrity check failures caused by propagating line instructions (#4096)
2021-01-13 pierremoreau Linker usability improvements (#4084)
2021-01-12 dj2 Revert "Generate differentiated error codes for buffer oob checking (#4097)" (#4100)
2021-01-11 greg Generate differentiated error codes for buffer oob checking (#4097)
2021-01-07 dneto use std::string::empty() to test for emptiness (#4098)
2021-01-07 46493288+sfricke-samsung spirv-val: Label standalone Vulkan VUID (#4091)
2021-01-06 46493288+sfricke-samsung spirv-val: Add Vulkan decroation VUID (#4090)
2021-01-06 stevenperron Fix binding number calculation in desc sroa (#4095)
2021-01-06 stevenperron Build deps: dump ini from 1.3.5 to 1.3.7 in tools/sva (#4092)
2021-01-06 46493288+sfricke-samsung spirv-val: Add Vulkan FP Mode VUID (#4088)
2021-01-06 46493288+sfricke-samsung spirv-val: Fix Vulkan image sampled check (#4085)
2021-01-06 46493288+sfricke-samsung spirv-val: Add Vulkan ForwardPointer VUID (#4089)
2021-01-06 46493288+sfricke-samsung spirv-val: Add Vulkan ImageTexelPointer format check (#4087)

Created with:
  roll-dep third_party/spirv-tools

Fixes #1166

* Retain the public API enums

* Fix implicit fallthrough
  • Loading branch information
zoddicus committed Jan 18, 2021
1 parent 61649cc commit 73b54fa
Show file tree
Hide file tree
Showing 7 changed files with 11 additions and 42 deletions.
2 changes: 1 addition & 1 deletion DEPS
Expand Up @@ -9,7 +9,7 @@ vars = {
'googletest_revision': '389cb68b87193358358ae87cc56d257fd0d80189',
're2_revision': 'c33d1680c7e9ab7edea02d7465a8db13e80b558d',
'spirv_headers_revision': 'f027d53ded7e230e008d37c8b47ede7cd308e19d',
'spirv_tools_revision': '1bb80d2778a3d0362365b2490e2174bd56453036',
'spirv_tools_revision': 'ee39b5db5f1d51bbdb0422d529d1e99615627bcf',
}

deps = {
Expand Down
7 changes: 3 additions & 4 deletions libshaderc/include/shaderc/env.h
Expand Up @@ -29,7 +29,8 @@ typedef enum {
shaderc_target_env_opengl_compat, // SPIR-V under OpenGL semantics,
// including compatibility profile
// functions
shaderc_target_env_webgpu, // SPIR-V under WebGPU semantics
shaderc_target_env_webgpu, // Deprecated, SPIR-V under WebGPU
// semantics
shaderc_target_env_default = shaderc_target_env_vulkan
} shaderc_target_env;

Expand All @@ -44,9 +45,7 @@ typedef enum {
// See glslang/Standalone/Standalone.cpp
// TODO(dneto): Glslang doesn't accept a OpenGL client version of 460.
shaderc_env_version_opengl_4_5 = 450,
// Currently WebGPU doesn't have versioning, since it isn't finalized. This
// will have to be updated once the spec is finished.
shaderc_env_version_webgpu,
shaderc_env_version_webgpu, // Deprecated, WebGPU env never defined versions
} shaderc_env_version;

// The known versions of SPIR-V.
Expand Down
3 changes: 2 additions & 1 deletion libshaderc/src/shaderc.cc
Expand Up @@ -279,7 +279,8 @@ shaderc_util::Compiler::TargetEnv GetCompilerTargetEnv(shaderc_target_env env) {
case shaderc_target_env_opengl_compat:
return shaderc_util::Compiler::TargetEnv::OpenGLCompat;
case shaderc_target_env_webgpu:
return shaderc_util::Compiler::TargetEnv::WebGPU;
assert(false);
break;
case shaderc_target_env_vulkan:
default:
break;
Expand Down
1 change: 0 additions & 1 deletion libshaderc_util/include/libshaderc_util/compiler.h
Expand Up @@ -76,7 +76,6 @@ class Compiler {
Vulkan, // Default to Vulkan 1.0
OpenGL, // Default to OpenGL 4.5
OpenGLCompat, // Deprecated.
WebGPU,
};

// Target environment versions. These numbers match those used by Glslang.
Expand Down
Expand Up @@ -46,7 +46,6 @@ enum class PassId {
kLegalizationPasses,
kPerformancePasses,
kSizePasses,
kVulkanToWebGPUPasses,

// SPIRV-Tools specific passes
kNullPass,
Expand Down
34 changes: 5 additions & 29 deletions libshaderc_util/src/compiler.cc
Expand Up @@ -84,7 +84,6 @@ EShMessages GetMessageRules(shaderc_util::Compiler::TargetEnv env,
case Compiler::TargetEnv::OpenGL:
result = static_cast<EShMessages>(result | EShMsgSpvRules);
break;
case Compiler::TargetEnv::WebGPU:
case Compiler::TargetEnv::Vulkan:
result =
static_cast<EShMessages>(result | EShMsgSpvRules | EShMsgVulkanRules);
Expand Down Expand Up @@ -184,17 +183,9 @@ std::tuple<bool, std::vector<uint32_t>, size_t> Compiler::Compile(
std::vector<uint32_t>& compilation_output_data = std::get<1>(result_tuple);
size_t& compilation_output_data_size_in_bytes = std::get<2>(result_tuple);

// glslang doesn't currently support WebGPU, so we need to fake it by having
// it generate Vulkan1.1 and then use spirv-opt later to convert to WebGPU.
bool is_webgpu = target_env_ == Compiler::TargetEnv::WebGPU;
TargetEnv internal_target_env =
!is_webgpu ? target_env_ : Compiler::TargetEnv::Vulkan;
TargetEnvVersion internal_target_env_version =
!is_webgpu ? target_env_version_ : Compiler::TargetEnvVersion::Vulkan_1_1;

// Check target environment.
const auto target_client_info = GetGlslangClientInfo(
error_tag, internal_target_env, internal_target_env_version,
error_tag, target_env_, target_env_version_,
target_spirv_version_, target_spirv_version_is_forced_);
if (!target_client_info.error.empty()) {
*error_stream << target_client_info.error;
Expand Down Expand Up @@ -297,7 +288,7 @@ std::tuple<bool, std::vector<uint32_t>, size_t> Compiler::Compile(
shader.setNanMinMaxClamp(nan_clamp_);

const EShMessages rules =
GetMessageRules(internal_target_env, source_language_, hlsl_offsets_,
GetMessageRules(target_env_, source_language_, hlsl_offsets_,
generate_debug_info_);

bool success = shader.parse(&limits_, default_version_, default_profile_,
Expand Down Expand Up @@ -347,14 +338,9 @@ std::tuple<bool, std::vector<uint32_t>, size_t> Compiler::Compile(
opt_passes.insert(opt_passes.end(), enabled_opt_passes_.begin(),
enabled_opt_passes_.end());

// WebGPU goes last, since it is converting the env.
if (is_webgpu) {
opt_passes.push_back(PassId::kVulkanToWebGPUPasses);
}

if (!opt_passes.empty()) {
std::string opt_errors;
if (!SpirvToolsOptimize(internal_target_env, internal_target_env_version,
if (!SpirvToolsOptimize(target_env_, target_env_version_,
opt_passes, &spirv, &opt_errors)) {
*error_stream << "shaderc: internal error: compilation succeeded but "
"failed to optimize: "
Expand All @@ -365,8 +351,6 @@ std::tuple<bool, std::vector<uint32_t>, size_t> Compiler::Compile(

if (output_type == OutputType::SpirvAssemblyText) {
std::string text_or_error;
// spirv-tools does know about WebGPU, so don't need to punt to Vulkan1.1
// here.
if (!SpirvToolsDisassemble(target_env_, target_env_version_, spirv,
&text_or_error)) {
*error_stream << "shaderc: internal error: compilation succeeded but "
Expand Down Expand Up @@ -464,14 +448,6 @@ void Compiler::SetSuppressWarnings() { suppress_warnings_ = true; }
std::tuple<bool, std::string, std::string> Compiler::PreprocessShader(
const std::string& error_tag, const string_piece& shader_source,
const string_piece& shader_preamble, CountingIncluder& includer) const {
// glslang doesn't currently support WebGPU, so we need to fake it by having
// it generate Vulkan1.1 and then use spirv-opt later to convert to WebGPU.
bool is_webgpu = target_env_ == Compiler::TargetEnv::WebGPU;
TargetEnv internal_target_env =
!is_webgpu ? target_env_ : Compiler::TargetEnv::Vulkan;
TargetEnvVersion internal_target_env_version =
!is_webgpu ? target_env_version_ : Compiler::TargetEnvVersion::Vulkan_1_1;

// The stage does not matter for preprocessing.
glslang::TShader shader(EShLangVertex);
const char* shader_strings = shader_source.data();
Expand All @@ -481,7 +457,7 @@ std::tuple<bool, std::string, std::string> Compiler::PreprocessShader(
&string_names, 1);
shader.setPreamble(shader_preamble.data());
auto target_client_info = GetGlslangClientInfo(
error_tag, internal_target_env, internal_target_env_version,
error_tag, target_env_, target_env_version_,
target_spirv_version_, target_spirv_version_is_forced_);
if (!target_client_info.error.empty()) {
return std::make_tuple(false, "", target_client_info.error);
Expand All @@ -499,7 +475,7 @@ std::tuple<bool, std::string, std::string> Compiler::PreprocessShader(
// flag.
const auto rules = static_cast<EShMessages>(
EShMsgOnlyPreprocessor |
GetMessageRules(internal_target_env, source_language_, hlsl_offsets_,
GetMessageRules(target_env_, source_language_, hlsl_offsets_,
false));

std::string preprocessed_shader;
Expand Down
5 changes: 0 additions & 5 deletions libshaderc_util/src/spirv_tools_wrapper.cc
Expand Up @@ -45,8 +45,6 @@ spv_target_env GetSpirvToolsTargetEnv(Compiler::TargetEnv env,
return SPV_ENV_OPENGL_4_5;
case Compiler::TargetEnv::OpenGLCompat: // Deprecated
return SPV_ENV_OPENGL_4_5;
case Compiler::TargetEnv::WebGPU:
return SPV_ENV_WEBGPU_0;
}
assert(false && "unexpected target environment or version");
return SPV_ENV_VULKAN_1_0;
Expand Down Expand Up @@ -145,9 +143,6 @@ bool SpirvToolsOptimize(Compiler::TargetEnv env,
case PassId::kSizePasses:
optimizer.RegisterSizePasses();
break;
case PassId::kVulkanToWebGPUPasses:
optimizer.RegisterVulkanToWebGPUPasses();
break;
case PassId::kNullPass:
// We actually don't need to do anything for null pass.
break;
Expand Down

0 comments on commit 73b54fa

Please sign in to comment.