client: call pending GetCompilationInfo on Disconnect

Fixed: dawn:1090
Change-Id: Ia7cf692ea41ebe85aaac58e3f3aa6727e6cc8ba4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/63002
Auto-Submit: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Shrek Shao <shrekshao@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
Corentin Wallez 2021-08-30 08:00:45 +00:00 committed by Dawn LUCI CQ
parent ea487972d1
commit 52ad8f6768
3 changed files with 44 additions and 1 deletions

View File

@ -63,4 +63,14 @@ namespace dawn_wire { namespace client {
return true;
}
void ShaderModule::CancelCallbacksForDisconnect() {
for (auto& it : mCompilationInfoRequests) {
if (it.second.callback) {
it.second.callback(WGPUCompilationInfoRequestStatus_DeviceLost, nullptr,
it.second.userdata);
}
}
mCompilationInfoRequests.clear();
}
}} // namespace dawn_wire::client

View File

@ -32,6 +32,8 @@ namespace dawn_wire { namespace client {
WGPUCompilationInfoRequestStatus status,
const WGPUCompilationInfo* info);
void CancelCallbacksForDisconnect() override;
private:
struct CompilationInfoRequest {
WGPUCompilationInfoCallback callback = nullptr;

View File

@ -117,4 +117,35 @@ TEST_F(WireShaderModuleTests, GetCompilationInfo) {
_))
.Times(1);
FlushServer();
}
}
// Test that calling GetCompilationInfo then disconnecting the wire calls the callback with a device
// loss.
TEST_F(WireShaderModuleTests, GetCompilationInfoBeforeDisconnect) {
wgpuShaderModuleGetCompilationInfo(shaderModule, ToMockGetCompilationInfoCallback, nullptr);
WGPUCompilationMessage message = {"Test Message", WGPUCompilationMessageType_Info, 2, 4, 6, 8};
WGPUCompilationInfo compilationInfo;
compilationInfo.messageCount = 1;
compilationInfo.messages = &message;
EXPECT_CALL(api, OnShaderModuleGetCompilationInfo(apiShaderModule, _, _))
.WillOnce(InvokeWithoutArgs([&]() {
api.CallShaderModuleGetCompilationInfoCallback(
apiShaderModule, WGPUCompilationInfoRequestStatus_Success, &compilationInfo);
}));
FlushClient();
EXPECT_CALL(*mockCompilationInfoCallback,
Call(WGPUCompilationInfoRequestStatus_DeviceLost, nullptr, _));
GetWireClient()->Disconnect();
}
// Test that calling GetCompilationInfo after disconnecting the wire calls the callback with a
// device loss.
TEST_F(WireShaderModuleTests, GetCompilationInfoAfterDisconnect) {
GetWireClient()->Disconnect();
EXPECT_CALL(*mockCompilationInfoCallback,
Call(WGPUCompilationInfoRequestStatus_DeviceLost, nullptr, _));
wgpuShaderModuleGetCompilationInfo(shaderModule, ToMockGetCompilationInfoCallback, nullptr);
}