diff options
Diffstat (limited to 'gfx/vr/VRShMem.h')
-rw-r--r-- | gfx/vr/VRShMem.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/gfx/vr/VRShMem.h b/gfx/vr/VRShMem.h new file mode 100644 index 0000000000..a10b8189a8 --- /dev/null +++ b/gfx/vr/VRShMem.h @@ -0,0 +1,105 @@ +/* -*- 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_VRSHMEM_H +#define GFX_VR_VRSHMEM_H + +// This file declares VRShMem, which is used for cross-platform, cross-process +// communication between VR components. +// A shared memory handle is opened for the struct of type VRExternalShmem, and +// different processes write or read members of it to share data. Note that no +// process should be reading or writing to the same members, except for the +// versioning members used for synchronization. + +#include "moz_external_vr.h" +#include "base/process.h" // for base::ProcessHandle +#include <functional> + +namespace mozilla { +namespace gfx { +class VRShMem final { + public: + VRShMem(volatile VRExternalShmem* aShmem, bool aRequiresMutex); + ~VRShMem() = default; + + void CreateShMem(bool aCreateOnSharedMemory); + void CreateShMemForAndroid(); + void ClearShMem(); + void CloseShMem(); + + bool JoinShMem(); + void LeaveShMem(); + + void PushBrowserState(VRBrowserState& aBrowserState, bool aNotifyCond); + void PullBrowserState(mozilla::gfx::VRBrowserState& aState); + + void PushSystemState(const mozilla::gfx::VRSystemState& aState); + void PullSystemState( + VRDisplayState& aDisplayState, VRHMDSensorState& aSensorState, + VRControllerState (&aControllerState)[kVRControllerMaxCount], + bool& aEnumerationCompleted, + const std::function<bool()>& aWaitCondition = nullptr); + + void PushWindowState(VRWindowState& aState); + void PullWindowState(VRWindowState& aState); + + void PushTelemetryState(VRTelemetryState& aState); + void PullTelemetryState(VRTelemetryState& aState); + + void SendIMEState(uint64_t aWindowID, mozilla::gfx::VRFxEventState aImeState); + void SendFullscreenState(uint64_t aWindowID, bool aFullscreen); + void SendShutdowmState(uint64_t aWindowID); + + bool HasExternalShmem() const { return mExternalShmem != nullptr; } + bool IsSharedExternalShmem() const { return mIsSharedExternalShmem; } + volatile VRExternalShmem* GetExternalShmem() const; + bool IsDisplayStateShutdown() const; + + private: + bool IsCreatedOnSharedMemory() const; + void SendEvent(uint64_t aWindowID, mozilla::gfx::VRFxEventType aEventType, + mozilla::gfx::VRFxEventState aEventState); + + // mExternalShmem can have one of three sources: + // - Allocated outside of this class on the heap and passed in via + // constructor, or acquired via GeckoVRManager (for GeckoView scenario). + // This is usually for scenarios where there is no VR process for cross- + // proc communication, and VRService is receiving the object. + // --> mIsSharedExternalShmem == true, IsCreatedOnSharedMemory() == false + // --> [Windows 7, Mac, Android, Linux] + // - Allocated inside this class on the heap. This is usually for scenarios + // where there is no VR process, and VRManager is creating the object. + // --> mIsSharedExternalShmem == false, IsCreatedOnSharedMemory() == false + // --> [Windows 7, Mac, Linux] + // - Allocated inside this class on shared memory. This is usually for + // scenarios where there is a VR process and cross-process communication + // is necessary + // --> mIsSharedExternalShmem == false, IsCreatedOnSharedMemory() == true + // --> [Windows 10 with VR process enabled] + volatile VRExternalShmem* mExternalShmem = nullptr; + // This member is true when mExternalShmem was allocated externally, via + // being passed into the constructor or accessed via GeckoVRManager + bool mIsSharedExternalShmem; + +#if defined(XP_WIN) + bool mRequiresMutex; +#endif + +#if defined(XP_MACOSX) + int mShmemFD; +#elif defined(XP_WIN) + base::ProcessHandle mShmemFile; + base::ProcessHandle mMutex; +#endif + +#if !defined(MOZ_WIDGET_ANDROID) + int64_t mBrowserGeneration = 0; +#endif +}; +} // namespace gfx +} // namespace mozilla + +#endif |