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