mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-16 08:27:05 +00:00
Implement GPUBufferDescriptor.mappedAtCreation.
This CL: - Adds mappedAtCreation to dawn.json - Changes dawn_native to implement CreateBufferMapped in terms of mappedAtCreation. - Duplicates all the CreateBufferMappedTests to mappedAtCreation tests (both validation and end2end). - Implements dawn_wire's mappedAtCreation in terms of CreateBufferMapped. The reversal in dawn_wire will be done in a follow-up CL. Bug: dawn:445 Change-Id: I70b9fa729b1402524a6b993c3f288987eb65c6c4 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/24083 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
cf77d75573
commit
b2ea1915d4
@@ -83,6 +83,15 @@ class BufferValidationTest : public ValidationTest {
|
||||
return device.CreateBufferMapped(&descriptor);
|
||||
}
|
||||
|
||||
wgpu::Buffer BufferMappedAtCreation(uint64_t size, wgpu::BufferUsage usage) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = size;
|
||||
descriptor.usage = usage;
|
||||
descriptor.mappedAtCreation = true;
|
||||
|
||||
return device.CreateBuffer(&descriptor);
|
||||
}
|
||||
|
||||
wgpu::Queue queue;
|
||||
|
||||
private:
|
||||
@@ -198,6 +207,21 @@ TEST_F(BufferValidationTest, NonMappableCreateBufferMappedSuccess) {
|
||||
result.buffer.Unmap();
|
||||
}
|
||||
|
||||
// Test the success case for mappedAtCreation
|
||||
TEST_F(BufferValidationTest, MappedAtCreationSuccess) {
|
||||
BufferMappedAtCreation(4, wgpu::BufferUsage::MapWrite);
|
||||
}
|
||||
|
||||
// Test the success case for mappedAtCreation for a non-mappable usage
|
||||
TEST_F(BufferValidationTest, NonMappableMappedAtCreationSuccess) {
|
||||
BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
}
|
||||
|
||||
// Test there is an error when mappedAtCreation is set but the size isn't aligned to 4.
|
||||
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;
|
||||
@@ -537,6 +561,20 @@ TEST_F(BufferValidationTest, MapCreateBufferMappedBuffer) {
|
||||
}
|
||||
}
|
||||
|
||||
// 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));
|
||||
queue.Submit(0, nullptr);
|
||||
}
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::MapWrite);
|
||||
ASSERT_DEVICE_ERROR(buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr));
|
||||
queue.Submit(0, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// 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;
|
||||
@@ -603,6 +641,30 @@ TEST_F(BufferValidationTest, SubmitMappedBuffer) {
|
||||
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));
|
||||
queue.Submit(0, nullptr);
|
||||
}
|
||||
{
|
||||
wgpu::BufferDescriptor mappedBufferDesc = descriptorA;
|
||||
mappedBufferDesc.mappedAtCreation = true;
|
||||
wgpu::Buffer bufA = device.CreateBuffer(&mappedBufferDesc);
|
||||
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));
|
||||
queue.Submit(0, nullptr);
|
||||
}
|
||||
{
|
||||
wgpu::BufferDescriptor mappedBufferDesc = descriptorB;
|
||||
mappedBufferDesc.mappedAtCreation = true;
|
||||
wgpu::Buffer bufA = device.CreateBuffer(&descriptorA);
|
||||
wgpu::Buffer bufB = device.CreateBuffer(&mappedBufferDesc);
|
||||
|
||||
wgpu::CommandEncoder encoder = device.CreateCommandEncoder();
|
||||
encoder.CopyBufferToBuffer(bufA, 0, bufB, 0, 4);
|
||||
wgpu::CommandBuffer commands = encoder.Finish();
|
||||
@@ -685,6 +747,15 @@ TEST_F(BufferValidationTest, GetMappedRangeOnUnmappedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Unmapped after MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
@@ -738,6 +809,15 @@ TEST_F(BufferValidationTest, GetMappedRangeOnDestroyedBuffer) {
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buf = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_EQ(nullptr, buf.GetMappedRange());
|
||||
ASSERT_EQ(nullptr, buf.GetConstMappedRange());
|
||||
}
|
||||
|
||||
// Destroyed after MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
@@ -791,6 +871,13 @@ TEST_F(BufferValidationTest, GetMappedRangeValidCases) {
|
||||
ASSERT_EQ(result.buffer.GetConstMappedRange(), result.data);
|
||||
}
|
||||
|
||||
// GetMappedRange after mappedAtCreation case.
|
||||
{
|
||||
wgpu::Buffer buffer = BufferMappedAtCreation(4, wgpu::BufferUsage::CopySrc);
|
||||
ASSERT_NE(buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buffer.GetConstMappedRange(), buffer.GetMappedRange());
|
||||
}
|
||||
|
||||
// GetMappedRange after MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
@@ -827,13 +914,25 @@ TEST_F(BufferValidationTest, GetMappedRangeValidCases) {
|
||||
}
|
||||
|
||||
// Test valid cases to call GetMappedRange on an error buffer.
|
||||
// TODO(cwallez@chromium.org): enable after CreateBufferMapped is implemented in terms of
|
||||
// mappedAtCreation.
|
||||
TEST_F(BufferValidationTest, DISABLED_GetMappedRangeOnErrorBuffer) {
|
||||
TEST_F(BufferValidationTest, GetMappedRangeOnErrorBuffer) {
|
||||
wgpu::BufferDescriptor desc;
|
||||
desc.size = 4;
|
||||
desc.usage = wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead;
|
||||
|
||||
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;
|
||||
@@ -848,11 +947,44 @@ TEST_F(BufferValidationTest, DISABLED_GetMappedRangeOnErrorBuffer) {
|
||||
// GetMappedRange after CreateBufferMapped OOM case returns nullptr.
|
||||
{
|
||||
wgpu::CreateBufferMappedResult result;
|
||||
ASSERT_DEVICE_ERROR(result = CreateBufferMapped(
|
||||
1 << 31, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
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).
|
||||
{
|
||||
wgpu::Buffer buffer;
|
||||
ASSERT_DEVICE_ERROR(buffer = BufferMappedAtCreation(
|
||||
0, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_NE(buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buffer.GetConstMappedRange(), buffer.GetMappedRange());
|
||||
}
|
||||
|
||||
// GetMappedRange after mappedAtCreation non-OOM returns a non-nullptr.
|
||||
{
|
||||
wgpu::Buffer buffer;
|
||||
ASSERT_DEVICE_ERROR(buffer = BufferMappedAtCreation(
|
||||
4, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_NE(buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buffer.GetConstMappedRange(), buffer.GetMappedRange());
|
||||
}
|
||||
|
||||
// GetMappedRange after mappedAtCreation OOM case returns nullptr.
|
||||
{
|
||||
wgpu::Buffer buffer;
|
||||
ASSERT_DEVICE_ERROR(
|
||||
buffer = BufferMappedAtCreation(
|
||||
kStupidLarge, wgpu::BufferUsage::Storage | wgpu::BufferUsage::MapRead));
|
||||
|
||||
ASSERT_EQ(buffer.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buffer.GetConstMappedRange(), buffer.GetMappedRange());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +162,18 @@ TEST_F(QueueWriteBufferValidationTest, MappedBuffer) {
|
||||
ASSERT_DEVICE_ERROR(queue.WriteBuffer(result.buffer, 0, &value, sizeof(value)));
|
||||
}
|
||||
|
||||
// mappedAtCreation
|
||||
{
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::CopyDst;
|
||||
descriptor.mappedAtCreation = true;
|
||||
wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
|
||||
|
||||
uint32_t value = 0;
|
||||
ASSERT_DEVICE_ERROR(queue.WriteBuffer(buffer, 0, &value, sizeof(value)));
|
||||
}
|
||||
|
||||
// MapReadAsync
|
||||
{
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
|
||||
Reference in New Issue
Block a user