summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2021-11-25 15:38:04 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-11-09 11:47:32 +0100
commit17c94fcb685fe3f56953b570caa4f3eabf1d4d5e (patch)
treee920d629119ccb3ca9cd1a43bd116c1c931868c2
parentc66fe430d9cd61f1d1c0263b238f722bac4eb258 (diff)
downloadqtwebengine-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.cc21
-rw-r--r--chromium/content/browser/compositor/viz_process_transport_factory.h2
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(