1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=99: */
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 // so we can cast an APZCTreeManager to an IAPZCTreeManager
10 #include "mozilla/layers/APZCTreeManager.h"
11 #include "mozilla/layers/IAPZCTreeManager.h"
12 
13 namespace mozilla {
14 namespace layers {
15 
16 InProcessCompositorSession::InProcessCompositorSession(widget::CompositorWidget* aWidget,
17                                                        CompositorBridgeChild* aChild,
18                                                        CompositorBridgeParent* aParent)
19  : CompositorSession(aWidget->AsDelegate(), aChild, aParent->RootLayerTreeId()),
20    mCompositorBridgeParent(aParent),
21    mCompositorWidget(aWidget)
22 {
23 }
24 
25 /* static */ RefPtr<InProcessCompositorSession>
26 InProcessCompositorSession::Create(nsIWidget* aWidget,
27                                    LayerManager* aLayerManager,
28                                    const uint64_t& aRootLayerTreeId,
29                                    CSSToLayoutDeviceScale aScale,
30                                    bool aUseAPZ,
31                                    bool aUseExternalSurfaceSize,
32                                    const gfx::IntSize& aSurfaceSize)
33 {
34   CompositorWidgetInitData initData;
35   aWidget->GetCompositorWidgetInitData(&initData);
36 
37   RefPtr<CompositorWidget> widget = CompositorWidget::CreateLocal(initData, aWidget);
38   RefPtr<CompositorBridgeChild> child = new CompositorBridgeChild(aLayerManager);
39   RefPtr<CompositorBridgeParent> parent =
40     child->InitSameProcess(widget, aRootLayerTreeId, aScale, aUseAPZ, aUseExternalSurfaceSize, aSurfaceSize);
41 
42   return new InProcessCompositorSession(widget, child, parent);
43 }
44 
45 CompositorBridgeParent*
46 InProcessCompositorSession::GetInProcessBridge() const
47 {
48   return mCompositorBridgeParent;
49 }
50 
51 void
52 InProcessCompositorSession::SetContentController(GeckoContentController* aController)
53 {
54   mCompositorBridgeParent->SetControllerForLayerTree(mRootLayerTreeId, aController);
55 }
56 
57 RefPtr<IAPZCTreeManager>
58 InProcessCompositorSession::GetAPZCTreeManager() const
59 {
60   return mCompositorBridgeParent->GetAPZCTreeManager(mRootLayerTreeId);
61 }
62 
63 bool
64 InProcessCompositorSession::Reset(const nsTArray<LayersBackend>& aBackendHints, TextureFactoryIdentifier* aOutIdentifier)
65 {
66   return mCompositorBridgeParent->ResetCompositor(aBackendHints, aOutIdentifier);
67 }
68 
69 void
70 InProcessCompositorSession::Shutdown()
71 {
72   // Destroy will synchronously wait for the parent to acknowledge shutdown,
73   // at which point CBP will defer a Release on the compositor thread. We
74   // can safely release our reference now, and let the destructor run on either
75   // thread.
76   mCompositorBridgeChild->Destroy();
77   mCompositorBridgeChild = nullptr;
78   mCompositorBridgeParent = nullptr;
79   mCompositorWidget = nullptr;
80 }
81 
82 } // namespace layers
83 } // namespace mozilla
84