commit 325f49b8e7b4d48b57a877b5473bbb6737ca69dc
parent d8b0e17751fae70394c3c6196baaad346930db4d
Author: Markus Stange <mstange.moz@gmail.com>
Date: Wed, 17 Dec 2025 21:01:38 +0000
Bug 2005820 - Don't start warming up shaders until the first NewRenderer task is done (i.e. until EnsureConnected in the parent has completed). r=jnicol
Differential Revision: https://phabricator.services.mozilla.com/D276740
Diffstat:
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/gfx/webrender_bindings/RenderThread.cpp b/gfx/webrender_bindings/RenderThread.cpp
@@ -1279,12 +1279,6 @@ void RenderThread::InitDeviceTask() {
// lazy initialization to happen now.
SingletonGL();
- if (mShaders) {
- // Kick off shader warmup, outside the InitDeviceTask so that this thread
- // becomes available to handle other messages from the Compositor.
- PostResumeShaderWarmupRunnable();
- }
-
const auto maxDurationMs = 3 * 1000;
const auto end = TimeStamp::Now();
const auto durationMs = static_cast<uint32_t>((end - start).ToMilliseconds());
@@ -1294,6 +1288,12 @@ void RenderThread::InitDeviceTask() {
}
}
+void RenderThread::BeginShaderWarmupIfNeeded() {
+ if (mShaders) {
+ PostResumeShaderWarmupRunnable();
+ }
+}
+
void RenderThread::PostResumeShaderWarmupRunnable() {
RefPtr<Runnable> runnable =
NewRunnableMethod("RenderThread::ResumeShaderWarmup", this,
diff --git a/gfx/webrender_bindings/RenderThread.h b/gfx/webrender_bindings/RenderThread.h
@@ -360,6 +360,8 @@ class RenderThread final {
void SetBatteryInfo(const hal::BatteryInformation& aBatteryInfo);
bool GetPowerIsCharging();
+ void BeginShaderWarmupIfNeeded();
+
private:
static size_t sRendererCount;
static size_t sActiveRendererCount;
diff --git a/gfx/webrender_bindings/WebRenderAPI.cpp b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -191,6 +191,10 @@ class NewRenderer : public RendererEvent {
}
aRenderThread.AddRenderer(aWindowId, std::move(renderer));
+
+ // Kick off shader warmup, outside this NewRenderer task so that any
+ // threads which block on the NewRenderer work can proceed immediately.
+ aRenderThread.BeginShaderWarmupIfNeeded();
}
const char* Name() override { return "NewRenderer"; }