1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "RemoteCompositorSession.h"
8 #include "gfxPlatform.h"
9 #include "mozilla/VsyncDispatcher.h"
10 #include "mozilla/gfx/GPUProcessManager.h"
11 #include "mozilla/layers/APZChild.h"
12 #include "mozilla/layers/APZCTreeManagerChild.h"
13 #include "mozilla/layers/CompositorBridgeChild.h"
14 #include "mozilla/layers/GeckoContentController.h"
15 #include "mozilla/Unused.h"
16 #include "nsBaseWidget.h"
17 #if defined(MOZ_WIDGET_ANDROID)
18 # include "mozilla/layers/UiCompositorControllerChild.h"
19 #endif // defined(MOZ_WIDGET_ANDROID)
20
21 namespace mozilla {
22 namespace layers {
23
24 using namespace gfx;
25 using namespace widget;
26
RemoteCompositorSession(nsBaseWidget * aWidget,CompositorBridgeChild * aChild,CompositorWidgetDelegate * aWidgetDelegate,APZCTreeManagerChild * aAPZ,const LayersId & aRootLayerTreeId)27 RemoteCompositorSession::RemoteCompositorSession(
28 nsBaseWidget* aWidget, CompositorBridgeChild* aChild,
29 CompositorWidgetDelegate* aWidgetDelegate, APZCTreeManagerChild* aAPZ,
30 const LayersId& aRootLayerTreeId)
31 : CompositorSession(aWidget, aWidgetDelegate, aChild, aRootLayerTreeId),
32 mAPZ(aAPZ) {
33 MOZ_ASSERT(!gfxPlatform::IsHeadless());
34 GPUProcessManager::Get()->RegisterRemoteProcessSession(this);
35 if (mAPZ) {
36 mAPZ->SetCompositorSession(this);
37 }
38 }
39
~RemoteCompositorSession()40 RemoteCompositorSession::~RemoteCompositorSession() {
41 // This should have been shutdown first.
42 MOZ_ASSERT(!mCompositorBridgeChild);
43 #if defined(MOZ_WIDGET_ANDROID)
44 MOZ_ASSERT(!mUiCompositorControllerChild);
45 #endif // defined(MOZ_WIDGET_ANDROID)
46 }
47
NotifySessionLost()48 void RemoteCompositorSession::NotifySessionLost() {
49 // Re-entrancy should be impossible: when we are being notified of a lost
50 // session, we have by definition not shut down yet. We will shutdown, but
51 // then will be removed from the notification list.
52 mWidget->NotifyCompositorSessionLost(this);
53 }
54
GetInProcessBridge() const55 CompositorBridgeParent* RemoteCompositorSession::GetInProcessBridge() const {
56 return nullptr;
57 }
58
SetContentController(GeckoContentController * aController)59 void RemoteCompositorSession::SetContentController(
60 GeckoContentController* aController) {
61 mContentController = aController;
62 mCompositorBridgeChild->SendPAPZConstructor(new APZChild(aController),
63 LayersId{0});
64 }
65
GetContentController()66 GeckoContentController* RemoteCompositorSession::GetContentController() {
67 return mContentController.get();
68 }
69
GetWidget() const70 nsIWidget* RemoteCompositorSession::GetWidget() const { return mWidget; }
71
GetAPZCTreeManager() const72 RefPtr<IAPZCTreeManager> RemoteCompositorSession::GetAPZCTreeManager() const {
73 return mAPZ;
74 }
75
Shutdown()76 void RemoteCompositorSession::Shutdown() {
77 mContentController = nullptr;
78 if (mAPZ) {
79 mAPZ->SetCompositorSession(nullptr);
80 mAPZ->Destroy();
81 }
82 mCompositorBridgeChild->Destroy();
83 mCompositorBridgeChild = nullptr;
84 mCompositorWidgetDelegate = nullptr;
85 mWidget = nullptr;
86 #if defined(MOZ_WIDGET_ANDROID)
87 if (mUiCompositorControllerChild) {
88 mUiCompositorControllerChild->Destroy();
89 mUiCompositorControllerChild = nullptr;
90 }
91 #endif // defined(MOZ_WIDGET_ANDROID)
92 GPUProcessManager::Get()->UnregisterRemoteProcessSession(this);
93 }
94
95 } // namespace layers
96 } // namespace mozilla
97