mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-14 23:56:16 +00:00
Add Buffer::Get[|Const]MappedRange
This CL adds GetMappedRange reusing the existing GetMappedPointerImpl call in dawn_native. In dawn_wire tracking is added to keep a Buffer::mMappedData around. Tests are added to test the result of Get[|Const]MappedRange in all buffer states. Bug: dawn:445 Change-Id: I3737dc4d36f31d392839952da0b5c0d10c7c8a88 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/23861 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
2008d15326
commit
1325ab1251
@@ -119,6 +119,18 @@ TEST_P(BufferMapReadTests, ZeroSized) {
|
||||
UnmapBuffer(buffer);
|
||||
}
|
||||
|
||||
// Test the result of GetMappedRange when mapped for reading.
|
||||
TEST_P(BufferMapReadTests, GetMappedRange) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::MapRead | wgpu::BufferUsage::CopyDst;
|
||||
wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
|
||||
|
||||
const void* mappedData = MapReadAsyncAndWait(buffer);
|
||||
ASSERT_EQ(mappedData, buffer.GetConstMappedRange());
|
||||
UnmapBuffer(buffer);
|
||||
}
|
||||
|
||||
DAWN_INSTANTIATE_TEST(BufferMapReadTests, D3D12Backend(), MetalBackend(), OpenGLBackend(), VulkanBackend());
|
||||
|
||||
class BufferMapWriteTests : public DawnTest {
|
||||
@@ -253,6 +265,19 @@ TEST_P(BufferMapWriteTests, ManyWrites) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test the result of GetMappedRange when mapped for writing.
|
||||
TEST_P(BufferMapWriteTests, GetMappedRange) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::MapWrite | wgpu::BufferUsage::CopySrc;
|
||||
wgpu::Buffer buffer = device.CreateBuffer(&descriptor);
|
||||
|
||||
void* mappedData = MapWriteAsyncAndWait(buffer);
|
||||
ASSERT_EQ(mappedData, buffer.GetMappedRange());
|
||||
ASSERT_EQ(mappedData, buffer.GetConstMappedRange());
|
||||
UnmapBuffer(buffer);
|
||||
}
|
||||
|
||||
DAWN_INSTANTIATE_TEST(BufferMapWriteTests, D3D12Backend(), MetalBackend(), OpenGLBackend(), VulkanBackend());
|
||||
|
||||
// TODO(enga): These tests should use the testing toggle to initialize resources to 1.
|
||||
@@ -505,6 +530,19 @@ TEST_P(CreateBufferMappedTests, ZeroSizedErrorBuffer) {
|
||||
ASSERT_NE(nullptr, result.data);
|
||||
}
|
||||
|
||||
// Test the result of GetMappedRange when mapped at creation.
|
||||
TEST_P(CreateBufferMappedTests, GetMappedRange) {
|
||||
wgpu::BufferDescriptor descriptor;
|
||||
descriptor.size = 4;
|
||||
descriptor.usage = wgpu::BufferUsage::CopyDst;
|
||||
wgpu::CreateBufferMappedResult result;
|
||||
result = device.CreateBufferMapped(&descriptor);
|
||||
|
||||
ASSERT_EQ(result.data, result.buffer.GetMappedRange());
|
||||
ASSERT_EQ(result.data, result.buffer.GetConstMappedRange());
|
||||
result.buffer.Unmap();
|
||||
}
|
||||
|
||||
DAWN_INSTANTIATE_TEST(CreateBufferMappedTests,
|
||||
D3D12Backend(),
|
||||
D3D12Backend({}, {"use_d3d12_resource_heap_tier2"}),
|
||||
|
||||
@@ -662,3 +662,166 @@ TEST_F(BufferValidationTest, UnmapUnmappedBuffer) {
|
||||
buf.Unmap();
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is invalid to call GetMappedRange on an unmapped buffer.
|
||||
TEST_F(BufferValidationTest, GetMappedRangeOnUnmappedBuffer) {
|
||||
// Unmapped at creation case.
|
||||
{
|
||||
wgpu::BufferDescriptor desc;
|
||||
desc.size = 4;
|
||||
desc.usage = wgpu::BufferUsage::CopySrc;
|
||||
wgpu::Buffer buf = device.CreateBuffer(&desc);
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetConstMappedRange()));
|
||||
}
|
||||
|
||||
// Unmapped after CreateBufferMapped case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc).buffer;
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(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);
|
||||
queue.Submit(0, nullptr);
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(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);
|
||||
queue.Submit(0, nullptr);
|
||||
buf.Unmap();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetConstMappedRange()));
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is invalid to call GetMappedRange on a destroyed buffer.
|
||||
TEST_F(BufferValidationTest, GetMappedRangeOnDestroyedBuffer) {
|
||||
// Destroyed after creation case.
|
||||
{
|
||||
wgpu::BufferDescriptor desc;
|
||||
desc.size = 4;
|
||||
desc.usage = wgpu::BufferUsage::CopySrc;
|
||||
wgpu::Buffer buf = device.CreateBuffer(&desc);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetConstMappedRange()));
|
||||
}
|
||||
|
||||
// Destroyed after CreateBufferMapped case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateBufferMapped(4, wgpu::BufferUsage::CopySrc).buffer;
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(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);
|
||||
queue.Submit(0, nullptr);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(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);
|
||||
queue.Submit(0, nullptr);
|
||||
buf.Destroy();
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetConstMappedRange()));
|
||||
}
|
||||
}
|
||||
|
||||
// Test that it is invalid to call GetMappedRange on a buffer afterMapReadAsync
|
||||
TEST_F(BufferValidationTest, GetMappedRangeOnMappedForReading) {
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.Times(1);
|
||||
queue.Submit(0, nullptr);
|
||||
|
||||
ASSERT_DEVICE_ERROR(ASSERT_EQ(nullptr, buf.GetMappedRange()));
|
||||
}
|
||||
|
||||
// Test valid cases to call GetMappedRange on a buffer.
|
||||
TEST_F(BufferValidationTest, GetMappedRangeValidCases) {
|
||||
// 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 MapReadAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapReadBuffer(4);
|
||||
|
||||
buf.MapReadAsync(ToMockBufferMapReadCallback, nullptr);
|
||||
|
||||
const void* mappedPointer = nullptr;
|
||||
EXPECT_CALL(*mockBufferMapReadCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(SaveArg<1>(&mappedPointer));
|
||||
|
||||
queue.Submit(0, nullptr);
|
||||
|
||||
ASSERT_NE(buf.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buf.GetConstMappedRange(), mappedPointer);
|
||||
}
|
||||
|
||||
// GetMappedRange after MapWriteAsync case.
|
||||
{
|
||||
wgpu::Buffer buf = CreateMapWriteBuffer(4);
|
||||
buf.MapWriteAsync(ToMockBufferMapWriteCallback, nullptr);
|
||||
|
||||
const void* mappedPointer = nullptr;
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(WGPUBufferMapAsyncStatus_Success, Ne(nullptr), 4u, _))
|
||||
.WillOnce(SaveArg<1>(&mappedPointer));
|
||||
|
||||
queue.Submit(0, nullptr);
|
||||
|
||||
ASSERT_NE(buf.GetConstMappedRange(), nullptr);
|
||||
ASSERT_EQ(buf.GetConstMappedRange(), buf.GetMappedRange());
|
||||
ASSERT_EQ(buf.GetConstMappedRange(), mappedPointer);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user