Bug 1874684 - Part 28: Return DateDuration from DifferenceISODateTime. r=mgaudet
[gecko.git] / gfx / ipc / InProcessCompositorSession.cpp
blob9efb83b57aaa5702ecc3a5af21dd37228dd36b26
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 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,
47 aInnerWindowId);
48 MOZ_ASSERT(parent);
49 parent->InitSameProcess(widget, aRootLayerTreeId);
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;
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,
77 aController);
80 RefPtr<IAPZCTreeManager> InProcessCompositorSession::GetAPZCTreeManager()
81 const {
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
91 // thread.
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