RemoteCompositorSession.cpp (3387B)
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 "nsIWidget.h" 16 #if defined(MOZ_WIDGET_ANDROID) 17 # include "mozilla/layers/UiCompositorControllerChild.h" 18 #endif // defined(MOZ_WIDGET_ANDROID) 19 20 namespace mozilla { 21 namespace layers { 22 23 using namespace gfx; 24 using namespace widget; 25 26 RemoteCompositorSession::RemoteCompositorSession( 27 nsIWidget* aWidget, CompositorBridgeChild* aChild, 28 CompositorWidgetDelegate* aWidgetDelegate, APZCTreeManagerChild* aAPZ, 29 const LayersId& aRootLayerTreeId) 30 : CompositorSession(aWidget, aWidgetDelegate, aChild, aRootLayerTreeId), 31 mAPZ(aAPZ) { 32 MOZ_ASSERT(!gfxPlatform::IsHeadless()); 33 GPUProcessManager::Get()->RegisterRemoteProcessSession(this); 34 if (mAPZ) { 35 mAPZ->SetCompositorSession(this); 36 } 37 } 38 39 RemoteCompositorSession::~RemoteCompositorSession() { 40 // This should have been shutdown first. 41 MOZ_ASSERT(!mCompositorBridgeChild); 42 #if defined(MOZ_WIDGET_ANDROID) 43 MOZ_ASSERT(!mUiCompositorControllerChild); 44 #endif // defined(MOZ_WIDGET_ANDROID) 45 } 46 47 void RemoteCompositorSession::NotifySessionLost() { 48 // Hold a reference to mWidget since NotifyCompositorSessionLost may 49 // release the last reference mid-execution. 50 RefPtr<nsIWidget> widget(mWidget); 51 // Re-entrancy should be impossible: when we are being notified of a lost 52 // session, we have by definition not shut down yet. We will shutdown, but 53 // then will be removed from the notification list. 54 widget->NotifyCompositorSessionLost(this); 55 } 56 57 CompositorBridgeParent* RemoteCompositorSession::GetInProcessBridge() const { 58 return nullptr; 59 } 60 61 void RemoteCompositorSession::SetContentController( 62 GeckoContentController* aController) { 63 mContentController = aController; 64 mCompositorBridgeChild->SendPAPZConstructor(new APZChild(aController), 65 LayersId{0}); 66 } 67 68 GeckoContentController* RemoteCompositorSession::GetContentController() { 69 return mContentController.get(); 70 } 71 72 nsIWidget* RemoteCompositorSession::GetWidget() const { return mWidget; } 73 74 RefPtr<IAPZCTreeManager> RemoteCompositorSession::GetAPZCTreeManager() const { 75 return mAPZ; 76 } 77 78 void RemoteCompositorSession::Shutdown() { 79 mContentController = nullptr; 80 if (mAPZ) { 81 mAPZ->SetCompositorSession(nullptr); 82 mAPZ->Destroy(); 83 } 84 if (mCompositorBridgeChild) { 85 mCompositorBridgeChild->Destroy(); 86 mCompositorBridgeChild = nullptr; 87 } 88 mCompositorWidgetDelegate = nullptr; 89 mWidget = nullptr; 90 #if defined(MOZ_WIDGET_ANDROID) 91 if (mUiCompositorControllerChild) { 92 mUiCompositorControllerChild->Destroy(); 93 mUiCompositorControllerChild = nullptr; 94 } 95 #endif // defined(MOZ_WIDGET_ANDROID) 96 GPUProcessManager::Get()->UnregisterRemoteProcessSession(this); 97 } 98 99 } // namespace layers 100 } // namespace mozilla