tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit be434283b5b567de46b466aeadf6bdaaa874b161
parent 565db6f03a080c85e1801e0fee948291e02e16b7
Author: Jamie Nicol <jnicol@mozilla.com>
Date:   Mon, 24 Nov 2025 15:57:47 +0000

Bug 2001152 - Initialize UiCompositorController along with rest of CompositorSession. r=aosmond

Instead of doing it just afterwards. The motivation for this is to
provide access to the CompositorBridgeChild when initializing the
UiCompositorController, which will be required by the next patch in
the series.

This should have no effect in the successful case. In case of failure,
however, it will now take the OnProcessUnexpectedShutdown() path and
perhaps retry creating the GPU process, rather than just immediately
disabling it. This brings it in line with how we handle failure to
create the session's other actors.

Differential Revision: https://phabricator.services.mozilla.com/D273238

Diffstat:
Mgfx/ipc/CompositorSession.cpp | 15++++++++++-----
Mgfx/ipc/CompositorSession.h | 21+++++----------------
Mgfx/ipc/GPUProcessManager.cpp | 72++++++++++++++++++++++++++----------------------------------------------
Mgfx/ipc/GPUProcessManager.h | 5-----
Mgfx/ipc/InProcessCompositorSession.cpp | 19++++++++++++++++---
Mgfx/ipc/InProcessCompositorSession.h | 3++-
Mgfx/ipc/RemoteCompositorSession.cpp | 4+++-
Mgfx/ipc/RemoteCompositorSession.h | 1+
8 files changed, 63 insertions(+), 77 deletions(-)

