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 widget::CompositorWidgetInitData initData
;
39 aWidget
->GetCompositorWidgetInitData(&initData
);
41 RefPtr
<CompositorWidget
> widget
=
42 CompositorWidget::CreateLocal(initData
, aOptions
, aWidget
);
43 RefPtr
<CompositorBridgeParent
> parent
=
44 CompositorManagerParent::CreateSameProcessWidgetCompositorBridge(
45 aScale
, aOptions
, aUseExternalSurfaceSize
, aSurfaceSize
);
47 parent
->InitSameProcess(widget
, aRootLayerTreeId
);
49 RefPtr
<CompositorBridgeChild
> child
=
50 CompositorManagerChild::CreateSameProcessWidgetCompositorBridge(
51 aLayerManager
, aNamespace
);
54 return new InProcessCompositorSession(aWidget
, widget
, child
, parent
);
57 void InProcessCompositorSession::NotifySessionLost() {
58 mWidget
->NotifyCompositorSessionLost(this);
61 CompositorBridgeParent
* InProcessCompositorSession::GetInProcessBridge() const {
62 return mCompositorBridgeParent
;
65 void InProcessCompositorSession::SetContentController(
66 GeckoContentController
* aController
) {
67 mCompositorBridgeParent
->SetControllerForLayerTree(mRootLayerTreeId
,
71 RefPtr
<IAPZCTreeManager
> InProcessCompositorSession::GetAPZCTreeManager()
73 return mCompositorBridgeParent
->GetAPZCTreeManager(mRootLayerTreeId
);
76 nsIWidget
* InProcessCompositorSession::GetWidget() const { return mWidget
; }
78 void InProcessCompositorSession::Shutdown() {
79 // Destroy will synchronously wait for the parent to acknowledge shutdown,
80 // at which point CBP will defer a Release on the compositor thread. We
81 // can safely release our reference now, and let the destructor run on either
83 #if defined(MOZ_WIDGET_ANDROID)
84 if (mUiCompositorControllerChild
) {
85 mUiCompositorControllerChild
->Destroy();
86 mUiCompositorControllerChild
= nullptr;
88 #endif // defined(MOZ_WIDGET_ANDROID)
89 mCompositorBridgeChild
->Destroy();
90 mCompositorBridgeChild
= nullptr;
91 mCompositorBridgeParent
= nullptr;
92 mCompositorWidget
= nullptr;
93 gfx::GPUProcessManager::Get()->UnregisterInProcessSession(this);
97 } // namespace mozilla