Bug 1744358 move MediaEngineDefault-specific MediaEngineSource classes out of header...
[gecko.git] / gfx / ipc / InProcessCompositorSession.cpp
blobb9fd2bba7e00f1cacccd31d6b0b93003679cc948
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"
19 namespace mozilla {
20 namespace layers {
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);
32 /* static */
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);
46 MOZ_ASSERT(parent);
47 parent->InitSameProcess(widget, aRootLayerTreeId);
49 RefPtr<CompositorBridgeChild> child =
50 CompositorManagerChild::CreateSameProcessWidgetCompositorBridge(
51 aLayerManager, aNamespace);
52 MOZ_ASSERT(child);
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,
68 aController);
71 RefPtr<IAPZCTreeManager> InProcessCompositorSession::GetAPZCTreeManager()
72 const {
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
82 // thread.
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);
96 } // namespace layers
97 } // namespace mozilla