diff --git a/gfx/ipc/CompositorSession.cpp b/gfx/ipc/CompositorSession.cpp @@ -4,12 +4,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "CompositorSession.h" -#include "base/process_util.h" -#include "GPUChild.h" -#include "mozilla/gfx/Logging.h" -#include "mozilla/gfx/GPUProcessHost.h" #include "mozilla/layers/CompositorBridgeChild.h" -#include "mozilla/layers/CompositorBridgeParent.h" +#include "mozilla/layers/UiCompositorControllerChild.h" namespace mozilla { namespace layers { @@ -19,10 +15,12 @@ using namespace gfx; CompositorSession::CompositorSession(nsIWidget* aWidget, CompositorWidgetDelegate* aDelegate, CompositorBridgeChild* aChild, + UiCompositorControllerChild* aUiController, const LayersId& aRootLayerTreeId) : mWidget(aWidget), mCompositorWidgetDelegate(aDelegate), mCompositorBridgeChild(aChild), + mUiCompositorControllerChild(aUiController), mRootLayerTreeId(aRootLayerTreeId) {} CompositorSession::~CompositorSession() = default; @@ -31,5 +29,12 @@ CompositorBridgeChild* CompositorSession::GetCompositorBridgeChild() { return mCompositorBridgeChild; } +#if defined(MOZ_WIDGET_ANDROID) +RefPtr<UiCompositorControllerChild> +CompositorSession::GetUiCompositorControllerChild() const { + return mUiCompositorControllerChild; +} +#endif + } // namespace layers } // namespace mozilla diff --git a/gfx/ipc/CompositorSession.h b/gfx/ipc/CompositorSession.h @@ -10,9 +10,6 @@ #include "mozilla/layers/LayersTypes.h" #include "mozilla/layers/CompositorTypes.h" #include "nsISupportsImpl.h" -#if defined(MOZ_WIDGET_ANDROID) -# include "mozilla/layers/UiCompositorControllerChild.h" -#endif // defined(MOZ_WIDGET_ANDROID) class nsIWidget; @@ -32,6 +29,7 @@ class IAPZCTreeManager; class CompositorBridgeParent; class CompositorBridgeChild; class ClientLayerManager; +class UiCompositorControllerChild; // A CompositorSession provides access to a compositor without exposing whether // or not it's in-process or out-of-process. @@ -70,20 +68,12 @@ class CompositorSession { LayersId RootLayerTreeId() const { return mRootLayerTreeId; } #if defined(MOZ_WIDGET_ANDROID) - // Set the UiCompositorControllerChild after Session creation so the Session - // constructor doesn't get mucked up for other platforms. - void SetUiCompositorControllerChild( - RefPtr<UiCompositorControllerChild>&& aUiController) { - mUiCompositorControllerChild = std::move(aUiController); - } - - RefPtr<UiCompositorControllerChild> GetUiCompositorControllerChild() { - return mUiCompositorControllerChild; - } + RefPtr<UiCompositorControllerChild> GetUiCompositorControllerChild() const; #endif // defined(MOZ_WIDGET_ANDROID) protected: CompositorSession(nsIWidget* aWidget, CompositorWidgetDelegate* aDelegate, CompositorBridgeChild* aChild, + UiCompositorControllerChild* aUiController, const LayersId& aRootLayerTreeId); virtual ~CompositorSession(); @@ -91,10 +81,9 @@ class CompositorSession { nsIWidget* mWidget; CompositorWidgetDelegate* mCompositorWidgetDelegate; RefPtr<CompositorBridgeChild> mCompositorBridgeChild; - LayersId mRootLayerTreeId; -#if defined(MOZ_WIDGET_ANDROID) RefPtr<UiCompositorControllerChild> mUiCompositorControllerChild; -#endif // defined(MOZ_WIDGET_ANDROID) + LayersId mRootLayerTreeId; + private: DISALLOW_COPY_AND_ASSIGN(CompositorSession); }; diff --git a/gfx/ipc/GPUProcessManager.cpp b/gfx/ipc/GPUProcessManager.cpp @@ -41,6 +41,7 @@ #include "mozilla/layers/InProcessCompositorSession.h" #include "mozilla/layers/LayerTreeOwnerTracker.h" #include "mozilla/layers/RemoteCompositorSession.h" +#include "mozilla/layers/UiCompositorControllerChild.h" #include "mozilla/layers/VideoBridgeParent.h" #include "mozilla/webrender/RenderThread.h" #include "mozilla/widget/PlatformWidgetTypes.h" @@ -65,8 +66,6 @@ #if defined(MOZ_WIDGET_ANDROID) # include "mozilla/java/SurfaceControlManagerWrappers.h" -# include "mozilla/widget/AndroidUiThread.h" -# include "mozilla/layers/UiCompositorControllerChild.h" #endif // defined(MOZ_WIDGET_ANDROID) #if defined(XP_WIN) @@ -550,39 +549,6 @@ bool GPUProcessManager::EnsureVRManager() { return true; } -#if defined(MOZ_WIDGET_ANDROID) -RefPtr<UiCompositorControllerChild> -GPUProcessManager::CreateUiCompositorController(nsIWidget* aWidget, - const LayersId aId) { - MOZ_DIAGNOSTIC_ASSERT(IsGPUReady()); - - if (!mGPUChild) { - return UiCompositorControllerChild::CreateForSameProcess(aId, aWidget); - } - - ipc::Endpoint<PUiCompositorControllerParent> parentPipe; - ipc::Endpoint<PUiCompositorControllerChild> childPipe; - nsresult rv = PUiCompositorController::CreateEndpoints( - mGPUChild->OtherEndpointProcInfo(), ipc::EndpointProcInfo::Current(), - &parentPipe, &childPipe); - if (NS_FAILED(rv)) { - DisableGPUProcess("Failed to create PUiCompositorController endpoints"); - return nullptr; - } - - mGPUChild->SendInitUiCompositorController(aId, std::move(parentPipe)); - RefPtr<UiCompositorControllerChild> result = - UiCompositorControllerChild::CreateForGPUProcess( - mProcessToken, std::move(childPipe), aWidget); - - if (result) { - result->SetCompositorSurfaceManager( - mProcess->GetCompositorSurfaceManager()); - } - return result; -} -#endif // defined(MOZ_WIDGET_ANDROID) - void GPUProcessManager::OnProcessLaunchComplete(GPUProcessHost* aHost) { MOZ_ASSERT(mProcess && mProcess == aHost); @@ -1285,16 +1251,6 @@ already_AddRefed<CompositorSession> GPUProcessManager::CreateTopLevelCompositor( aInnerWindowId); } -#if defined(MOZ_WIDGET_ANDROID) - if (session) { - // Nothing to do if controller gets a nullptr - auto controller = - CreateUiCompositorController(aWidget, session->RootLayerTreeId()); - MOZ_ASSERT(controller); - session->SetUiCompositorControllerChild(std::move(controller)); - } -#endif // defined(MOZ_WIDGET_ANDROID) - *aRetryOut = false; return session.forget(); } @@ -1362,7 +1318,31 @@ RefPtr<CompositorSession> GPUProcessManager::CreateRemoteSession( apz->SetInputBridge(inputBridge); } - return new RemoteCompositorSession(aWidget, child, widget, apz, + RefPtr<UiCompositorControllerChild> uiController = nullptr; +# if defined(MOZ_WIDGET_ANDROID) + { + ipc::Endpoint<PUiCompositorControllerParent> parentPipe; + ipc::Endpoint<PUiCompositorControllerChild> childPipe; + nsresult rv = PUiCompositorController::CreateEndpoints( + mGPUChild->OtherEndpointProcInfo(), ipc::EndpointProcInfo::Current(), + &parentPipe, &childPipe); + if (NS_FAILED(rv)) { + return nullptr; + } + mGPUChild->SendInitUiCompositorController(aRootLayerTreeId, + std::move(parentPipe)); + uiController = UiCompositorControllerChild::CreateForGPUProcess( + mProcessToken, std::move(childPipe), aWidget); + MOZ_ASSERT(uiController); + if (!uiController) { + return nullptr; + } + uiController->SetCompositorSurfaceManager( + mProcess->GetCompositorSurfaceManager()); + } +# endif + + return new RemoteCompositorSession(aWidget, child, widget, apz, uiController, aRootLayerTreeId); #else gfxCriticalNote << "Platform does not support out-of-process compositing"; diff --git a/gfx/ipc/GPUProcessManager.h b/gfx/ipc/GPUProcessManager.h @@ -338,11 +338,6 @@ class GPUProcessManager final : public GPUProcessHost::Listener { void SetProcessIsForeground(); #endif -#if defined(MOZ_WIDGET_ANDROID) - RefPtr<UiCompositorControllerChild> CreateUiCompositorController( - nsIWidget* aWidget, const LayersId aId); -#endif // defined(MOZ_WIDGET_ANDROID) - RefPtr<CompositorSession> CreateRemoteSession( nsIWidget* aWidget, WebRenderLayerManager* aLayerManager, const LayersId& aRootLayerTreeId, CSSToLayoutDeviceScale aScale, diff --git a/gfx/ipc/InProcessCompositorSession.cpp b/gfx/ipc/InProcessCompositorSession.cpp @@ -12,6 +12,7 @@ #include "mozilla/layers/CompositorManagerChild.h" #include "mozilla/layers/CompositorManagerParent.h" #include "mozilla/layers/IAPZCTreeManager.h" +#include "mozilla/layers/UiCompositorControllerChild.h" #include "mozilla/widget/CompositorWidget.h" #include "mozilla/widget/PlatformWidgetTypes.h" #include "nsIWidget.h" @@ -21,9 +22,10 @@ namespace layers { InProcessCompositorSession::InProcessCompositorSession( nsIWidget* aWidget, widget::CompositorWidget* aCompositorWidget, - CompositorBridgeChild* aChild, CompositorBridgeParent* aParent) + CompositorBridgeChild* aChild, CompositorBridgeParent* aParent, + UiCompositorControllerChild* aUiController) : CompositorSession(aWidget, aCompositorWidget->AsDelegate(), aChild, - aParent->RootLayerTreeId()), + aUiController, aParent->RootLayerTreeId()), mCompositorBridgeParent(aParent), mCompositorWidget(aCompositorWidget) { gfx::GPUProcessManager::Get()->RegisterInProcessSession(this); @@ -57,7 +59,18 @@ RefPtr<InProcessCompositorSession> InProcessCompositorSession::Create( return nullptr; } - return new InProcessCompositorSession(aWidget, widget, child, parent); + RefPtr<UiCompositorControllerChild> uiController = nullptr; +#if defined(MOZ_WIDGET_ANDROID) + uiController = UiCompositorControllerChild::CreateForSameProcess( + aRootLayerTreeId, aWidget); + MOZ_ASSERT(uiController); + if (!uiController) { + return nullptr; + } +#endif + + return new InProcessCompositorSession(aWidget, widget, child, parent, + uiController); } void InProcessCompositorSession::NotifySessionLost() { diff --git a/gfx/ipc/InProcessCompositorSession.h b/gfx/ipc/InProcessCompositorSession.h @@ -41,7 +41,8 @@ class InProcessCompositorSession final : public CompositorSession { InProcessCompositorSession(nsIWidget* aWidget, widget::CompositorWidget* aCompositorWidget, CompositorBridgeChild* aChild, - CompositorBridgeParent* aParent); + CompositorBridgeParent* aParent, + UiCompositorControllerChild* aUiController); private: RefPtr<CompositorBridgeParent> mCompositorBridgeParent; diff --git a/gfx/ipc/RemoteCompositorSession.cpp b/gfx/ipc/RemoteCompositorSession.cpp @@ -26,8 +26,10 @@ using namespace widget; RemoteCompositorSession::RemoteCompositorSession( nsIWidget* aWidget, CompositorBridgeChild* aChild, CompositorWidgetDelegate* aWidgetDelegate, APZCTreeManagerChild* aAPZ, + UiCompositorControllerChild* aUiController, const LayersId& aRootLayerTreeId) - : CompositorSession(aWidget, aWidgetDelegate, aChild, aRootLayerTreeId), + : CompositorSession(aWidget, aWidgetDelegate, aChild, aUiController, + aRootLayerTreeId), mAPZ(aAPZ) { MOZ_ASSERT(!gfxPlatform::IsHeadless()); GPUProcessManager::Get()->RegisterRemoteProcessSession(this); diff --git a/gfx/ipc/RemoteCompositorSession.h b/gfx/ipc/RemoteCompositorSession.h @@ -22,6 +22,7 @@ class RemoteCompositorSession final : public CompositorSession { RemoteCompositorSession(nsIWidget* aWidget, CompositorBridgeChild* aChild, CompositorWidgetDelegate* aWidgetDelegate, APZCTreeManagerChild* aAPZ, + UiCompositorControllerChild* aUiController, const LayersId& aRootLayerTreeId); virtual ~RemoteCompositorSession();