Correctly reset mappedData in MapTwice buffer test

The test would previously fail because the mappedData pointer stayed
non-null which meant the spin-loop waiting for the map read callback
would exit immediately.

BUG=dawn:278
BUG=dawn:280

Change-Id: I53e5974571d7684b09903c599bb65c0d8efe4d8a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/13821
Reviewed-by: Yunchao He <yunchao.he@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/tests/end2end/BufferTests.cpp b/src/tests/end2end/BufferTests.cpp
index 7dd69a9..e75863e 100644
--- a/src/tests/end2end/BufferTests.cpp
+++ b/src/tests/end2end/BufferTests.cpp
@@ -38,6 +38,11 @@
           return mappedData;
       }
 
+      void UnmapBuffer(const wgpu::Buffer& buffer) {
+          buffer.Unmap();
+          mappedData = nullptr;
+      }
+
     private:
         const void* mappedData = nullptr;
 };
@@ -55,16 +60,11 @@
     const void* mappedData = MapReadAsyncAndWait(buffer);
     ASSERT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData));
 
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 }
 
 // Map, read and unmap twice. Test that both of these two iterations work.
 TEST_P(BufferMapReadTests, MapTwice) {
-    // TODO(http://crbug.com/dawn/278): the second read doesn't get updated data
-    // on D3D12, Metal and Vulkan.
-    // TODO(http://crbug.com/dawn/280): the second read doesn't get updated data
-    // on OpenGL wire.
-    DAWN_SKIP_TEST_IF(IsD3D12() || IsMetal() || IsVulkan() || UsesWire());
     wgpu::BufferDescriptor descriptor;
     descriptor.size = 4;
     descriptor.usage = wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
@@ -76,7 +76,7 @@
     const void* mappedData = MapReadAsyncAndWait(buffer);
     EXPECT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData));
 
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 
     myData = 0x05060708;
     buffer.SetSubData(0, sizeof(myData), &myData);
@@ -84,7 +84,7 @@
     const void* mappedData1 = MapReadAsyncAndWait(buffer);
     EXPECT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData1));
 
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 }
 
 // Test mapping a large buffer.
@@ -105,7 +105,7 @@
     const void* mappedData = MapReadAsyncAndWait(buffer);
     ASSERT_EQ(0, memcmp(mappedData, myData.data(), kDataSize * sizeof(uint32_t)));
 
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 }
 
 DAWN_INSTANTIATE_TEST(BufferMapReadTests, D3D12Backend, MetalBackend, OpenGLBackend, VulkanBackend);
@@ -136,6 +136,11 @@
           return resultPointer;
       }
 
+      void UnmapBuffer(const wgpu::Buffer& buffer) {
+          buffer.Unmap();
+          mappedData = nullptr;
+      }
+
     private:
         void* mappedData = nullptr;
 };
@@ -150,7 +155,7 @@
     uint32_t myData = 2934875;
     void* mappedData = MapWriteAsyncAndWait(buffer);
     memcpy(mappedData, &myData, sizeof(myData));
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
 }
@@ -165,14 +170,14 @@
     uint32_t myData = 2934875;
     void* mappedData = MapWriteAsyncAndWait(buffer);
     memcpy(mappedData, &myData, sizeof(myData));
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
 
     myData = 9999999;
     void* mappedData1 = MapWriteAsyncAndWait(buffer);
     memcpy(mappedData1, &myData, sizeof(myData));
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, buffer, 0);
 }
@@ -192,7 +197,7 @@
 
     void* mappedData = MapWriteAsyncAndWait(buffer);
     memcpy(mappedData, myData.data(), kDataSize * sizeof(uint32_t));
-    buffer.Unmap();
+    UnmapBuffer(buffer);
 
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), buffer, 0, kDataSize);
 }
@@ -216,7 +221,7 @@
 
         void* mappedData = MapWriteAsyncAndWait(buffer);
         memcpy(mappedData, myData.data(), kDataSize * sizeof(uint32_t));
-        buffer.Unmap();
+        UnmapBuffer(buffer);
 
         buffers.push_back(buffer);  // Destroy buffers upon return.
     }
@@ -373,6 +378,11 @@
           return mappedData;
       }
 
