tor-browser

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

VRManagerChild.h (7474B)


      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_VR_VRMANAGERCHILD_H
      8 #define MOZILLA_GFX_VR_VRMANAGERCHILD_H
      9 
     10 #include "nsISupportsImpl.h"
     11 #include "mozilla/Attributes.h"
     12 #include "mozilla/dom/AnimationFrameProviderBinding.h"
     13 #include "mozilla/dom/WebXRBinding.h"
     14 #include "mozilla/dom/XRFrame.h"
     15 #include "mozilla/gfx/PVRManagerChild.h"
     16 #include "mozilla/layers/ISurfaceAllocator.h"  // for ISurfaceAllocator
     17 #include "mozilla/layers/LayersTypes.h"        // for LayersBackend
     18 
     19 namespace mozilla {
     20 namespace dom {
     21 class Promise;
     22 class GamepadManager;
     23 class Navigator;
     24 class VRDisplay;
     25 class FrameRequestCallback;
     26 }  // namespace dom
     27 namespace gfx {
     28 class VRLayerChild;
     29 class VRDisplayClient;
     30 
     31 class VRManagerEventObserver {
     32 public:
     33  NS_INLINE_DECL_PURE_VIRTUAL_REFCOUNTING
     34  virtual void NotifyVRDisplayMounted(uint32_t aDisplayID) = 0;
     35  virtual void NotifyVRDisplayUnmounted(uint32_t aDisplayID) = 0;
     36  virtual void NotifyVRDisplayConnect(uint32_t aDisplayID) = 0;
     37  virtual void NotifyVRDisplayDisconnect(uint32_t aDisplayID) = 0;
     38  virtual void NotifyVRDisplayPresentChange(uint32_t aDisplayID) = 0;
     39  virtual void NotifyPresentationGenerationChanged(uint32_t aDisplayID) = 0;
     40  virtual bool GetStopActivityStatus() const = 0;
     41  virtual void NotifyEnumerationCompleted() = 0;
     42  virtual void NotifyDetectRuntimesCompleted() = 0;
     43 
     44 protected:
     45  virtual ~VRManagerEventObserver() = default;
     46 };
     47 
     48 class VRManagerChild : public PVRManagerChild {
     49  friend class PVRManagerChild;
     50 
     51 public:
     52  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRManagerChild, override);
     53 
     54  static VRManagerChild* Get();
     55 
     56  // Indicate that an observer wants to receive VR events.
     57  void AddListener(VRManagerEventObserver* aObserver);
     58  // Indicate that an observer should no longer receive VR events.
     59  void RemoveListener(VRManagerEventObserver* aObserver);
     60  void StartActivity();
     61  void StopActivity();
     62  bool RuntimeSupportsVR() const;
     63  bool RuntimeSupportsAR() const;
     64  bool RuntimeSupportsInline() const;
     65 
     66  void GetVRDisplays(nsTArray<RefPtr<VRDisplayClient>>& aDisplays);
     67  bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
     68  bool EnumerateVRDisplays();
     69  void DetectRuntimes();
     70  void AddPromise(const uint32_t& aID, dom::Promise* aPromise);
     71  gfx::VRAPIMode GetVRAPIMode(uint32_t aDisplayID) const;
     72 
     73  static void InitSameProcess();
     74  static void InitWithGPUProcess(Endpoint<PVRManagerChild>&& aEndpoint);
     75  static bool InitForContent(Endpoint<PVRManagerChild>&& aEndpoint);
     76  static void ShutDown();
     77 
     78  static bool IsCreated();
     79  static bool IsPresenting();
     80  static TimeStamp GetIdleDeadlineHint(TimeStamp aDefault);
     81 
     82  PVRLayerChild* CreateVRLayer(uint32_t aDisplayID, uint32_t aGroup);
     83 
     84  static void IdentifyTextureHost(
     85      const layers::TextureFactoryIdentifier& aIdentifier);
     86  layers::LayersBackend GetBackendType() const;
     87 
     88  nsresult ScheduleFrameRequestCallback(dom::FrameRequestCallback& aCallback,
     89                                        int32_t* aHandle);
     90  void CancelFrameRequestCallback(int32_t aHandle);
     91  MOZ_CAN_RUN_SCRIPT
     92  void RunFrameRequestCallbacks();
     93  void NotifyPresentationGenerationChanged(uint32_t aDisplayID);
     94 
     95  MOZ_CAN_RUN_SCRIPT
     96  void UpdateDisplayInfo(const VRDisplayInfo& aDisplayInfo);
     97  void FireDOMVRDisplayMountedEvent(uint32_t aDisplayID);
     98  void FireDOMVRDisplayUnmountedEvent(uint32_t aDisplayID);
     99  void FireDOMVRDisplayConnectEvent(uint32_t aDisplayID);
    100  void FireDOMVRDisplayDisconnectEvent(uint32_t aDisplayID);
    101  void FireDOMVRDisplayPresentChangeEvent(uint32_t aDisplayID);
    102  void FireDOMVRDisplayConnectEventsForLoad(VRManagerEventObserver* aObserver);
    103 
    104  void HandleFatalError(const char* aMsg) override;
    105  void ActorDestroy(ActorDestroyReason aReason) override;
    106 
    107  void RunPuppet(const nsTArray<uint64_t>& aBuffer, dom::Promise* aPromise,
    108                 ErrorResult& aRv);
    109  void ResetPuppet(dom::Promise* aPromise, ErrorResult& aRv);
    110 
    111 protected:
    112  explicit VRManagerChild();
    113  ~VRManagerChild();
    114 
    115  PVRLayerChild* AllocPVRLayerChild(const uint32_t& aDisplayID,
    116                                    const uint32_t& aGroup);
    117  bool DeallocPVRLayerChild(PVRLayerChild* actor);
    118 
    119  // MOZ_CAN_RUN_SCRIPT_BOUNDARY until we can mark ipdl-generated things as
    120  // MOZ_CAN_RUN_SCRIPT.
    121  MOZ_CAN_RUN_SCRIPT_BOUNDARY
    122  mozilla::ipc::IPCResult RecvUpdateDisplayInfo(
    123      const VRDisplayInfo& aDisplayInfo);
    124  mozilla::ipc::IPCResult RecvUpdateRuntimeCapabilities(
    125      const VRDisplayCapabilityFlags& aCapabilities);
    126  mozilla::ipc::IPCResult RecvReplyGamepadVibrateHaptic(
    127      const uint32_t& aPromiseID);
    128 
    129  MOZ_CAN_RUN_SCRIPT_BOUNDARY
    130  mozilla::ipc::IPCResult RecvNotifyPuppetCommandBufferCompleted(bool aSuccess);
    131  MOZ_CAN_RUN_SCRIPT_BOUNDARY
    132  mozilla::ipc::IPCResult RecvNotifyPuppetResetComplete();
    133 
    134  bool IsSameProcess() const { return OtherPid() == base::GetCurrentProcId(); }
    135 
    136 private:
    137  void FireDOMVRDisplayMountedEventInternal(uint32_t aDisplayID);
    138  void FireDOMVRDisplayUnmountedEventInternal(uint32_t aDisplayID);
    139  void FireDOMVRDisplayConnectEventInternal(uint32_t aDisplayID);
    140  void FireDOMVRDisplayDisconnectEventInternal(uint32_t aDisplayID);
    141  void FireDOMVRDisplayPresentChangeEventInternal(uint32_t aDisplayID);
    142  void FireDOMVRDisplayConnectEventsForLoadInternal(
    143      uint32_t aDisplayID, VRManagerEventObserver* aObserver);
    144  void NotifyPresentationGenerationChangedInternal(uint32_t aDisplayID);
    145  void NotifyEnumerationCompletedInternal();
    146  void NotifyRuntimeCapabilitiesUpdatedInternal();
    147 
    148  nsTArray<RefPtr<VRDisplayClient>> mDisplays;
    149  VRDisplayCapabilityFlags mRuntimeCapabilities;
    150  bool mDisplaysInitialized;
    151  nsTArray<uint64_t> mNavigatorCallbacks;
    152 
    153  struct XRFrameRequest {
    154    XRFrameRequest(mozilla::dom::FrameRequestCallback& aCallback,
    155                   int32_t aHandle)
    156        : mCallback(&aCallback), mHandle(aHandle) {}
    157 
    158    XRFrameRequest(mozilla::dom::XRFrameRequestCallback& aCallback,
    159                   mozilla::dom::XRFrame& aFrame, int32_t aHandle)
    160        : mXRCallback(&aCallback), mXRFrame(&aFrame), mHandle(aHandle) {}
    161    MOZ_CAN_RUN_SCRIPT
    162    void Call(const DOMHighResTimeStamp& aTimeStamp);
    163 
    164    // Comparator operators to allow RemoveElementSorted with an
    165    // integer argument on arrays of XRFrameRequest
    166    bool operator==(int32_t aHandle) const { return mHandle == aHandle; }
    167    bool operator<(int32_t aHandle) const { return mHandle < aHandle; }
    168 
    169    RefPtr<mozilla::dom::FrameRequestCallback> mCallback;
    170    RefPtr<mozilla::dom::XRFrameRequestCallback> mXRCallback;
    171    RefPtr<mozilla::dom::XRFrame> mXRFrame;
    172    int32_t mHandle;
    173  };
    174 
    175  nsTArray<XRFrameRequest> mFrameRequestCallbacks;
    176  /**
    177   * The current frame request callback handle
    178   */
    179  int32_t mFrameRequestCallbackCounter;
    180  mozilla::TimeStamp mStartTimeStamp;
    181 
    182  nsTArray<RefPtr<VRManagerEventObserver>> mListeners;
    183  bool mWaitingForEnumeration;
    184 
    185  layers::LayersBackend mBackend;
    186  nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mGamepadPromiseList;
    187  RefPtr<dom::Promise> mRunPuppetPromise;
    188  nsTArray<RefPtr<dom::Promise>> mResetPuppetPromises;
    189 
    190  DISALLOW_COPY_AND_ASSIGN(VRManagerChild);
    191 };
    192 
    193 }  // namespace gfx
    194 }  // namespace mozilla
    195 
    196 #endif  // MOZILLA_GFX_VR_VRMANAGERCHILD_H