[Compat] Add validation for texture view array layer in bind group

Add validation of Compatibility mode restrictions #6
in compatibility-mode proposal.

Some cts tests need update to fit this restrictions.

Bug: 367440985
Change-Id: Ic9022d3782d3cdd7455de76724f2cb99dd1f753d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/209135
Auto-Submit: Shrek Shao <shrekshao@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Shrek Shao <shrekshao@google.com>
diff --git a/src/dawn/native/BindGroup.cpp b/src/dawn/native/BindGroup.cpp
index 0da292a..af334cd 100644
--- a/src/dawn/native/BindGroup.cpp
+++ b/src/dawn/native/BindGroup.cpp
@@ -147,6 +147,18 @@
     return {};
 }
 
+MaybeError ValidateCompatibilityModeTextureViewArrayLayer(DeviceBase* device,
+                                                          const TextureViewBase* view,
+                                                          const TextureBase* texture) {
+    DAWN_INVALID_IF(
+        view->GetBaseArrayLayer() != 0 || view->GetLayerCount() != texture->GetArrayLayers(),
+        "Texture binding uses %s with baseArrayLayer (%u) and arrayLayerCount (%u), but must use "
+        "all (%u) layers of %s in compatibility mode.",
+        view, view->GetBaseArrayLayer(), view->GetLayerCount(), texture->GetArrayLayers(), texture);
+
+    return {};
+}
+
 MaybeError ValidateSampledTextureBinding(DeviceBase* device,
                                          const BindGroupEntry& entry,
                                          const TextureBindingInfo& layout,
@@ -190,13 +202,16 @@
                     "Dimension (%s) of %s doesn't match the expected dimension (%s).",
                     entry.textureView->GetDimension(), entry.textureView, layout.viewDimension);
 
-    DAWN_INVALID_IF(
-        device->IsCompatibilityMode() && entry.textureView->GetDimension() !=
-                                             texture->GetCompatibilityTextureBindingViewDimension(),
-        "Dimension (%s) of %s must match textureBindingViewDimension (%s) of "
-        "%s in compatibility mode.",
-        entry.textureView->GetDimension(), entry.textureView,
-        texture->GetCompatibilityTextureBindingViewDimension(), texture);
+    if (device->IsCompatibilityMode()) {
+        DAWN_INVALID_IF(
+            view->GetDimension() != texture->GetCompatibilityTextureBindingViewDimension(),
+            "Dimension (%s) of %s must match textureBindingViewDimension (%s) of "
+            "%s in compatibility mode.",
+            view->GetDimension(), view, texture->GetCompatibilityTextureBindingViewDimension(),
+            texture);
+
+        DAWN_TRY(ValidateCompatibilityModeTextureViewArrayLayer(device, view, texture));
+    }
 
     return {};
 }
@@ -225,6 +240,10 @@
     DAWN_INVALID_IF(view->GetLevelCount() != 1, "mipLevelCount (%u) of %s expected to be 1.",
                     view->GetLevelCount(), view);
 
+    if (device->IsCompatibilityMode()) {
+        DAWN_TRY(ValidateCompatibilityModeTextureViewArrayLayer(device, view, texture));
+    }
+
     return {};
 }
 
diff --git a/webgpu-cts/compat-expectations.txt b/webgpu-cts/compat-expectations.txt
index ba4dc27..2da00b1 100644
--- a/webgpu-cts/compat-expectations.txt
+++ b/webgpu-cts/compat-expectations.txt
@@ -173,15 +173,14 @@
 crbug.com/dawn/2168 webgpu:api,validation,error_scope:simple:errorType="out-of-memory";errorFilter="validation" [ Failure ]
 crbug.com/dawn/2168 [ android arm ] webgpu:api,validation,error_scope:current_scope:errorFilter="validation";stackDepth=100000 [ Failure ]
 
-# textureStore() out_of_bounds_array tests crashing
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=0;arrayLevels=2;type="i32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=0;arrayLevels=2;type="u32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=0;arrayLevels=3;type="i32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=0;arrayLevels=3;type="u32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=1;arrayLevels=2;type="i32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=1;arrayLevels=2;type="u32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=1;arrayLevels=3;type="i32" [ Failure ]
-crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:baseLevel=1;arrayLevels=3;type="u32" [ Failure ]
+# CTS tests need update to fit compat mode restriction on texture view array layers or binding view dimension.
+crbug.com/dawn/367440985 webgpu:shader,execution,expression,call,builtin,textureStore:out_of_bounds_array:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_common:subresources,color_attachment_and_bind_group:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_common:subresources,depth_stencil_attachment_and_bind_group:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_common:subresources,depth_stencil_texture_in_bind_groups:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_common:subresources,multiple_bind_groups:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_misc:subresources,set_bind_group_on_same_index_color_texture:* [ Failure ]
+crbug.com/dawn/367440985 webgpu:api,validation,resource_usages,texture,in_render_misc:subresources,set_unused_bind_group:* [ Failure ]
 
 # bitcast ai_to_f32 failures; precision issue?
 crbug.com/354152178 [ intel-0x4680 ] webgpu:shader,execution,expression,call,builtin,bitcast:ai_to_f32:* [ Failure ]