Bug 1335895 - part 4: Update GPUProcessManager so that it creates a new UiCompositorControllerChild for each session r=dvander
--- a/gfx/ipc/GPUProcessManager.cpp
+++ b/gfx/ipc/GPUProcessManager.cpp
@@ -249,48 +249,43 @@ GPUProcessManager::EnsureVRManager()
return;
}
mGPUChild->SendInitVRManager(Move(parentPipe));
VRManagerChild::InitWithGPUProcess(Move(childPipe));
}
#if defined(MOZ_WIDGET_ANDROID)
-void
-GPUProcessManager::EnsureUiCompositorController()
+already_AddRefed<UiCompositorControllerChild>
+GPUProcessManager::CreateUiCompositorController(nsBaseWidget* aWidget, const uint64_t aId)
{
- if (UiCompositorControllerChild::IsInitialized()) {
- return;
- }
-
- RefPtr<nsThread> uiThread;
-
- uiThread = GetAndroidUiThread();
-
- MOZ_ASSERT(uiThread);
+ RefPtr<UiCompositorControllerChild> result;
if (!EnsureGPUReady()) {
- UiCompositorControllerChild::InitSameProcess(uiThread);
- return;
- }
+ result = UiCompositorControllerChild::CreateForSameProcess(aId);
+ } else {
+ ipc::Endpoint<PUiCompositorControllerParent> parentPipe;
+ ipc::Endpoint<PUiCompositorControllerChild> childPipe;
+ nsresult rv = PUiCompositorController::CreateEndpoints(
+ mGPUChild->OtherPid(),
+ base::GetCurrentProcId(),
+ &parentPipe,
+ &childPipe);
+ if (NS_FAILED(rv)) {
+ DisableGPUProcess("Failed to create PUiCompositorController endpoints");
+ return nullptr;
+ }
- ipc::Endpoint<PUiCompositorControllerParent> parentPipe;
- ipc::Endpoint<PUiCompositorControllerChild> childPipe;
- nsresult rv = PUiCompositorController::CreateEndpoints(
- mGPUChild->OtherPid(),
- base::GetCurrentProcId(),
- &parentPipe,
- &childPipe);
- if (NS_FAILED(rv)) {
- DisableGPUProcess("Failed to create PUiCompositorController endpoints");
- return;
+ mGPUChild->SendInitUiCompositorController(aId, Move(parentPipe));
+ result = UiCompositorControllerChild::CreateForGPUProcess(mProcessToken, Move(childPipe));
}
-
- mGPUChild->SendInitUiCompositorController(Move(parentPipe));
- UiCompositorControllerChild::InitWithGPUProcess(uiThread, mProcessToken, Move(childPipe));
+ if (result) {
+ result->SetBaseWidget(aWidget);
+ }
+ return result.forget();
}
#endif // defined(MOZ_WIDGET_ANDROID)
void
GPUProcessManager::OnProcessLaunchComplete(GPUProcessHost* aHost)
{
MOZ_ASSERT(mProcess && mProcess == aHost);
@@ -545,19 +540,16 @@ GPUProcessManager::DestroyProcess()
mProcess->Shutdown();
mProcessToken = 0;
mProcess = nullptr;
mGPUChild = nullptr;
if (mVsyncBridge) {
mVsyncBridge->Close();
mVsyncBridge = nullptr;
}
-#if defined(MOZ_WIDGET_ANDROID)
- UiCompositorControllerChild::Shutdown();
-#endif // defined(MOZ_WIDGET_ANDROID)
#ifdef MOZ_CRASHREPORTER
CrashReporter::AnnotateCrashReport(
NS_LITERAL_CSTRING("GPUProcessStatus"),
NS_LITERAL_CSTRING("Destroyed"));
#endif
}
@@ -568,46 +560,55 @@ GPUProcessManager::CreateTopLevelComposi
const CompositorOptions& aOptions,
bool aUseExternalSurfaceSize,
const gfx::IntSize& aSurfaceSize)
{
uint64_t layerTreeId = AllocateLayerTreeId();
EnsureImageBridgeChild();
EnsureVRManager();
-#if defined(MOZ_WIDGET_ANDROID)
- EnsureUiCompositorController();
-#endif // defined(MOZ_WIDGET_ANDROID)
+
+ RefPtr<CompositorSession> session;
if (EnsureGPUReady()) {
- RefPtr<CompositorSession> session = CreateRemoteSession(
+ session = CreateRemoteSession(
aWidget,
aLayerManager,
layerTreeId,
aScale,
aOptions,
aUseExternalSurfaceSize,
aSurfaceSize);
- if (session) {
- return session;
+ if (!session) {
+ // We couldn't create a remote compositor, so abort the process.
+ DisableGPUProcess("Failed to create remote compositor");
}
-
- // We couldn't create a remote compositor, so abort the process.
- DisableGPUProcess("Failed to create remote compositor");
}
- return InProcessCompositorSession::Create(
- aWidget,
- aLayerManager,
- layerTreeId,
- aScale,
- aOptions,
- aUseExternalSurfaceSize,
- aSurfaceSize,
- AllocateNamespace());
+ if (!session) {
+ session = InProcessCompositorSession::Create(
+ aWidget,
+ aLayerManager,
+ layerTreeId,
+ aScale,
+ aOptions,
+ aUseExternalSurfaceSize,
+ aSurfaceSize,
+ AllocateNamespace());
+ }
+
+#if defined(MOZ_WIDGET_ANDROID)
+ if (session) {
+ // Nothing to do if controller gets a nullptr
+ RefPtr<UiCompositorControllerChild> controller = CreateUiCompositorController(aWidget, session->RootLayerTreeId());
+ session->SetUiCompositorControllerChild(controller);
+ }
+#endif // defined(MOZ_WIDGET_ANDROID)
+
+ return session;
}
RefPtr<CompositorSession>
GPUProcessManager::CreateRemoteSession(nsBaseWidget* aWidget,
LayerManager* aLayerManager,
const uint64_t& aRootLayerTreeId,
CSSToLayoutDeviceScale aScale,
const CompositorOptions& aOptions,
--- a/gfx/ipc/GPUProcessManager.h
+++ b/gfx/ipc/GPUProcessManager.h
@@ -26,16 +26,17 @@ class MemoryReportingProcess;
namespace layers {
class IAPZCTreeManager;
class CompositorOptions;
class CompositorSession;
class CompositorUpdateObserver;
class PCompositorBridgeChild;
class PImageBridgeChild;
class RemoteCompositorSession;
+class UiCompositorControllerChild;
} // namespace layers
namespace widget {
class CompositorWidget;
} // namespace widget
namespace dom {
class ContentParent;
class TabParent;
class PVideoDecoderManagerChild;
@@ -61,16 +62,17 @@ class GPUProcessManager final : public G
typedef layers::CompositorOptions CompositorOptions;
typedef layers::CompositorSession CompositorSession;
typedef layers::CompositorUpdateObserver CompositorUpdateObserver;
typedef layers::IAPZCTreeManager IAPZCTreeManager;
typedef layers::LayerManager LayerManager;
typedef layers::PCompositorBridgeChild PCompositorBridgeChild;
typedef layers::PImageBridgeChild PImageBridgeChild;
typedef layers::RemoteCompositorSession RemoteCompositorSession;
+ typedef layers::UiCompositorControllerChild UiCompositorControllerChild;
public:
static void Initialize();
static void Shutdown();
static GPUProcessManager* Get();
~GPUProcessManager();
@@ -208,17 +210,20 @@ private:
void HandleProcessLost();
void EnsureVsyncIOThread();
void ShutdownVsyncIOThread();
void EnsureImageBridgeChild();
void EnsureVRManager();
- void EnsureUiCompositorController();
+
+#if defined(MOZ_WIDGET_ANDROID)
+ already_AddRefed<UiCompositorControllerChild> CreateUiCompositorController(nsBaseWidget* aWidget, const uint64_t aId);
+#endif // defined(MOZ_WIDGET_ANDROID)
RefPtr<CompositorSession> CreateRemoteSession(
nsBaseWidget* aWidget,
LayerManager* aLayerManager,
const uint64_t& aRootLayerTreeId,
CSSToLayoutDeviceScale aScale,
const CompositorOptions& aOptions,
bool aUseExternalSurfaceSize,