mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-17 17:05:31 +00:00
Add MemoryTransfer interfaces to the wire
This patch adds MemoryTransfer client/server interfaces and uses it to implement data transfers for buffer mapping. This patch also provides a default "inline" implementation of the MemoryTransfer which is used if the embedder does not provide one on initialization. Because implementations of MemoryTransfer perform their own serialization, a skip_serialize option is added to WireCmd records. Bug: dawn:156 Change-Id: I2fa035517628a3ad465b0bc18a6ffc477e2bd67f Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/8642 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Austin Eng <enga@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
49aae0f3bd
commit
6a5418a760
@@ -395,10 +395,18 @@ void DawnTest::SetUp() {
|
||||
mC2sBuf = std::make_unique<utils::TerribleCommandBuffer>();
|
||||
mS2cBuf = std::make_unique<utils::TerribleCommandBuffer>();
|
||||
|
||||
mWireServer.reset(new dawn_wire::WireServer(backendDevice, backendProcs, mS2cBuf.get()));
|
||||
dawn_wire::WireServerDescriptor serverDesc = {};
|
||||
serverDesc.device = backendDevice;
|
||||
serverDesc.procs = &backendProcs;
|
||||
serverDesc.serializer = mS2cBuf.get();
|
||||
|
||||
mWireServer.reset(new dawn_wire::WireServer(serverDesc));
|
||||
mC2sBuf->SetHandler(mWireServer.get());
|
||||
|
||||
mWireClient.reset(new dawn_wire::WireClient(mC2sBuf.get()));
|
||||
dawn_wire::WireClientDescriptor clientDesc = {};
|
||||
clientDesc.serializer = mC2sBuf.get();
|
||||
|
||||
mWireClient.reset(new dawn_wire::WireClient(clientDesc));
|
||||
DawnDevice clientDevice = mWireClient->GetDevice();
|
||||
DawnProcTable clientProcs = mWireClient->GetProcs();
|
||||
mS2cBuf->SetHandler(mWireClient.get());
|
||||
|
||||
@@ -99,6 +99,7 @@ class WireBufferMappingTests : public WireTest {
|
||||
|
||||
DawnBufferDescriptor descriptor;
|
||||
descriptor.nextInChain = nullptr;
|
||||
descriptor.size = kBufferSize;
|
||||
|
||||
apiBuffer = api.GetNewBuffer();
|
||||
buffer = dawnDeviceCreateBuffer(device, &descriptor);
|
||||
@@ -127,6 +128,7 @@ class WireBufferMappingTests : public WireTest {
|
||||
}
|
||||
|
||||
protected:
|
||||
static constexpr uint64_t kBufferSize = sizeof(uint32_t);
|
||||
// A successfully created buffer
|
||||
DawnBuffer buffer;
|
||||
DawnBuffer apiBuffer;
|
||||
@@ -142,13 +144,13 @@ TEST_F(WireBufferMappingTests, MappingForReadSuccessBuffer) {
|
||||
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapReadCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, &bufferContent,
|
||||
sizeof(uint32_t));
|
||||
kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
Pointee(Eq(bufferContent)), sizeof(uint32_t), _))
|
||||
Pointee(Eq(bufferContent)), kBufferSize, _))
|
||||
.Times(1);
|
||||
|
||||
FlushServer();
|
||||
@@ -208,7 +210,7 @@ TEST_F(WireBufferMappingTests, UnmapCalledTooEarlyForRead) {
|
||||
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapReadCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, &bufferContent,
|
||||
sizeof(uint32_t));
|
||||
kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
@@ -232,14 +234,14 @@ TEST_F(WireBufferMappingTests, MappingForReadingErrorWhileAlreadyMappedGetsNullp
|
||||
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapReadCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, &bufferContent,
|
||||
sizeof(uint32_t));
|
||||
kBufferSize);
|
||||
}))
|
||||
.RetiresOnSaturation();
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
Pointee(Eq(bufferContent)), sizeof(uint32_t), _))
|
||||
Pointee(Eq(bufferContent)), kBufferSize, _))
|
||||
.Times(1);
|
||||
|
||||
FlushServer();
|
||||
@@ -267,13 +269,13 @@ TEST_F(WireBufferMappingTests, UnmapInsideMapReadCallback) {
|
||||
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapReadCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, &bufferContent,
|
||||
sizeof(uint32_t));
|
||||
kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
Pointee(Eq(bufferContent)), sizeof(uint32_t), _))
|
||||
Pointee(Eq(bufferContent)), kBufferSize, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { dawnBufferUnmap(buffer); }));
|
||||
|
||||
FlushServer();
|
||||
@@ -292,13 +294,13 @@ TEST_F(WireBufferMappingTests, DestroyInsideMapReadCallback) {
|
||||
EXPECT_CALL(api, OnBufferMapReadAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapReadCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, &bufferContent,
|
||||
sizeof(uint32_t));
|
||||
kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapReadCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
Pointee(Eq(bufferContent)), sizeof(uint32_t), _))
|
||||
Pointee(Eq(bufferContent)), kBufferSize, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { dawnBufferRelease(buffer); }));
|
||||
|
||||
FlushServer();
|
||||
@@ -321,14 +323,14 @@ TEST_F(WireBufferMappingTests, MappingForWriteSuccessBuffer) {
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&serverBufferContent, sizeof(uint32_t));
|
||||
&serverBufferContent, kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
// The map write callback always gets a buffer full of zeroes.
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.Times(1);
|
||||
|
||||
FlushServer();
|
||||
@@ -395,7 +397,7 @@ TEST_F(WireBufferMappingTests, UnmapCalledTooEarlyForWrite) {
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&bufferContent, sizeof(uint32_t));
|
||||
&bufferContent, kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
@@ -420,14 +422,14 @@ TEST_F(WireBufferMappingTests, MappingForWritingErrorWhileAlreadyMappedGetsNullp
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&bufferContent, sizeof(uint32_t));
|
||||
&bufferContent, kBufferSize);
|
||||
}))
|
||||
.RetiresOnSaturation();
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.Times(1);
|
||||
|
||||
FlushServer();
|
||||
@@ -457,13 +459,13 @@ TEST_F(WireBufferMappingTests, UnmapInsideMapWriteCallback) {
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&bufferContent, sizeof(uint32_t));
|
||||
&bufferContent, kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { dawnBufferUnmap(buffer); }));
|
||||
|
||||
FlushServer();
|
||||
@@ -483,13 +485,13 @@ TEST_F(WireBufferMappingTests, DestroyInsideMapWriteCallback) {
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&bufferContent, sizeof(uint32_t));
|
||||
&bufferContent, kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { dawnBufferRelease(buffer); }));
|
||||
|
||||
FlushServer();
|
||||
@@ -585,13 +587,13 @@ TEST_F(WireBufferMappingTests, CreateBufferMappedThenMapSuccess) {
|
||||
EXPECT_CALL(api, OnBufferMapWriteAsyncCallback(apiBuffer, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallMapWriteCallback(apiBuffer, DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS,
|
||||
&apiBufferData, sizeof(uint32_t));
|
||||
&apiBufferData, kBufferSize);
|
||||
}));
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockBufferMapWriteCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.Times(1);
|
||||
|
||||
FlushServer();
|
||||
@@ -643,12 +645,13 @@ TEST_F(WireBufferMappingTests, CreateBufferMappedThenMapFailure) {
|
||||
TEST_F(WireBufferMappingTests, CreateBufferMappedAsyncSuccess) {
|
||||
DawnBufferDescriptor descriptor;
|
||||
descriptor.nextInChain = nullptr;
|
||||
descriptor.size = kBufferSize;
|
||||
|
||||
DawnCreateBufferMappedResult apiResult;
|
||||
uint32_t serverBufferContent = 31337;
|
||||
apiResult.buffer = apiBuffer;
|
||||
apiResult.data = reinterpret_cast<uint8_t*>(&serverBufferContent);
|
||||
apiResult.dataLength = 4;
|
||||
apiResult.dataLength = kBufferSize;
|
||||
|
||||
uint32_t updatedContent = 4242;
|
||||
uint32_t zero = 0;
|
||||
@@ -663,8 +666,8 @@ TEST_F(WireBufferMappingTests, CreateBufferMappedAsyncSuccess) {
|
||||
|
||||
DawnBuffer buffer;
|
||||
// The callback always gets a buffer full of zeroes.
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _,
|
||||
Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(::testing::SaveArg<1>(&buffer));
|
||||
|
||||
FlushServer();
|
||||
@@ -689,7 +692,7 @@ TEST_F(WireBufferMappingTests, CreateBufferMappedAsyncMapError) {
|
||||
DawnCreateBufferMappedResult apiResult;
|
||||
apiResult.buffer = apiBuffer;
|
||||
apiResult.data = nullptr; // error mapping
|
||||
apiResult.dataLength = 4;
|
||||
apiResult.dataLength = kBufferSize;
|
||||
|
||||
dawnDeviceCreateBufferMappedAsync(device, &descriptor, ToMockCreateBufferMappedCallback, nullptr);
|
||||
|
||||
@@ -717,12 +720,13 @@ TEST_F(WireBufferMappingTests, CreateBufferMappedAsyncMapError) {
|
||||
TEST_F(WireBufferMappingTests, UnmapInsideCreateBufferMappedAsyncCallback) {
|
||||
DawnBufferDescriptor descriptor;
|
||||
descriptor.nextInChain = nullptr;
|
||||
descriptor.size = kBufferSize;
|
||||
|
||||
DawnCreateBufferMappedResult apiResult;
|
||||
uint32_t serverBufferContent = 31337;
|
||||
apiResult.buffer = apiBuffer;
|
||||
apiResult.data = reinterpret_cast<uint8_t*>(&serverBufferContent);
|
||||
apiResult.dataLength = 4;
|
||||
apiResult.dataLength = kBufferSize;
|
||||
|
||||
uint32_t zero = 0;
|
||||
|
||||
@@ -736,8 +740,8 @@ TEST_F(WireBufferMappingTests, UnmapInsideCreateBufferMappedAsyncCallback) {
|
||||
|
||||
DawnBuffer buffer;
|
||||
// The callback always gets a buffer full of zeroes.
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _,
|
||||
Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(DoAll(::testing::SaveArg<1>(&buffer),
|
||||
InvokeWithoutArgs([&]() { dawnBufferUnmap(buffer); })));
|
||||
|
||||
@@ -753,12 +757,13 @@ TEST_F(WireBufferMappingTests, UnmapInsideCreateBufferMappedAsyncCallback) {
|
||||
TEST_F(WireBufferMappingTests, ReleaseInsideCreateBufferMappedAsyncCallback) {
|
||||
DawnBufferDescriptor descriptor;
|
||||
descriptor.nextInChain = nullptr;
|
||||
descriptor.size = kBufferSize;
|
||||
|
||||
DawnCreateBufferMappedResult apiResult;
|
||||
uint32_t serverBufferContent = 31337;
|
||||
apiResult.buffer = apiBuffer;
|
||||
apiResult.data = reinterpret_cast<uint8_t*>(&serverBufferContent);
|
||||
apiResult.dataLength = 4;
|
||||
apiResult.dataLength = kBufferSize;
|
||||
|
||||
uint32_t zero = 0;
|
||||
|
||||
@@ -772,8 +777,8 @@ TEST_F(WireBufferMappingTests, ReleaseInsideCreateBufferMappedAsyncCallback) {
|
||||
|
||||
DawnBuffer buffer;
|
||||
// The callback always gets a buffer full of zeroes.
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _,
|
||||
Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(DoAll(::testing::SaveArg<1>(&buffer),
|
||||
InvokeWithoutArgs([&]() { dawnBufferRelease(buffer); })));
|
||||
|
||||
@@ -789,12 +794,13 @@ TEST_F(WireBufferMappingTests, ReleaseInsideCreateBufferMappedAsyncCallback) {
|
||||
TEST_F(WireBufferMappingTests, DestroyInsideCreateBufferMappedAsyncCallback) {
|
||||
DawnBufferDescriptor descriptor;
|
||||
descriptor.nextInChain = nullptr;
|
||||
descriptor.size = kBufferSize;
|
||||
|
||||
DawnCreateBufferMappedResult apiResult;
|
||||
uint32_t serverBufferContent = 31337;
|
||||
apiResult.buffer = apiBuffer;
|
||||
apiResult.data = reinterpret_cast<uint8_t*>(&serverBufferContent);
|
||||
apiResult.dataLength = 4;
|
||||
apiResult.dataLength = kBufferSize;
|
||||
|
||||
uint32_t zero = 0;
|
||||
|
||||
@@ -808,8 +814,8 @@ TEST_F(WireBufferMappingTests, DestroyInsideCreateBufferMappedAsyncCallback) {
|
||||
|
||||
DawnBuffer buffer;
|
||||
// The callback always gets a buffer full of zeroes.
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback, Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _,
|
||||
Pointee(Eq(zero)), sizeof(uint32_t), _))
|
||||
EXPECT_CALL(*mockCreateBufferMappedCallback,
|
||||
Call(DAWN_BUFFER_MAP_ASYNC_STATUS_SUCCESS, _, Pointee(Eq(zero)), kBufferSize, _))
|
||||
.WillOnce(DoAll(::testing::SaveArg<1>(&buffer),
|
||||
InvokeWithoutArgs([&]() { dawnBufferDestroy(buffer); })));
|
||||
|
||||
|
||||
@@ -39,10 +39,18 @@ void WireTest::SetUp() {
|
||||
mS2cBuf = std::make_unique<utils::TerribleCommandBuffer>();
|
||||
mC2sBuf = std::make_unique<utils::TerribleCommandBuffer>(mWireServer.get());
|
||||
|
||||
mWireServer.reset(new WireServer(mockDevice, mockProcs, mS2cBuf.get()));
|
||||
WireServerDescriptor serverDesc = {};
|
||||
serverDesc.device = mockDevice;
|
||||
serverDesc.procs = &mockProcs;
|
||||
serverDesc.serializer = mS2cBuf.get();
|
||||
|
||||
mWireServer.reset(new WireServer(serverDesc));
|
||||
mC2sBuf->SetHandler(mWireServer.get());
|
||||
|
||||
mWireClient.reset(new WireClient(mC2sBuf.get()));
|
||||
WireClientDescriptor clientDesc = {};
|
||||
clientDesc.serializer = mC2sBuf.get();
|
||||
|
||||
mWireClient.reset(new WireClient(clientDesc));
|
||||
mS2cBuf->SetHandler(mWireClient.get());
|
||||
|
||||
device = mWireClient->GetDevice();
|
||||
|
||||
Reference in New Issue
Block a user