mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 08:27:05 +00:00
Remove MapRead/WriteAsync and CreateBufferMapped
Bug: dawn:445 Change-Id: I0b0755b6bb754d1fff99aa59b08362f89950e300 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/26301 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Austin Eng <enga@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
d720785616
commit
f7123d7463
@@ -20,44 +20,6 @@
|
||||
|
||||
using namespace testing;
|
||||
|
||||
class MockBufferMapReadCallback {
|
||||
public:
|
||||
MOCK_METHOD(void,
|
||||
Call,
|
||||
(WGPUBufferMapAsyncStatus status,
|
||||
const uint32_t* ptr,
|
||||
uint64_t dataLength,
|
||||
void* userdata));
|
||||
};
|
||||
|
||||
static std::unique_ptr<MockBufferMapReadCallback> mockBufferMapReadCallback;
|
||||
static void ToMockBufferMapReadCallback(WGPUBufferMapAsyncStatus status,
|
||||
const void* ptr,
|
||||
uint64_t dataLength,
|
||||
void* userdata) {
|
||||
// Assume the data is uint32_t to make writing matchers easier
|
||||
mockBufferMapReadCallback->Call(status, reinterpret_cast<const uint32_t*>(ptr), dataLength,
|
||||
userdata);
|
||||
}
|
||||
|
||||
class MockBufferMapWriteCallback {
|
||||
public:
|
||||
MOCK_METHOD(
|
||||
void,
|
||||
Call,
|
||||
(WGPUBufferMapAsyncStatus status, uint32_t* ptr, uint64_t dataLength, void* userdata));
|
||||
};
|
||||
|
||||
static std::unique_ptr<MockBufferMapWriteCallback> mockBufferMapWriteCallback;
|
||||
static void ToMockBufferMapWriteCallback(WGPUBufferMapAsyncStatus status,
|
||||
void* ptr,
|
||||
uint64_t dataLength,
|
||||
void* userdata) {
|
||||
// Assume the data is uint32_t to make writing matchers easier
|
||||
mockBufferMapWriteCallback->Call(status, reinterpret_cast<uint32_t*>(ptr), dataLength,
|
||||
userdata);
|
||||
}
|
||||
|
||||
class MockBufferMapAsyncCallback {
|
||||
public:
|
||||
MOCK_METHOD(void, Call, (WGPUBufferMapAsyncStatus status, void* userdata));
|
||||
@@ -86,14 +48,6 @@ class BufferValidationTest : public ValidationTest {
|
||||
return device.CreateBuffer(&descriptor);
|
||||
}
|
||||
|
||||
wgpu::CreateBufferMappedResult CreateBufferMapped(uint64_t size, wgpu::BufferUsage usage) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = size;
|
||||
descriptor.usage = usage;
|
||||
|
||||
return device.CreateBufferMapped(&descriptor);
|
||||
}
|
||||
|
||||
wgpu::Buffer BufferMappedAtCreation(uint64_t size, wgpu::BufferUsage usage) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = size;
|
||||
@@ -116,16 +70,12 @@ class BufferValidationTest : public ValidationTest {
|
||||
void SetUp() override {
|
||||
ValidationTest::SetUp();
|
||||
|
||||
mockBufferMapReadCallback = std::make_unique<MockBufferMapReadCallback>();
|
||||
mockBufferMapWriteCallback = std::make_unique<MockBufferMapWriteCallback>();
|
||||
mockBufferMapAsyncCallback = std::make_unique<MockBufferMapAsyncCallback>();
|
||||
queue = device.GetDefaultQueue();
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
// Delete mocks so that expectations are checked
|
||||
mockBufferMapReadCallback = nullptr;
|
||||
mockBufferMapWriteCallback = nullptr;
|
||||
mockBufferMapAsyncCallback = nullptr;
|
||||
|
||||
ValidationTest::TearDown();
|
||||
@@ -488,50 +438,6 @@ TEST_F(BufferValidationTest, MapAsync_DestroyCalledInCallback) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test the success case for mapping buffer for reading
|
||||
TEST_F(BufferValidationTest, MapReadAsyncSuccess) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
|
||||
buf.Unmap();
|
||||
}
|
||||
|
||||
// Test the success case for mapping buffer for writing
|
||||
TEST_F(BufferValidationTest, MapWriteAsyncSuccess) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
|
||||
buf.Unmap();
|
||||
}
|
||||
|
||||
// Test the success case for CreateBufferMapped
|
||||
TEST_F(BufferValidationTest, CreateBufferMappedSuccess) {
|
||||
wgpu::CreateBufferMappedResult result = CreateBufferMapped(4, wgpu::BufferUsage::MapWrite);
|
||||
ASSERT_NE(result.data, nullptr);
|
||||
ASSERT_EQ(result.dataLength, 4u);
|
||||
result.buffer.Unmap();
|
||||
}
|
||||
|
||||
// Test the success case for non-mappable CreateBufferMapped
|
||||
TEST_F(BufferValidationTest, NonMappableCreateBufferMappedSuccess) {
|
||||
wgpu::CreateBufferMappedResult result = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc);
|
||||
ASSERT_NE(result.data, nullptr);
|
||||
ASSERT_EQ(result.dataLength, 4u);
|
||||
result.buffer.Unmap();
|
||||
}
|
||||
|
||||
// Test the success case for mappedAtCreation
|
||||
TEST_F(BufferValidationTest, MappedAtCreationSuccess) {
|
||||
BufferMappedAtCreation(4, wgpu::BufferUsage::MapWrite);
|
||||
@@ -547,228 +453,6 @@ TEST_F(BufferValidationTest, MappedAtCreationSizeAlignment) {
|
||||
ASSERT_DEVICE_ERROR(BufferMappedAtCreation(2, wgpu::BufferUsage::MapWrite));
|
||||
}
|
||||
|
||||
// Test map reading a buffer with wrong current usage
|
||||
TEST_F(BufferValidationTest, MapReadWrongUsage) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::CopyDst;
|
||||
|
||||
wgpu::Buffer buf = device.CreateBuffer(&descriptor);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(WGPUBufferMapAsyncStatus_Error, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr));
|
||||
}
|
||||
|
||||
// Test map writing a buffer with wrong current usage
|
||||
TEST_F(BufferValidationTest, MapWriteWrongUsage) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::CopySrc;
|
||||
|
||||
wgpu::Buffer buf = device.CreateBuffer(&descriptor);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback, Call(WGPUBufferMapAsyncStatus_Error, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
}
|
||||
|
||||
// Test map reading a buffer that is already mapped
|
||||
TEST_F(BufferValidationTest, MapReadAlreadyMapped) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, this + 0);
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, this + 0))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Error, nullptr, 0u, this + 1))
|
||||
.Times(1);
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, this + 1));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test map writing a buffer that is already mapped
|
||||
TEST_F(BufferValidationTest, MapWriteAlreadyMapped) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, this + 0);
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, this + 0))
|
||||
.Times(1);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Error, nullptr, 0u, this + 1))
|
||||
.Times(1);
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, this + 1));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
// TODO(cwallez@chromium.org) Test a MapWrite and already MapRead and vice-versa
|
||||
|
||||
// Test unmapping before having the result gives UNKNOWN - for reading
|
||||
TEST_F(BufferValidationTest, MapReadUnmapBeforeResult) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
buf.Unmap();
|
||||
|
||||
// The callback shouldn't be called again.
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test unmapping before having the result gives UNKNOWN - for writing
|
||||
TEST_F(BufferValidationTest, MapWriteUnmapBeforeResult) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback, Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
buf.Unmap();
|
||||
|
||||
// The callback shouldn't be called again.
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test destroying the buffer before having the result gives UNKNOWN - for reading
|
||||
// TODO(cwallez@chromium.org) currently this doesn't work because the buffer doesn't know
|
||||
// when its external ref count reaches 0.
|
||||
TEST_F(BufferValidationTest, DISABLED_MapReadDestroyBeforeResult) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
}
|
||||
|
||||
// The callback shouldn't be called again.
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test destroying the buffer before having the result gives UNKNOWN - for writing
|
||||
// TODO(cwallez@chromium.org) currently this doesn't work because the buffer doesn't know
|
||||
// when its external ref count reaches 0.
|
||||
TEST_F(BufferValidationTest, DISABLED_MapWriteDestroyBeforeResult) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, _))
|
||||
.Times(1);
|
||||
}
|
||||
|
||||
// The callback shouldn't be called again.
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// When a MapRead is cancelled with Unmap it might still be in flight, test doing a new request
|
||||
// works as expected and we don't get the cancelled request's data.
|
||||
TEST_F(BufferValidationTest, MapReadUnmapBeforeResultThenMapAgain) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, this + 0);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, this + 0))
|
||||
.Times(1);
|
||||
buf.Unmap();
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, this + 1);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, this + 1))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
// TODO(cwallez@chromium.org) Test a MapWrite and already MapRead and vice-versa
|
||||
|
||||
// When a MapWrite is cancelled with Unmap it might still be in flight, test doing a new request
|
||||
// works as expected and we don't get the cancelled request's data.
|
||||
TEST_F(BufferValidationTest, MapWriteUnmapBeforeResultThenMapAgain) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, this + 0);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0u, this + 0))
|
||||
.Times(1);
|
||||
buf.Unmap();
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, this + 1);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, this + 1))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test that the MapReadCallback isn't fired twice when unmap() is called inside the callback
|
||||
TEST_F(BufferValidationTest, UnmapInsideMapReadCallback) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { buf.Unmap(); }));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test that the MapWriteCallback isn't fired twice when unmap() is called inside the callback
|
||||
TEST_F(BufferValidationTest, UnmapInsideMapWriteCallback) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { buf.Unmap(); }));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test that the MapReadCallback isn't fired twice the buffer external refcount reaches 0 in the
|
||||
// callback
|
||||
TEST_F(BufferValidationTest, DestroyInsideMapReadCallback) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { buf = wgpu::Buffer(); }));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test that the MapWriteCallback isn't fired twice the buffer external refcount reaches 0 in the
|
||||
// callback
|
||||
TEST_F(BufferValidationTest, DestroyInsideMapWriteCallback) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { buf = wgpu::Buffer(); }));
|
||||
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
|
||||
// Test that it is valid to destroy an unmapped buffer
|
||||
TEST_F(BufferValidationTest, DestroyUnmappedBuffer) {
|
||||
{
|
||||
@@ -781,44 +465,6 @@ TEST_F(BufferValidationTest, DestroyUnmappedBuffer) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is valid to destroy a mapped buffer
|
||||
TEST_F(BufferValidationTest, DestroyMappedBuffer) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
buf.Destroy();
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
buf.Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
// Test that destroying a buffer implicitly unmaps it
|
||||
TEST_F(BufferValidationTest, DestroyMappedBufferCausesImplicitUnmap) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, this + 0);
|
||||
// Buffer is destroyed. Callback should be called with UNKNOWN status
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0, this + 0))
|
||||
.Times(1);
|
||||
buf.Destroy();
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, this + 1);
|
||||
// Buffer is destroyed. Callback should be called with UNKNOWN status
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Unknown, nullptr, 0, this + 1))
|
||||
.Times(1);
|
||||
buf.Destroy();
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is valid to Destroy a destroyed buffer
|
||||
TEST_F(BufferValidationTest, DestroyDestroyedBuffer) {
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
@@ -840,64 +486,6 @@ TEST_F(BufferValidationTest, UnmapDestroyedBuffer) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is invalid to map a destroyed buffer
|
||||
TEST_F(BufferValidationTest, MapDestroyedBuffer) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
buf.Destroy();
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr));
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.Destroy();
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
}
|
||||
}
|
||||
|
||||
// Test that is is invalid to Map a mapped buffer
|
||||
TEST_F(BufferValidationTest, MapMappedBuffer) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that is is invalid to Map a CreateBufferMapped buffer
|
||||
TEST_F(BufferValidationTest, MapCreateBufferMappedBuffer) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::MapRead).buffer;
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::MapWrite).buffer;
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that is is invalid to Map a buffer mapped at creation.
|
||||
TEST_F(BufferValidationTest, MapBufferMappedAtCreation) {
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::MapRead);
|
||||
ASSERT_DEVICE_ERROR(buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::MapWrite);
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is valid to submit a buffer in a queue with a map usage if it is unmapped
|
||||
TEST_F(BufferValidationTest, SubmitBufferWithMapUsage) {
|
||||
wgpu::BufferDescriptor descriptorA;
|
||||
@@ -950,50 +538,6 @@ TEST_F(BufferValidationTest, SubmitMappedBuffer) {
|
||||
ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer bufA = device.CreateBuffer(&descriptorA);
|
||||
wgpu::Buffer bufB = device.CreateBuffer(&descriptorB);
|
||||
|
||||
bufA.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
encoder.CopyBufferToBuffer(bufA, 0, bufB, 0, 4);
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer bufA = device.CreateBuffer(&descriptorA);
|
||||
wgpu::Buffer bufB = device.CreateBuffer(&descriptorB);
|
||||
|
||||
bufB.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
encoder.CopyBufferToBuffer(bufA, 0, bufB, 0, 4);
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer bufA = device.CreateBufferMapped(&descriptorA).buffer;
|
||||
wgpu::Buffer bufB = device.CreateBuffer(&descriptorB);
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
encoder.CopyBufferToBuffer(bufA, 0, bufB, 0, 4);
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer bufA = device.CreateBuffer(&descriptorA);
|
||||
wgpu::Buffer bufB = device.CreateBufferMapped(&descriptorB).buffer;
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
encoder.CopyBufferToBuffer(bufA, 0, bufB, 0, 4);
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
ASSERT_DEVICE_ERROR(queue.Submit(1, &commands));
|
||||
WaitForAllOperations(device);
|
||||
}
|
||||
{
|
||||
wgpu::BufferDescriptor mappedBufferDesc = descriptorA;
|
||||
mappedBufferDesc.mappedAtCreation = true;
|
||||
@@ -1052,24 +596,6 @@ TEST_F(BufferValidationTest, UnmapWithoutMapUsage) {
|
||||
|
||||
// Test that it is valid to call Unmap on a buffer that is not mapped
|
||||
TEST_F(BufferValidationTest, UnmapUnmappedBuffer) {
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
// Buffer starts unmapped. Unmap should succeed.
|
||||
buf.Unmap();
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
buf.Unmap();
|
||||
// Unmapping twice should succeed
|
||||
buf.Unmap();
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
// Buffer starts unmapped. Unmap should succeed.
|
||||
buf.Unmap();
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
// Unmapping twice should succeed
|
||||
buf.Unmap();
|
||||
buf.Unmap();
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
// Buffer starts unmapped. Unmap should succeed.
|
||||
@@ -1103,15 +629,6 @@ TEST_F(BufferValidationTest, GetMappedRange_OnUnmappedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after CreateBufferMapped case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc).buffer;
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
@@ -1121,34 +638,6 @@ TEST_F(BufferValidationTest, GetMappedRange_OnUnmappedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after MapWriteAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
// Unmapped after MapAsync read case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
@@ -1191,15 +680,6 @@ TEST_F(BufferValidationTest, GetMappedRange_OnDestroyedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after CreateBufferMapped case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc).buffer;
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
@@ -1209,34 +689,6 @@ TEST_F(BufferValidationTest, GetMappedRange_OnDestroyedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after MapWriteAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
WaitForAllOperations(device);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
// Destroyed after MapAsync read case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
@@ -1278,14 +730,6 @@ TEST_F(BufferValidationTest, GetMappedRange_NonConstOnMappedForReading) {
|
||||
|
||||
// Test valid cases to call GetMappedRange on a buffer.
|
||||
TEST_F(BufferValidationTest, GetMappedRange_ValidBufferStateCases) {
|
||||
// GetMappedRange after CreateBufferMapped case.
|
||||
{
|
||||
wgpu::CreateBufferMappedResult result = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc);
|
||||
ASSERT_NE(result.buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.buffer.GetMappedRange());
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.data);
|
||||
}
|
||||
|
||||
// GetMappedRange after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buffer = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
@@ -1323,41 +767,6 @@ TEST_F(BufferValidationTest, GetMappedRange_OnErrorBuffer) {
|
||||
|
||||
uint64_t kStupidLarge = uint64_t(1) << uint64_t(63);
|
||||
|
||||
// GetMappedRange after CreateBufferMapped a zero-sized buffer returns a non-nullptr.
|
||||
// This is to check we don't do a malloc(0).
|
||||
{
|
||||
wgpu::CreateBufferMappedResult result;
|
||||
ASSERT_DEVICE_ERROR(result = CreateBufferMapped(
|
||||
0, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_NE(result.buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.buffer.GetMappedRange());
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.data);
|
||||
}
|
||||
|
||||
// GetMappedRange after CreateBufferMapped non-OOM returns a non-nullptr.
|
||||
{
|
||||
wgpu::CreateBufferMappedResult result;
|
||||
ASSERT_DEVICE_ERROR(result = CreateBufferMapped(
|
||||
4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_NE(result.buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.buffer.GetMappedRange());
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.data);
|
||||
}
|
||||
|
||||
// GetMappedRange after CreateBufferMapped OOM case returns nullptr.
|
||||
{
|
||||
wgpu::CreateBufferMappedResult result;
|
||||
ASSERT_DEVICE_ERROR(result =
|
||||
CreateBufferMapped(kStupidLarge, wgpu::BufferUsage::Storage |
|
||||
wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.buffer.GetMappedRange());
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.data);
|
||||
}
|
||||
|
||||
// GetMappedRange after mappedAtCreation a zero-sized buffer returns a non-nullptr.
|
||||
// This is to check we don't do a malloc(0).
|
||||
{
|
||||
|
||||
@@ -165,17 +165,6 @@ namespace {
|
||||
|
||||
// Test WriteBuffer with mapped buffer
|
||||
TEST_F(QueueWriteBufferValidationTest, MappedBuffer) {
|
||||
// CreateBufferMapped
|
||||
{
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::CopyDst;
|
||||
wgpu::CreateBufferMappedResult result = device.CreateBufferMapped(&descriptor);
|
||||
|
||||
uint32_t value = 0;
|
||||
ASSERT_DEVICE_ERROR(queue.WriteBuffer(result.buffer, 0, &value, sizeof(value)));
|
||||
}
|
||||
|
||||
// mappedAtCreation
|
||||
{
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
|
||||
Reference in New Issue
Block a user