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