commit cabf5effe565ad63f4d35c3e8ec65f95a32b1fec
parent 20a1fb35a4d5c2f2ea6c865ecebc8e4bee6f86c9
Author: Andrew Osmond <aosmond@gmail.com>
Date: Tue, 23 Dec 2025 05:20:16 +0000
Bug 2007374 - Only create RemoteBackbuffer threads for SWGL on Windows. r=gfx-reviewers,lsalzman
remote_backbuffer::Provider is only used for SWGL with software
compositing. When we are using SWGL + D3D11 compositing, or full
hardware WebRender, we don't use it, and if we need to fallback, we will
do so by explicitly recreating the remote compositors.
For now, until bug 2007373 is able to land, we will still create these
threads for SWGL + D3D11 compositing since it can implicitly fallback if
it is failing at CompositorD3D11 creation.
Differential Revision: https://phabricator.services.mozilla.com/D277342
Diffstat:
10 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/gfx/ipc/GPUProcessManager.cpp b/gfx/ipc/GPUProcessManager.cpp
@@ -1327,7 +1327,7 @@ RefPtr<CompositorSession> GPUProcessManager::CreateRemoteSession(
if (!child->SendPCompositorWidgetConstructor(widget, std::move(initData))) {
return nullptr;
}
- if (!widget->Initialize()) {
+ if (!widget->Initialize(aOptions)) {
return nullptr;
}
if (!child->SendInitialize(aRootLayerTreeId)) {
diff --git a/widget/android/CompositorWidgetChild.cpp b/widget/android/CompositorWidgetChild.cpp
@@ -20,7 +20,10 @@ CompositorWidgetChild::CompositorWidgetChild(
CompositorWidgetChild::~CompositorWidgetChild() = default;
-bool CompositorWidgetChild::Initialize() { return true; }
+bool CompositorWidgetChild::Initialize(
+ const layers::CompositorOptions& aOptions) {
+ return true;
+}
mozilla::ipc::IPCResult CompositorWidgetChild::RecvObserveVsync() {
mVsyncDispatcher->SetCompositorVsyncObserver(mVsyncObserver);
diff --git a/widget/android/CompositorWidgetChild.h b/widget/android/CompositorWidgetChild.h
@@ -22,7 +22,7 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
const CompositorWidgetInitData&);
- bool Initialize();
+ bool Initialize(const layers::CompositorOptions& aOptions);
mozilla::ipc::IPCResult RecvObserveVsync() override;
mozilla::ipc::IPCResult RecvUnobserveVsync() override;
diff --git a/widget/cocoa/CompositorWidgetChild.cpp b/widget/cocoa/CompositorWidgetChild.cpp
@@ -20,7 +20,10 @@ CompositorWidgetChild::CompositorWidgetChild(
CompositorWidgetChild::~CompositorWidgetChild() = default;
-bool CompositorWidgetChild::Initialize() { return true; }
+bool CompositorWidgetChild::Initialize(
+ const layers::CompositorOptions& aOptions) {
+ return true;
+}
void CompositorWidgetChild::Shutdown() { (void)Send__delete__(this); }
diff --git a/widget/cocoa/CompositorWidgetChild.h b/widget/cocoa/CompositorWidgetChild.h
@@ -22,7 +22,7 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
const CompositorWidgetInitData&);
- bool Initialize();
+ bool Initialize(const layers::CompositorOptions& aOptions);
void Shutdown();
mozilla::ipc::IPCResult RecvObserveVsync() override;
diff --git a/widget/gtk/CompositorWidgetChild.cpp b/widget/gtk/CompositorWidgetChild.cpp
@@ -21,7 +21,10 @@ CompositorWidgetChild::CompositorWidgetChild(
CompositorWidgetChild::~CompositorWidgetChild() = default;
-bool CompositorWidgetChild::Initialize() { return true; }
+bool CompositorWidgetChild::Initialize(
+ const layers::CompositorOptions& aOptions) {
+ return true;
+}
mozilla::ipc::IPCResult CompositorWidgetChild::RecvObserveVsync() {
mVsyncDispatcher->SetCompositorVsyncObserver(mVsyncObserver);
diff --git a/widget/gtk/CompositorWidgetChild.h b/widget/gtk/CompositorWidgetChild.h
@@ -22,7 +22,7 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
const CompositorWidgetInitData&);
- bool Initialize();
+ bool Initialize(const layers::CompositorOptions& aOptions);
mozilla::ipc::IPCResult RecvObserveVsync() override;
mozilla::ipc::IPCResult RecvUnobserveVsync() override;
diff --git a/widget/windows/CompositorWidgetChild.cpp b/widget/windows/CompositorWidgetChild.cpp
@@ -31,7 +31,13 @@ CompositorWidgetChild::CompositorWidgetChild(
CompositorWidgetChild::~CompositorWidgetChild() {}
-bool CompositorWidgetChild::Initialize() {
+bool CompositorWidgetChild::Initialize(
+ const layers::CompositorOptions& aOptions) {
+ // We only use remote_backbuffer::Provider with software WebRender.
+ if (!aOptions.UseSoftwareWebRender()) {
+ return true;
+ }
+
mRemoteBackbufferProvider = std::make_unique<remote_backbuffer::Provider>();
if (!mRemoteBackbufferProvider->Initialize(mWnd, OtherPid())) {
return false;
diff --git a/widget/windows/CompositorWidgetChild.h b/widget/windows/CompositorWidgetChild.h
@@ -28,7 +28,7 @@ class CompositorWidgetChild final : public PCompositorWidgetChild,
RefPtr<CompositorWidgetVsyncObserver> aVsyncObserver,
const CompositorWidgetInitData& aInitData);
- bool Initialize();
+ bool Initialize(const layers::CompositorOptions& aOptions);
void EnterPresentLock() override;
void LeavePresentLock() override;
diff --git a/widget/windows/CompositorWidgetParent.cpp b/widget/windows/CompositorWidgetParent.cpp
@@ -70,12 +70,19 @@ LayoutDeviceIntSize CompositorWidgetParent::GetClientSize() {
already_AddRefed<gfx::DrawTarget>
CompositorWidgetParent::StartRemoteDrawingInRegion(
const LayoutDeviceIntRegion& aInvalidRegion) {
- MOZ_ASSERT(mRemoteBackbufferClient);
+ if (!mRemoteBackbufferClient) {
+ MOZ_DIAGNOSTIC_CRASH("Missing mRemoteBackbufferClient for SW compositing!");
+ return nullptr;
+ }
return mRemoteBackbufferClient->BorrowDrawTarget();
}
void CompositorWidgetParent::EndRemoteDrawingInRegion(
gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) {
+ if (!mRemoteBackbufferClient) {
+ MOZ_DIAGNOSTIC_CRASH("Missing mRemoteBackbufferClient for SW compositing!");
+ return;
+ }
(void)mRemoteBackbufferClient->PresentDrawTarget(
aInvalidRegion.ToUnknownRegion());
}