Fix Vulkan buffer barriers to use VK_WHOLE_SIZE

Buffers are padded to be at least 4 bytes. Dawn would
produce invalid barriers for buffers that were "zero"
bytes large. The size for the barrier must be either
non-zero or VK_WHOLE_SIZE. Since we always intend
to transition the entire buffer, simply use
VK_WHOLE_SIZE instead of GetSize() as the size.

Fixed: dawn:969
Change-Id: Ifed4e8f9164bafa3c44917074fcf214e72919c56
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/57940
Reviewed-by: Jiawei Shao <jiawei.shao@intel.com>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/vulkan/BufferVk.cpp b/src/dawn_native/vulkan/BufferVk.cpp
index 2763caf..0a5d1aa 100644
--- a/src/dawn_native/vulkan/BufferVk.cpp
+++ b/src/dawn_native/vulkan/BufferVk.cpp
@@ -243,7 +243,10 @@
         barrier->dstQueueFamilyIndex = 0;
         barrier->buffer = mHandle;
         barrier->offset = 0;
-        barrier->size = GetSize();
+        // Size must be non-zero or VK_WHOLE_SIZE. Use WHOLE_SIZE
+        // instead of GetSize() because the buffer allocation may
+        // be padded.
+        barrier->size = VK_WHOLE_SIZE;
 
         mLastUsage = usage;
 
diff --git a/src/dawn_native/vulkan/BufferVk.h b/src/dawn_native/vulkan/BufferVk.h
index 51c6993..e9a8951 100644
--- a/src/dawn_native/vulkan/BufferVk.h
+++ b/src/dawn_native/vulkan/BufferVk.h
@@ -52,6 +52,7 @@
       private:
         ~Buffer() override;
         using BufferBase::BufferBase;
+
         MaybeError Initialize(bool mappedAtCreation);
         void InitializeToZero(CommandRecordingContext* recordingContext);
         void ClearBuffer(CommandRecordingContext* recordingContext, uint32_t clearValue);
diff --git a/src/tests/end2end/BufferTests.cpp b/src/tests/end2end/BufferTests.cpp
index 12ac228..74289c7 100644
--- a/src/tests/end2end/BufferTests.cpp
+++ b/src/tests/end2end/BufferTests.cpp
@@ -518,6 +518,17 @@
     EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
 }
 
+// Regression test for crbug.com/dawn/969 where this test
+// produced invalid barriers.
+TEST_P(BufferMappingTests, MapWrite_ZeroSizedTwice) {
+    wgpu::Buffer buffer = CreateMapWriteBuffer(0);
+
+    MapAsyncAndWait(buffer, wgpu::MapMode::Write, 0, 0);
+    buffer.Unmap();
+
+    MapAsyncAndWait(buffer, wgpu::MapMode::Write, 0, 0);
+}
+
 DAWN_INSTANTIATE_TEST(BufferMappingTests,
                       D3D12Backend(),
                       MetalBackend(),