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/. */
7 #include "InProcessCompositorSession.h"
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"
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);
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 uint64_t aInnerWindowId
) {
39 widget::CompositorWidgetInitData initData
;
40 aWidget
->GetCompositorWidgetInitData(&initData
);
42 RefPtr
<CompositorWidget
> widget
=
43 CompositorWidget::CreateLocal(initData
, aOptions
, aWidget
);
44 RefPtr
<CompositorBridgeParent
> parent
=
45 CompositorManagerParent::CreateSameProcessWidgetCompositorBridge(
46 aScale
, aOptions
, aUseExternalSurfaceSize
, aSurfaceSize
,
49 parent
->InitSameProcess(widget
, aRootLayerTreeId
);
51 RefPtr
<CompositorBridgeChild
> child
=
52 CompositorManagerChild::CreateSameProcessWidgetCompositorBridge(
53 aLayerManager
, aNamespace
);
56 gfxCriticalNote
<< "Failed to create CompositorBridgeChild";
60 return new InProcessCompositorSession(aWidget
, widget
, child
, parent
);
63 void InProcessCompositorSession::NotifySessionLost() {
64 // Hold a reference to mWidget since NotifyCompositorSessionLost may
65 // release the last reference mid-execution.
66 RefPtr
<nsBaseWidget
> widget(mWidget
);
67 widget
->NotifyCompositorSessionLost(this);
70 CompositorBridgeParent
* InProcessCompositorSession::GetInProcessBridge() const {
71 return mCompositorBridgeParent
;
74 void InProcessCompositorSession::SetContentController(
75 GeckoContentController
* aController
) {
76 mCompositorBridgeParent
->SetControllerForLayerTree(mRootLayerTreeId
,
80 RefPtr
<IAPZCTreeManager
> InProcessCompositorSession::GetAPZCTreeManager()
82 return mCompositorBridgeParent
->GetAPZCTreeManager(mRootLayerTreeId
);
85 nsIWidget
* InProcessCompositorSession::GetWidget() const { return mWidget
; }
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
92 #if defined(MOZ_WIDGET_ANDROID)
93 if (mUiCompositorControllerChild
) {
94 mUiCompositorControllerChild
->Destroy();
95 mUiCompositorControllerChild
= nullptr;
97 #endif // defined(MOZ_WIDGET_ANDROID)
98 if (mCompositorBridgeChild
) {
99 mCompositorBridgeChild
->Destroy();
100 mCompositorBridgeChild
= nullptr;
102 mCompositorBridgeParent
= nullptr;
103 mCompositorWidget
= nullptr;
104 gfx::GPUProcessManager::Get()->UnregisterInProcessSession(this);
107 } // namespace layers
108 } // namespace mozilla