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