mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-18 01:15:39 +00:00
Move client-side OnCompletion callbacks to the server.
We need callbacks to be processed server-side so that callback ordering can be made consistent. Bug: dawn:516 Change-Id: Ie5590ca33fce6bda431f93ae9ff8e832468109c1 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/27481 Commit-Queue: Austin Eng <enga@chromium.org> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
committed by
Commit Bot service account
parent
9ed8d518ca
commit
0b89b27263
@@ -68,16 +68,17 @@ class WireFenceTests : public WireTest {
|
||||
}
|
||||
|
||||
protected:
|
||||
void DoQueueSignal(uint64_t signalValue) {
|
||||
void DoQueueSignal(uint64_t signalValue,
|
||||
WGPUFenceCompletionStatus status = WGPUFenceCompletionStatus_Success) {
|
||||
wgpuQueueSignal(queue, fence, signalValue);
|
||||
EXPECT_CALL(api, QueueSignal(apiQueue, apiFence, signalValue)).Times(1);
|
||||
|
||||
// This callback is generated to update the completedValue of the fence
|
||||
// on the client
|
||||
EXPECT_CALL(api, OnFenceOnCompletionCallback(apiFence, signalValue, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallFenceOnCompletionCallback(apiFence, WGPUFenceCompletionStatus_Success);
|
||||
}));
|
||||
.WillOnce(
|
||||
InvokeWithoutArgs([=]() { api.CallFenceOnCompletionCallback(apiFence, status); }))
|
||||
.RetiresOnSaturation();
|
||||
}
|
||||
|
||||
// A successfully created fence
|
||||
@@ -87,79 +88,58 @@ class WireFenceTests : public WireTest {
|
||||
|
||||
// Check that signaling a fence succeeds
|
||||
TEST_F(WireFenceTests, QueueSignalSuccess) {
|
||||
DoQueueSignal(2u);
|
||||
FlushClient();
|
||||
FlushServer();
|
||||
|
||||
EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 2u);
|
||||
}
|
||||
|
||||
// Check that signaling a fence twice succeeds
|
||||
TEST_F(WireFenceTests, QueueSignalIncreasing) {
|
||||
DoQueueSignal(2u);
|
||||
DoQueueSignal(3u);
|
||||
FlushClient();
|
||||
FlushServer();
|
||||
|
||||
EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 3u);
|
||||
}
|
||||
|
||||
// Errors should be generated when signaling a value less
|
||||
// than or equal to the current signaled value
|
||||
// Check that an error in queue signal does not update the completed value.
|
||||
TEST_F(WireFenceTests, QueueSignalValidationError) {
|
||||
wgpuQueueSignal(queue, fence, 0u); // Error
|
||||
EXPECT_CALL(api, DeviceInjectError(apiDevice, WGPUErrorType_Validation, ValidStringMessage()))
|
||||
.Times(1);
|
||||
DoQueueSignal(2u);
|
||||
DoQueueSignal(1u, WGPUFenceCompletionStatus_Error);
|
||||
FlushClient();
|
||||
FlushServer();
|
||||
|
||||
wgpuQueueSignal(queue, fence, 1u); // Error
|
||||
EXPECT_CALL(api, DeviceInjectError(apiDevice, WGPUErrorType_Validation, ValidStringMessage()))
|
||||
.Times(1);
|
||||
FlushClient();
|
||||
|
||||
DoQueueSignal(4u); // Success
|
||||
FlushClient();
|
||||
|
||||
wgpuQueueSignal(queue, fence, 3u); // Error
|
||||
EXPECT_CALL(api, DeviceInjectError(apiDevice, WGPUErrorType_Validation, ValidStringMessage()))
|
||||
.Times(1);
|
||||
FlushClient();
|
||||
// Value should stay at 2 and not be updated to 1.
|
||||
EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 2u);
|
||||
}
|
||||
|
||||
// Check that callbacks are immediately called if the fence is already finished
|
||||
TEST_F(WireFenceTests, OnCompletionImmediate) {
|
||||
// Can call on value < (initial) signaled value happens immediately
|
||||
{
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, _))
|
||||
.Times(1);
|
||||
wgpuFenceOnCompletion(fence, 0, ToMockFenceOnCompletionCallback, nullptr);
|
||||
}
|
||||
// Check that a success in the on completion callback is forwarded to the client.
|
||||
TEST_F(WireFenceTests, OnCompletionSuccess) {
|
||||
wgpuFenceOnCompletion(fence, 0, ToMockFenceOnCompletionCallback, nullptr);
|
||||
EXPECT_CALL(api, OnFenceOnCompletionCallback(apiFence, 0u, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallFenceOnCompletionCallback(apiFence, WGPUFenceCompletionStatus_Success);
|
||||
}));
|
||||
FlushClient();
|
||||
|
||||
// Can call on value == (initial) signaled value happens immediately
|
||||
{
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, _))
|
||||
.Times(1);
|
||||
wgpuFenceOnCompletion(fence, 1, ToMockFenceOnCompletionCallback, nullptr);
|
||||
}
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, _))
|
||||
.Times(1);
|
||||
FlushServer();
|
||||
}
|
||||
|
||||
// Check that all passed client completion callbacks are called
|
||||
TEST_F(WireFenceTests, OnCompletionMultiple) {
|
||||
DoQueueSignal(3u);
|
||||
DoQueueSignal(6u);
|
||||
|
||||
// Add callbacks in a non-monotonic order. They should still be called
|
||||
// in order of increasing fence value.
|
||||
// Add multiple callbacks for the same value.
|
||||
wgpuFenceOnCompletion(fence, 6, ToMockFenceOnCompletionCallback, this + 0);
|
||||
wgpuFenceOnCompletion(fence, 2, ToMockFenceOnCompletionCallback, this + 1);
|
||||
wgpuFenceOnCompletion(fence, 3, ToMockFenceOnCompletionCallback, this + 2);
|
||||
wgpuFenceOnCompletion(fence, 2, ToMockFenceOnCompletionCallback, this + 3);
|
||||
|
||||
Sequence s1, s2;
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, this + 1))
|
||||
.Times(1)
|
||||
.InSequence(s1);
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, this + 3))
|
||||
.Times(1)
|
||||
.InSequence(s2);
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, this + 2))
|
||||
.Times(1)
|
||||
.InSequence(s1, s2);
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, this + 0))
|
||||
.Times(1)
|
||||
.InSequence(s1, s2);
|
||||
|
||||
// Check that an error in the on completion callback is forwarded to the client.
|
||||
TEST_F(WireFenceTests, OnCompletionError) {
|
||||
wgpuFenceOnCompletion(fence, 0, ToMockFenceOnCompletionCallback, nullptr);
|
||||
EXPECT_CALL(api, OnFenceOnCompletionCallback(apiFence, 0u, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallFenceOnCompletionCallback(apiFence, WGPUFenceCompletionStatus_Error);
|
||||
}));
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Error, _)).Times(1);
|
||||
FlushServer();
|
||||
}
|
||||
|
||||
@@ -175,19 +155,6 @@ TEST_F(WireFenceTests, OnCompletionSynchronousValidationSuccess) {
|
||||
.Times(3);
|
||||
}
|
||||
|
||||
// Errors should be generated when waiting on a value greater
|
||||
// than the last signaled value
|
||||
TEST_F(WireFenceTests, OnCompletionValidationError) {
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Error, this + 0))
|
||||
.Times(1);
|
||||
|
||||
wgpuFenceOnCompletion(fence, 2u, ToMockFenceOnCompletionCallback, this + 0);
|
||||
|
||||
EXPECT_CALL(api, DeviceInjectError(apiDevice, WGPUErrorType_Validation, ValidStringMessage()))
|
||||
.Times(1);
|
||||
FlushClient();
|
||||
}
|
||||
|
||||
// Check that the fence completed value is initialized
|
||||
TEST_F(WireFenceTests, GetCompletedValueInitialization) {
|
||||
EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 1u);
|
||||
@@ -202,6 +169,26 @@ TEST_F(WireFenceTests, GetCompletedValueUpdate) {
|
||||
EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 3u);
|
||||
}
|
||||
|
||||
// Check that the fence completed value updates after signaling the fence
|
||||
TEST_F(WireFenceTests, GetCompletedValueUpdateInCallback) {
|
||||
// Signal the fence
|
||||
DoQueueSignal(3u);
|
||||
|
||||
// Register the callback
|
||||
wgpuFenceOnCompletion(fence, 3u, ToMockFenceOnCompletionCallback, this);
|
||||
EXPECT_CALL(api, OnFenceOnCompletionCallback(apiFence, 3u, _, _))
|
||||
.WillOnce(InvokeWithoutArgs([&]() {
|
||||
api.CallFenceOnCompletionCallback(apiFence, WGPUFenceCompletionStatus_Success);
|
||||
}))
|
||||
.RetiresOnSaturation();
|
||||
|
||||
FlushClient();
|
||||
|
||||
EXPECT_CALL(*mockFenceOnCompletionCallback, Call(WGPUFenceCompletionStatus_Success, this))
|
||||
.WillOnce(InvokeWithoutArgs([&]() { EXPECT_EQ(wgpuFenceGetCompletedValue(fence), 3u); }));
|
||||
FlushServer();
|
||||
}
|
||||
|
||||
// Check that the fence completed value does not update without a flush
|
||||
TEST_F(WireFenceTests, GetCompletedValueNoUpdate) {
|
||||
wgpuQueueSignal(queue, fence, 3u);
|
||||
|
||||
Reference in New Issue
Block a user