dawn/node: Fix crash when using device after destroy()
Do not assign null to the wgpu::Device, as this will result in a nullptr dereference if you attempt to use the device after destruction. The wgpu device correctly handles the error state of being used after destroy(). Fixes crashes of CTS tests: 'webgpu:api,validation,state,device_lost,destroy,*' Change-Id: Ibee1078436efadf25f53735fbaa47d5fc5f74898 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/97442 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
8b30c7f124
commit
316fb47afe
|
@ -172,7 +172,7 @@ GPUDevice::~GPUDevice() {
|
||||||
// Without this, we'll get a 'Promise not resolved or rejected' fatal message as the
|
// Without this, we'll get a 'Promise not resolved or rejected' fatal message as the
|
||||||
// lost_promise_ is left hanging. We'll also not clean up any GPU objects before terminating the
|
// lost_promise_ is left hanging. We'll also not clean up any GPU objects before terminating the
|
||||||
// process, which is not a good idea.
|
// process, which is not a good idea.
|
||||||
if (device_) {
|
if (!destroyed_) {
|
||||||
destroy(env_);
|
destroy(env_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ void GPUDevice::destroy(Napi::Env env) {
|
||||||
env_, interop::GPUDeviceLostReason::kDestroyed, "device was destroyed"));
|
env_, interop::GPUDeviceLostReason::kDestroyed, "device was destroyed"));
|
||||||
}
|
}
|
||||||
device_.Destroy();
|
device_.Destroy();
|
||||||
device_ = nullptr;
|
destroyed_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
interop::Interface<interop::GPUBuffer> GPUDevice::createBuffer(
|
interop::Interface<interop::GPUBuffer> GPUDevice::createBuffer(
|
||||||
|
|
|
@ -111,6 +111,8 @@ class GPUDevice final : public interop::GPUDevice {
|
||||||
// This promise's JS object lives as long as the device because it is stored in .lost
|
// This promise's JS object lives as long as the device because it is stored in .lost
|
||||||
// of the wrapper JS object.
|
// of the wrapper JS object.
|
||||||
interop::Promise<interop::Interface<interop::GPUDeviceLostInfo>> lost_promise_;
|
interop::Promise<interop::Interface<interop::GPUDeviceLostInfo>> lost_promise_;
|
||||||
|
|
||||||
|
bool destroyed_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace wgpu::binding
|
} // namespace wgpu::binding
|
||||||
|
|
Loading…
Reference in New Issue