tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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