InProcessCompositorSession.cpp (4143B)
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 "InProcessCompositorSession.h" 8 9 #include "mozilla/gfx/GPUProcessManager.h" 10 #include "mozilla/layers/CompositorBridgeChild.h" 11 #include "mozilla/layers/CompositorBridgeParent.h" 12 #include "mozilla/layers/CompositorManagerChild.h" 13 #include "mozilla/layers/CompositorManagerParent.h" 14 #include "mozilla/layers/IAPZCTreeManager.h" 15 #include "mozilla/widget/CompositorWidget.h" 16 #include "mozilla/widget/PlatformWidgetTypes.h" 17 #include "nsIWidget.h" 18 19 namespace mozilla { 20 namespace layers { 21 22 InProcessCompositorSession::InProcessCompositorSession( 23 nsIWidget* aWidget, widget::CompositorWidget* aCompositorWidget, 24 CompositorBridgeChild* aChild, CompositorBridgeParent* aParent) 25 : CompositorSession(aWidget, aCompositorWidget->AsDelegate(), aChild, 26 aParent->RootLayerTreeId()), 27 mCompositorBridgeParent(aParent), 28 mCompositorWidget(aCompositorWidget) { 29 gfx::GPUProcessManager::Get()->RegisterInProcessSession(this); 30 } 31 32 /* static */ 33 RefPtr<InProcessCompositorSession> InProcessCompositorSession::Create( 34 nsIWidget* aWidget, WebRenderLayerManager* aLayerManager, 35 const LayersId& aRootLayerTreeId, CSSToLayoutDeviceScale aScale, 36 const CompositorOptions& aOptions, bool aUseExternalSurfaceSize, 37 const gfx::IntSize& aSurfaceSize, uint32_t aNamespace, 38 uint64_t aInnerWindowId) { 39 widget::CompositorWidgetInitData initData; 40 aWidget->GetCompositorWidgetInitData(&initData); 41 42 RefPtr<CompositorWidget> widget = 43 CompositorWidget::CreateLocal(initData, aOptions, aWidget); 44 RefPtr<CompositorBridgeParent> parent = 45 CompositorManagerParent::CreateSameProcessWidgetCompositorBridge( 46 aScale, aOptions, aUseExternalSurfaceSize, aSurfaceSize, 47 aInnerWindowId); 48 MOZ_ASSERT(parent); 49 parent->InitSameProcess(widget, aRootLayerTreeId); 50 51 RefPtr<CompositorBridgeChild> child = 52 CompositorManagerChild::CreateSameProcessWidgetCompositorBridge( 53 aLayerManager, aNamespace); 54 MOZ_ASSERT(child); 55 if (!child) { 56 gfxCriticalNote << "Failed to create CompositorBridgeChild"; 57 return nullptr; 58 } 59 60 return new InProcessCompositorSession(aWidget, widget, child, parent); 61 } 62 63 void InProcessCompositorSession::NotifySessionLost() { 64 // Hold a reference to mWidget since NotifyCompositorSessionLost may 65 // release the last reference mid-execution. 66 RefPtr<nsIWidget> widget(mWidget); 67 widget->NotifyCompositorSessionLost(this); 68 } 69 70 CompositorBridgeParent* InProcessCompositorSession::GetInProcessBridge() const { 71 return mCompositorBridgeParent; 72 } 73 74 void InProcessCompositorSession::SetContentController( 75 GeckoContentController* aController) { 76 mCompositorBridgeParent->SetControllerForLayerTree(mRootLayerTreeId, 77 aController); 78 } 79 80 RefPtr<IAPZCTreeManager> InProcessCompositorSession::GetAPZCTreeManager() 81 const { 82 return mCompositorBridgeParent->GetAPZCTreeManager(mRootLayerTreeId); 83 } 84 85 nsIWidget* InProcessCompositorSession::GetWidget() const { return mWidget; } 86 87 void InProcessCompositorSession::Shutdown() { 88 // Destroy will synchronously wait for the parent to acknowledge shutdown, 89 // at which point CBP will defer a Release on the compositor thread. We 90 // can safely release our reference now, and let the destructor run on either 91 // thread. 92 #if defined(MOZ_WIDGET_ANDROID) 93 if (mUiCompositorControllerChild) { 94 mUiCompositorControllerChild->Destroy(); 95 mUiCompositorControllerChild = nullptr; 96 } 97 #endif // defined(MOZ_WIDGET_ANDROID) 98 if (mCompositorBridgeChild) { 99 mCompositorBridgeChild->Destroy(); 100 mCompositorBridgeChild = nullptr; 101 } 102 mCompositorBridgeParent = nullptr; 103 mCompositorWidget = nullptr; 104 gfx::GPUProcessManager::Get()->UnregisterInProcessSession(this); 105 } 106 107 } // namespace layers 108 } // namespace mozilla