+      void UnmapBuffer(const wgpu::Buffer& buffer) {
+          buffer.Unmap();
+          mappedData = nullptr;
+      }
+
       void CheckResultStartsZeroed(const wgpu::CreateBufferMappedResult& result, uint64_t size) {
           ASSERT_EQ(result.dataLength, size);
           for (uint64_t i = 0; i < result.dataLength; ++i) {
@@ -455,7 +465,7 @@
     uint32_t myData = 230502;
     wgpu::CreateBufferMappedResult result = CreateBufferMappedWithData(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }
 
@@ -464,11 +474,11 @@
     uint32_t myData = 230502;
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedWithData(wgpu::BufferUsage::MapRead, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     const void* mappedData = MapReadAsyncAndWait(result.buffer);
     ASSERT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData));
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 }
 
 // Test that the simplest CreateBufferMapped works for non-mappable buffers.
@@ -476,7 +486,7 @@
     uint32_t myData = 4239;
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedWithData(wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }
@@ -491,7 +501,7 @@
 
     wgpu::CreateBufferMappedResult result = CreateBufferMappedWithData(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), result.buffer, 0, kDataSize);
 }
@@ -506,11 +516,11 @@
 
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedWithData(wgpu::BufferUsage::MapRead, myData);
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     const void* mappedData = MapReadAsyncAndWait(result.buffer);
     ASSERT_EQ(0, memcmp(mappedData, myData.data(), kDataSize * sizeof(uint32_t)));
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 }
 
 // Test CreateBufferMapped for a large non-mappable buffer
@@ -523,7 +533,7 @@
 
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedWithData(wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), result.buffer, 0, kDataSize);
 }
@@ -534,7 +544,7 @@
     static uint32_t myData2 = 1337;
     wgpu::CreateBufferMappedResult result = CreateBufferMappedWithData(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 
@@ -553,7 +563,7 @@
         WaitABit();
     }
 
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData2, result.buffer, 0);
 }
 
@@ -580,7 +590,7 @@
     }());
 
     // CreateBufferMapped is unaffected by the MapWrite error.
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }
 
@@ -589,7 +599,7 @@
     uint32_t myData = 230502;
     wgpu::CreateBufferMappedResult result = CreateBufferMappedAsyncWithDataAndWait(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }
 
@@ -598,11 +608,11 @@
     uint32_t myData = 230502;
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedAsyncWithDataAndWait(wgpu::BufferUsage::MapRead, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     const void* mappedData = MapReadAsyncAndWait(result.buffer);
     ASSERT_EQ(myData, *reinterpret_cast<const uint32_t*>(mappedData));
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 }
 
 // Test that the simplest CreateBufferMappedAsync works for non-mappable buffers.
@@ -610,7 +620,7 @@
     uint32_t myData = 4239;
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedAsyncWithDataAndWait(wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }
@@ -625,7 +635,7 @@
 
     wgpu::CreateBufferMappedResult result = CreateBufferMappedAsyncWithDataAndWait(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), result.buffer, 0, kDataSize);
 }
@@ -640,11 +650,11 @@
 
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedAsyncWithDataAndWait(wgpu::BufferUsage::MapRead, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     const void* mappedData = MapReadAsyncAndWait(result.buffer);
     ASSERT_EQ(0, memcmp(mappedData, myData.data(), kDataSize * sizeof(uint32_t)));
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 }
 
 // Test CreateBufferMappedAsync for a large non-mappable buffer
@@ -657,7 +667,7 @@
 
     wgpu::CreateBufferMappedResult result =
         CreateBufferMappedAsyncWithDataAndWait(wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_RANGE_EQ(myData.data(), result.buffer, 0, kDataSize);
 }
@@ -668,7 +678,7 @@
     static uint32_t myData2 = 1337;
     wgpu::CreateBufferMappedResult result = CreateBufferMappedAsyncWithDataAndWait(
         wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc, {myData});
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
 
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 
@@ -687,7 +697,7 @@
         WaitABit();
     }
 
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData2, result.buffer, 0);
 }
 
@@ -714,7 +724,7 @@
     }());
 
     // CreateBufferMappedAsync is unaffected by the MapWrite error.
-    result.buffer.Unmap();
+    UnmapBuffer(result.buffer);
     EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
 }