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>
This commit is contained in:
Corentin Wallez 2019-11-21 12:49:30 +00:00 committed by Commit Bot service account
parent 4d15609d26
commit 0d4a7b0ba5
1 changed files with 46 additions and 36 deletions

View File

@ -38,6 +38,11 @@ class BufferMapReadTests : public DawnTest {
return mappedData;
}
void UnmapBuffer(const wgpu::Buffer& buffer) {
buffer.Unmap();
mappedData = nullptr;
}
private:
const void* mappedData = nullptr;
};
@ -55,16 +60,11 @@ TEST_P(BufferMapReadTests, SmallReadAtZero) {
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 @@ TEST_P(BufferMapReadTests, MapTwice) {
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 @@ TEST_P(BufferMapReadTests, MapTwice) {
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 @@ TEST_P(BufferMapReadTests, LargeRead) {
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 @@ class BufferMapWriteTests : public DawnTest {
return resultPointer;
}
void UnmapBuffer(const wgpu::Buffer& buffer) {
buffer.Unmap();
mappedData = nullptr;
}
private:
void* mappedData = nullptr;
};
@ -150,7 +155,7 @@ TEST_P(BufferMapWriteTests, SmallWriteAtZero) {
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 @@ TEST_P(BufferMapWriteTests, MapTwice) {
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 @@ TEST_P(BufferMapWriteTests, LargeWrite) {
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 @@ TEST_P(BufferMapWriteTests, ManyWrites) {
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 @@ class CreateBufferMappedTests : public DawnTest {
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 @@ TEST_P(CreateBufferMappedTests, MapWriteUsageSmall) {
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 @@ TEST_P(CreateBufferMappedTests, MapReadUsageSmall) {
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 @@ TEST_P(CreateBufferMappedTests, NonMappableUsageSmall) {
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 @@ TEST_P(CreateBufferMappedTests, MapWriteUsageLarge) {
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 @@ TEST_P(CreateBufferMappedTests, MapReadUsageLarge) {
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 @@ TEST_P(CreateBufferMappedTests, NonMappableUsageLarge) {
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 @@ TEST_P(CreateBufferMappedTests, CreateThenMapSuccess) {
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 @@ TEST_P(CreateBufferMappedTests, CreateThenMapSuccess) {
WaitABit();
}
result.buffer.Unmap();
UnmapBuffer(result.buffer);
EXPECT_BUFFER_U32_EQ(myData2, result.buffer, 0);
}
@ -580,7 +590,7 @@ TEST_P(CreateBufferMappedTests, CreateThenMapBeforeUnmapFailure) {
}());
// 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 @@ TEST_P(CreateBufferMappedTests, MapWriteUsageSmallAsync) {
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 @@ TEST_P(CreateBufferMappedTests, MapReadUsageSmallAsync) {
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 @@ TEST_P(CreateBufferMappedTests, NonMappableUsageSmallAsync) {
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 @@ TEST_P(CreateBufferMappedTests, MapWriteUsageLargeAsync) {
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 @@ TEST_P(CreateBufferMappedTests, MapReadUsageLargeAsync) {
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 @@ TEST_P(CreateBufferMappedTests, NonMappableUsageLargeAsync) {
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 @@ TEST_P(CreateBufferMappedTests, CreateThenMapSuccessAsync) {
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 @@ TEST_P(CreateBufferMappedTests, CreateThenMapSuccessAsync) {
WaitABit();
}
result.buffer.Unmap();
UnmapBuffer(result.buffer);
EXPECT_BUFFER_U32_EQ(myData2, result.buffer, 0);
}
@ -714,7 +724,7 @@ TEST_P(CreateBufferMappedTests, CreateThenMapBeforeUnmapFailureAsync) {
}());
// CreateBufferMappedAsync is unaffected by the MapWrite error.
result.buffer.Unmap();
UnmapBuffer(result.buffer);
EXPECT_BUFFER_U32_EQ(myData, result.buffer, 0);
}