diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2021-11-25 15:38:04 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2022-11-09 11:47:32 +0100 |
commit | 17c94fcb685fe3f56953b570caa4f3eabf1d4d5e (patch) | |
tree | e920d629119ccb3ca9cd1a43bd116c1c931868c2 | |
parent | c66fe430d9cd61f1d1c0263b238f722bac4eb258 (diff) | |
download | qtwebengine-chromium-17c94fcb685fe3f56953b570caa4f3eabf1d4d5e.tar.gz |
Fix stack overflow on gpu channel recreate with an error
On system resume new gpu channel is requested by viz. That will
inevitably fail multiple time due to gpu driver peculiarities. In case
of in-process gpu, callback with an error for channel recreate will be
called in the same stack frame, so cover this case to not cause
recursive calls and overflow.
Task-number: QTBUG-71611
Change-Id: I989d5666d391b6b1678a48d1c06a58d60a305d48
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit 0777b581381eca311b1eb93ed96e8c43f38c174c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | chromium/content/browser/compositor/viz_process_transport_factory.cc | 21 | ||||
-rw-r--r-- | chromium/content/browser/compositor/viz_process_transport_factory.h | 2 |
2 files changed, 17 insertions, 6 deletions
diff --git a/chromium/content/browser/compositor/viz_process_transport_factory.cc b/chromium/content/browser/compositor/viz_process_transport_factory.cc index c19dc77d669..2d6a581e263 100644 --- a/chromium/content/browser/compositor/viz_process_transport_factory.cc +++ b/chromium/content/browser/compositor/viz_process_transport_factory.cc @@ -191,9 +191,7 @@ void VizProcessTransportFactory::CreateLayerTreeFrameSink( OnEstablishedGpuChannel(compositor, nullptr); return; } - gpu_channel_establish_factory_->EstablishGpuChannel( - base::BindOnce(&VizProcessTransportFactory::OnEstablishedGpuChannel, - weak_ptr_factory_.GetWeakPtr(), compositor)); + EstablishGpuChannel(std::move(compositor)); } scoped_refptr<viz::ContextProvider> @@ -335,6 +333,13 @@ void VizProcessTransportFactory::PrepareForShutDown() { shutdown_=true; } +void VizProcessTransportFactory::EstablishGpuChannel(base::WeakPtr<ui::Compositor> compositor) +{ + gpu_channel_establish_factory_->EstablishGpuChannel( + base::BindOnce(&VizProcessTransportFactory::OnEstablishedGpuChannel, + weak_ptr_factory_.GetWeakPtr(), std::move(compositor))); +} + void VizProcessTransportFactory::OnEstablishedGpuChannel( base::WeakPtr<ui::Compositor> compositor_weak_ptr, scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) { @@ -350,9 +355,13 @@ void VizProcessTransportFactory::OnEstablishedGpuChannel( TryCreateContextsForGpuCompositing(std::move(gpu_channel_host)); if (context_result == gpu::ContextResult::kTransientFailure) { // Get a new GpuChannelHost and retry context creation. - gpu_channel_establish_factory_->EstablishGpuChannel( - base::BindOnce(&VizProcessTransportFactory::OnEstablishedGpuChannel, - weak_ptr_factory_.GetWeakPtr(), compositor_weak_ptr)); + // MEMO: do this async, since callback may be called down the stack + // (with in proc gpu), leading to recursive retries and stack overflow + GetUIThreadTaskRunner({})->PostDelayedTask( + FROM_HERE, + base::BindOnce(&VizProcessTransportFactory::EstablishGpuChannel, + weak_ptr_factory_.GetWeakPtr(), std::move(compositor_weak_ptr)), + base::Milliseconds(16)); return; } else if (gpu::IsFatalOrSurfaceFailure(context_result)) { DisableGpuCompositing(compositor); diff --git a/chromium/content/browser/compositor/viz_process_transport_factory.h b/chromium/content/browser/compositor/viz_process_transport_factory.h index 6b38448d7a3..acba541a907 100644 --- a/chromium/content/browser/compositor/viz_process_transport_factory.h +++ b/chromium/content/browser/compositor/viz_process_transport_factory.h @@ -108,6 +108,8 @@ class VizProcessTransportFactory : public ui::ContextFactory, // Provided as a callback when the GPU process has crashed. void OnGpuProcessLost(); + void EstablishGpuChannel(base::WeakPtr<ui::Compositor> compositor); + // Finishes creation of LayerTreeFrameSink after GPU channel has been // established. void OnEstablishedGpuChannel( |