Fix a bug for multi-writes in ResourceUsageTrackingTests.cpp

It is valid to have race condition for multiple writes on the same
resource in some situations in render pass. These situations are:
1) multple storage buffer bindings on the same buffer,
2) multiple writeonly storage texture bindings on the same texture.

This change fixed a bug in tests and added a new test, in order to
make sure that validation code in Dawn allows this kind race condition.

Bug: dawn:407

Change-Id: I42332418bea5b6e608f6730e42f60c1c12b0b025
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/21361
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Yunchao He <yunchao.he@intel.com>
diff --git a/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp b/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
index e24af1f..33727fe 100644
--- a/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
+++ b/src/tests/unittests/validation/ResourceUsageTrackingTests.cpp
@@ -183,8 +183,7 @@
         }
     }
 
-    // Test that it is invalid to use the same buffer as multiple writable usages in the same
-    // render pass. It is invalid in the same dispatch in compute pass.
+    // Test using multiple writable usages on the same buffer in a single pass/dispatch
     TEST_F(ResourceUsageTrackingTest, BufferWithMultipleWriteUsage) {
         // Create buffer and bind group
         wgpu::Buffer buffer = CreateBuffer(512, wgpu::BufferUsage::Storage);
@@ -199,14 +198,13 @@
 
         // test render pass
         {
-            // It is invalid to use the buffer as multiple writeable usages in render pass
+            // It is valid to use multiple storage usages on the same buffer in render pass
             wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
             DummyRenderPass dummyRenderPass(device);
             wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&dummyRenderPass);
-            pass.SetIndexBuffer(buffer);
             pass.SetBindGroup(0, bg);
             pass.EndPass();
-            ASSERT_DEVICE_ERROR(encoder.Finish());
+            encoder.Finish();
         }
 
         // test compute pass
@@ -967,8 +965,7 @@
         }
     }
 
-    // Test that it is invalid to use the same texture as multiple writable usages in the same
-    // render pass. It is invalid in the same dispatch in compute pass.
+    // Test using multiple writable usages on the same texture in a single pass/dispatch
     TEST_F(ResourceUsageTrackingTest, TextureWithMultipleWriteUsage) {
         // Test render pass
         {
@@ -986,16 +983,31 @@
                   kFormat}});
             wgpu::BindGroup bg = utils::MakeBindGroup(device, bgl, {{0, view}});
 
-            // Create a bind group to use the texture as render target
-            utils::ComboRenderPassDescriptor renderPass({view});
-
             // It is invalid to use the texture as both writeonly storage and render target in
             // the same pass
-            wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
-            wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass);
-            pass.SetBindGroup(0, bg);
-            pass.EndPass();
-            ASSERT_DEVICE_ERROR(encoder.Finish());
+            {
+                utils::ComboRenderPassDescriptor renderPass({view});
+
+                wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+                wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPass);
+                pass.SetBindGroup(0, bg);
+                pass.EndPass();
+                ASSERT_DEVICE_ERROR(encoder.Finish());
+            }
+
+            // It is valid to use multiple writeonly storage usages on the same texture in render
+            // pass
+            {
+                wgpu::BindGroup bg1 = utils::MakeBindGroup(device, bgl, {{0, view}});
+
+                wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
+                DummyRenderPass dummyRenderPass(device);
+                wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&dummyRenderPass);
+                pass.SetBindGroup(0, bg);
+                pass.SetBindGroup(1, bg1);
+                pass.EndPass();
+                encoder.Finish();
+            }
         }
 
         // Test compute pass