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/. */
6 
7 #ifndef MOZILLA_GFX_COMPOSITORMANAGERCHILD_H
8 #define MOZILLA_GFX_COMPOSITORMANAGERCHILD_H
9 
10 #include <stddef.h>  // for size_t
11 #include <stdint.h>  // for uint32_t, uint64_t
12 #include "mozilla/Atomics.h"
13 #include "mozilla/Attributes.h"  // for override
14 #include "mozilla/RefPtr.h"      // for already_AddRefed
15 #include "mozilla/StaticPtr.h"   // for StaticRefPtr
16 #include "mozilla/layers/PCompositorManagerChild.h"
17 
18 namespace mozilla {
19 namespace layers {
20 
21 class CompositorBridgeChild;
22 class CompositorManagerParent;
23 class WebRenderLayerManager;
24 
25 class CompositorManagerChild : public PCompositorManagerChild {
26   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositorManagerChild)
27 
28  public:
29   static bool IsInitialized(uint64_t aProcessToken);
30   static void InitSameProcess(uint32_t aNamespace, uint64_t aProcessToken);
31   static bool Init(Endpoint<PCompositorManagerChild>&& aEndpoint,
32                    uint32_t aNamespace, uint64_t aProcessToken = 0);
33   static void Shutdown();
34   static void OnGPUProcessLost(uint64_t aProcessToken);
35 
36   static bool CreateContentCompositorBridge(uint32_t aNamespace);
37 
38   static already_AddRefed<CompositorBridgeChild> CreateWidgetCompositorBridge(
39       uint64_t aProcessToken, WebRenderLayerManager* aLayerManager,
40       uint32_t aNamespace, CSSToLayoutDeviceScale aScale,
41       const CompositorOptions& aOptions, bool aUseExternalSurfaceSize,
42       const gfx::IntSize& aSurfaceSize);
43 
44   static already_AddRefed<CompositorBridgeChild>
45   CreateSameProcessWidgetCompositorBridge(WebRenderLayerManager* aLayerManager,
46                                           uint32_t aNamespace);
47 
GetInstance()48   static CompositorManagerChild* GetInstance() {
49     MOZ_ASSERT(NS_IsMainThread());
50     return sInstance;
51   }
52 
53   // Threadsafe way to get the compositor process ID.
GetOtherPid()54   static base::ProcessId GetOtherPid() { return sOtherPid; }
55 
CanSend()56   bool CanSend() const {
57     MOZ_ASSERT(NS_IsMainThread());
58     return mCanSend;
59   }
60 
SameProcess()61   bool SameProcess() const {
62     MOZ_ASSERT(NS_IsMainThread());
63     return mSameProcess;
64   }
65 
GetNextResourceId()66   uint32_t GetNextResourceId() {
67     MOZ_ASSERT(NS_IsMainThread());
68     return ++mResourceId;
69   }
70 
GetNamespace()71   uint32_t GetNamespace() const { return mNamespace; }
72 
OwnsExternalImageId(const wr::ExternalImageId & aId)73   bool OwnsExternalImageId(const wr::ExternalImageId& aId) const {
74     return mNamespace == static_cast<uint32_t>(wr::AsUint64(aId) >> 32);
75   }
76 
GetNextExternalImageId()77   wr::ExternalImageId GetNextExternalImageId() {
78     uint64_t id = GetNextResourceId();
79     MOZ_RELEASE_ASSERT(id != 0);
80     id |= (static_cast<uint64_t>(mNamespace) << 32);
81     return wr::ToExternalImageId(id);
82   }
83 
84   void ActorDestroy(ActorDestroyReason aReason) override;
85 
86   void HandleFatalError(const char* aMsg) const override;
87 
88   void ProcessingError(Result aCode, const char* aReason) override;
89 
90   bool ShouldContinueFromReplyTimeout() override;
91 
92   mozilla::ipc::IPCResult RecvNotifyWebRenderError(
93       const WebRenderError&& aError);
94 
95  private:
96   static StaticRefPtr<CompositorManagerChild> sInstance;
97   static Atomic<base::ProcessId> sOtherPid;
98 
99   CompositorManagerChild(CompositorManagerParent* aParent,
100                          uint64_t aProcessToken, uint32_t aNamespace);
101 
102   CompositorManagerChild(Endpoint<PCompositorManagerChild>&& aEndpoint,
103                          uint64_t aProcessToken, uint32_t aNamespace);
104 
105   virtual ~CompositorManagerChild() = default;
106 
107   void ActorDealloc() override;
108 
109   void SetReplyTimeout();
110 
111   uint64_t mProcessToken;
112   uint32_t mNamespace;
113   uint32_t mResourceId;
114   bool mCanSend;
115   bool mSameProcess;
116 };
117 
118 }  // namespace layers
119 }  // namespace mozilla
120 
121 #endif
122