[vulkan] Add toggle to control SPIR-V validation

It is enabled by default whenever the build flag is enabled.

Once Graphite has been updated to disable it, we can remove the build
flag guard to turn it on in Chrome for all platforms.

Fixed: 473526182
Change-Id: I457b992655fcfc9dddb050939568f81d072b08d0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/284857
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index c70f1e3..0f862d3 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -730,6 +730,9 @@
      {"vulkan_use_dynamic_rendering",
       "Makes use of VK_KHR_dynamic_rendering to implement WebGPU RenderPass.",
       "https://crbug.com/dawn/463893794", ToggleStage::Device}},
+    {Toggle::EnableSpirvValidation,
+     {"enable_spirv_validation", "Enable validation of SPIR-V generated by Tint.",
+      "https://crbug.com/473526415", ToggleStage::Device}},
     {Toggle::WaitIsThreadSafe,
      {"wait_is_thread_safe",
       "WaitFor* functions are thread-safe and can be called without the device-lock if implicit "
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index a2e27da..52675fa 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -175,6 +175,7 @@
     VulkanEnableF16OnNvidia,
     EnableRenderDocProcessInjection,
     VulkanUseDynamicRendering,
+    EnableSpirvValidation,
 
     // Once all backends have been updated to be thread safe for waiting, we can remove this toggle.
     WaitIsThreadSafe,
diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
index e0da269..fc198b2 100644
--- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
+++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp
@@ -1172,6 +1172,10 @@
         // when dynamic rendering is enabled.
         deviceToggles->Default(Toggle::VulkanUseDynamicRendering, false);
     }
+
+    // Enable validation of generated SPIR-V by default.
+    // Graphite and other native clients may turn this off.
+    deviceToggles->Default(Toggle::EnableSpirvValidation, true);
 }
 
 ResultOrError<Ref<DeviceBase>> PhysicalDevice::CreateDeviceImpl(
diff --git a/src/dawn/native/vulkan/ShaderModuleVk.cpp b/src/dawn/native/vulkan/ShaderModuleVk.cpp
index a97f159..7b85ed0 100644
--- a/src/dawn/native/vulkan/ShaderModuleVk.cpp
+++ b/src/dawn/native/vulkan/ShaderModuleVk.cpp
@@ -328,7 +328,7 @@
         "Vulkan.CompileShaderToSPIRV");
 
 #ifdef DAWN_ENABLE_SPIRV_VALIDATION
-    {
+    if (GetDevice()->IsToggleEnabled(Toggle::EnableSpirvValidation)) {
         SCOPED_DAWN_HISTOGRAM_TIMER_MICROS(GetDevice()->GetPlatform(), "Vulkan.ValidateSpirv");
 
         // Validate and if required dump the compiled SPIR-V code.