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