diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc b/chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc index be5b392fa83..6a6283972e7 100644 --- a/chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc +++ b/chromium/third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.cc @@ -17,9 +17,17 @@ scoped_refptr<DawnControlClientHolder> DawnControlClientHolder::Create( auto dawn_control_client_holder = base::MakeRefCounted<DawnControlClientHolder>(std::move(context_provider), std::move(task_runner)); + // The context lost callback occurs when the client receives + // OnGpuControlLostContext. This can happen on fatal errors when the GPU + // channel is disconnected: the GPU process crashes, the GPU process fails to + // deserialize a message, etc. We mark the context lost, but NOT destroy the + // entire WebGraphicsContext3DProvider as that would free services for mapping + // shared memory. There may still be outstanding mapped GPUBuffers pointing to + // this memory. dawn_control_client_holder->context_provider_->ContextProvider() ->SetLostContextCallback(WTF::BindRepeating( - &DawnControlClientHolder::Destroy, dawn_control_client_holder)); + &DawnControlClientHolder::MarkContextLost, + dawn_control_client_holder->weak_ptr_factory_.GetWeakPtr())); return dawn_control_client_holder; } @@ -38,7 +46,7 @@ DawnControlClientHolder::DawnControlClientHolder( DawnControlClientHolder::~DawnControlClientHolder() = default; void DawnControlClientHolder::Destroy() { - api_channel_->Disconnect(); + MarkContextLost(); // Destroy the WebGPU context. // This ensures that GPU resources are eagerly reclaimed. @@ -68,8 +76,16 @@ DawnControlClientHolder::GetContextProviderWeakPtr() const { return context_provider_->GetWeakPtr(); } +void DawnControlClientHolder::MarkContextLost() { + if (context_lost_) { + return; + } + api_channel_->Disconnect(); + context_lost_ = true; +} + bool DawnControlClientHolder::IsContextLost() const { - return !context_provider_; + return context_lost_; } std::unique_ptr<RecyclableCanvasResource> |