Enable texture view usage for externalTexture binding by default

This CL enables using a texture view for an external binding behind a
toggle disabled by default.

Bug: 398752857

Change-Id: I0c9046203331cd6e049abfc94b858ec8e2bbb452
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/234014
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Fr <beaufort.francois@gmail.com>
diff --git a/src/dawn/native/BindGroup.cpp b/src/dawn/native/BindGroup.cpp
index 82660d1..0fb790c 100644
--- a/src/dawn/native/BindGroup.cpp
+++ b/src/dawn/native/BindGroup.cpp
@@ -510,8 +510,7 @@
                     layout->GetExternalTextureBindingExpansionMap()));
                 continue;
             }
-            // TODO(crbug.com/398752857): Make this controlled by a toggle before shipping.
-            if (device->IsToggleEnabled(Toggle::AllowUnsafeAPIs)) {
+            if (!device->IsToggleEnabled(Toggle::DisableTextureViewBindingUsedAsExternalTexture)) {
                 DAWN_TRY_CONTEXT(ValidateTextureViewBindingUsedAsExternalTexture(device, entry),
                                  "validating entries[%u] as a TextureView."
                                  "\nExpected entry layout: %s",
diff --git a/src/dawn/native/Toggles.cpp b/src/dawn/native/Toggles.cpp
index f8a6ff0..eea9cf1 100644
--- a/src/dawn/native/Toggles.cpp
+++ b/src/dawn/native/Toggles.cpp
@@ -169,6 +169,10 @@
     {Toggle::MetalEnableVertexPulling,
      {"metal_enable_vertex_pulling", "Uses vertex pulling to protect out-of-bounds reads on Metal",
       "https://crbug.com/dawn/480", ToggleStage::Device}},
+    {Toggle::DisableTextureViewBindingUsedAsExternalTexture,
+     {"disable_texture_view_binding_used_as_external_texture",
+      "Disable using a texture view for an externalTexture binding.", "http://crbug.com/398752857",
+      ToggleStage::Device}},
     {Toggle::AllowUnsafeAPIs,
      {"allow_unsafe_apis",
       "Suppresses validation errors on API entry points or parameter combinations that aren't "
diff --git a/src/dawn/native/Toggles.h b/src/dawn/native/Toggles.h
index d01ee76..bf93407 100644
--- a/src/dawn/native/Toggles.h
+++ b/src/dawn/native/Toggles.h
@@ -65,6 +65,7 @@
     UseDXC,
     DisableRobustness,
     MetalEnableVertexPulling,
+    DisableTextureViewBindingUsedAsExternalTexture,
     AllowUnsafeAPIs,
     FlushBeforeClientWaitSync,
     UseTempBufferInSmallFormatTextureToTextureCopyFromGreaterToLessMipLevel,
diff --git a/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp b/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
index 6bdee99..5e95c2b 100644
--- a/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
+++ b/src/dawn/tests/unittests/validation/ExternalTextureTests.cpp
@@ -617,16 +617,26 @@
             device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
         ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, bgl, {{0, externalTexture}}));
     }
+
+    // Bind group creation should fail when a sampler is present in the
+    // corresponding slot of the bind group layout.
+    {
+        wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
+            device, {{0, wgpu::ShaderStage::Fragment, wgpu::BufferBindingType::Uniform}});
+        ASSERT_DEVICE_ERROR(utils::MakeBindGroup(device, bgl, {{0, device.CreateSampler()}}));
+    }
 }
 
-class ExternalTextureTestSafe : public ExternalTextureTest {
+class ExternalTextureTestEnabledToggle : public ExternalTextureTest {
   protected:
-    bool AllowUnsafeAPIs() override { return false; }
+    std::vector<const char*> GetEnabledToggles() override {
+        return {"disable_texture_view_binding_used_as_external_texture"};
+    }
 };
 
 // Regression test for crbug.com/1343099 where BindGroup validation let other binding types be used
 // for external texture bindings.
-TEST_F(ExternalTextureTestSafe, TextureViewBindingDoesntMatch) {
+TEST_F(ExternalTextureTestEnabledToggle, TextureViewBindingDoesntMatch) {
     wgpu::BindGroupLayout bgl = utils::MakeBindGroupLayout(
         device, {{0, wgpu::ShaderStage::Fragment, &utils::kExternalTextureBindingLayout}});