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