diff options
Diffstat (limited to 'gfx/vr/service/VRService.h')
-rw-r--r-- | gfx/vr/service/VRService.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gfx/vr/service/VRService.h b/gfx/vr/service/VRService.h new file mode 100644 index 0000000000..2e41cd2980 --- /dev/null +++ b/gfx/vr/service/VRService.h @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef GFX_VR_SERVICE_VRSERVICE_H +#define GFX_VR_SERVICE_VRSERVICE_H + +#include "moz_external_vr.h" +#include "base/process.h" // for base::ProcessHandle +#include "mozilla/Atomics.h" +#include "mozilla/TimeStamp.h" +#include "mozilla/UniquePtr.h" +#include "nsCOMPtr.h" + +class nsIThread; +namespace mozilla { +class BackgroundHangMonitor; +namespace gfx { + +class VRSession; +class VRShMem; + +static const int kVRFrameTimingHistoryDepth = 100; + +class VRService { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRService) + static already_AddRefed<VRService> Create( + volatile VRExternalShmem* aShmem = nullptr); + + void Refresh(); + void Start(); + void Stop(); + + private: + explicit VRService(volatile VRExternalShmem* aShmem); + ~VRService(); + + void StopInternal(bool aFromDtor); + + bool InitShmem(); + void PushState(const mozilla::gfx::VRSystemState& aState); + void PullState(mozilla::gfx::VRBrowserState& aState); + + /** + * VRSystemState contains the most recent state of the VR + * system, to be shared with the browser by Shmem. + * mSystemState is the VR Service copy of this data, which + * is memcpy'ed atomically to the Shmem. + * VRSystemState is written by the VR Service, but read-only + * by the browser. + */ + VRSystemState mSystemState; + /** + * VRBrowserState contains the most recent state of the browser. + * mBrowserState is memcpy'ed from the Shmem atomically + */ + VRBrowserState mBrowserState; + + UniquePtr<VRSession> mSession; + nsCOMPtr<nsIThread> mServiceThread; + // Only ever accessed on the service thread. + UniquePtr<mozilla::BackgroundHangMonitor> mBackgroundHangMonitor; + + Atomic<bool> mShutdownRequested; + + // Note: mShmem doesn't support RefPtr; thus, do not share this private + // pointer so that its lifetime can still be controlled by VRService + VRShMem* mShmem; + VRHapticState mLastHapticState[kVRHapticsMaxCount]; + TimeStamp mFrameStartTime[kVRFrameTimingHistoryDepth]; + + bool IsInServiceThread(); + void UpdateHaptics(); + + /** + * The VR Service thread is a state machine that always has one + * task queued depending on the state. + * + * VR Service thread state task functions: + */ + void ServiceInitialize(); + void ServiceShutdown(); + void ServiceWaitForImmersive(); + void ServiceImmersiveMode(); +}; + +} // namespace gfx +} // namespace mozilla + +#endif // GFX_VR_SERVICE_VRSERVICE_H |