diff --git a/gfx/thebes/gfxPrefs.h b/gfx/thebes/gfxPrefs.h index 9830a928c58f..d7460ec76601 100644 --- a/gfx/thebes/gfxPrefs.h +++ b/gfx/thebes/gfxPrefs.h @@ -309,10 +309,8 @@ private: DECL_GFX_PREF(Live, "dom.meta-viewport.enabled", MetaViewportEnabled, bool, false); DECL_GFX_PREF(Once, "dom.vr.enabled", VREnabled, bool, false); DECL_GFX_PREF(Once, "dom.vr.oculus.enabled", VROculusEnabled, bool, true); - DECL_GFX_PREF(Once, "dom.vr.oculus050.enabled", VROculus050Enabled, bool, true); DECL_GFX_PREF(Once, "dom.vr.cardboard.enabled", VRCardboardEnabled, bool, false); DECL_GFX_PREF(Once, "dom.vr.osvr.enabled", VROSVREnabled, bool, false); - DECL_GFX_PREF(Once, "dom.vr.add-test-devices", VRAddTestDevices, int32_t, 1); DECL_GFX_PREF(Live, "dom.vr.poseprediction.enabled", VRPosePredictionEnabled, bool, false); DECL_GFX_PREF(Live, "dom.w3c_pointer_events.enabled", PointerEventsEnabled, bool, false); DECL_GFX_PREF(Live, "dom.w3c_touch_events.enabled", TouchEventsEnabled, int32_t, 0); diff --git a/gfx/vr/VRManager.cpp b/gfx/vr/VRManager.cpp index 987222caf287..df3b3344643b 100644 --- a/gfx/vr/VRManager.cpp +++ b/gfx/vr/VRManager.cpp @@ -17,7 +17,6 @@ #include "gfxVROculus.h" #endif #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX) -#include "gfxVROculus050.h" #include "gfxVROSVR.h" #endif #include "gfxVRCardboard.h" @@ -47,27 +46,14 @@ VRManager::VRManager() RefPtr mgr; - // we'll only load the 0.5.0 oculus runtime if - // the >= 0.6.0 one failed to load; otherwise - // we might initialize oculus twice - bool useOculus050 = true; - Unused << useOculus050; - #if defined(XP_WIN) mgr = VRHMDManagerOculus::Create(); if (mgr) { - useOculus050 = false; mManagers.AppendElement(mgr); } #endif #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX) - if (useOculus050) { - mgr = VRHMDManagerOculus050::Create(); - if (mgr) { - mManagers.AppendElement(mgr); - } - } // OSVR is cross platform compatible mgr = VRHMDManagerOSVR::Create(); if (mgr){ diff --git a/gfx/vr/gfxVR.cpp b/gfx/vr/gfxVR.cpp index 031a2401e924..5696c500e26e 100644 --- a/gfx/vr/gfxVR.cpp +++ b/gfx/vr/gfxVR.cpp @@ -16,7 +16,6 @@ #include "gfxVROculus.h" #endif #if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX) -#include "gfxVROculus050.h" #include "gfxVROSVR.h" #endif #include "gfxVRCardboard.h" diff --git a/gfx/vr/gfxVR.h b/gfx/vr/gfxVR.h index b2a126c842b4..001f52925e70 100644 --- a/gfx/vr/gfxVR.h +++ b/gfx/vr/gfxVR.h @@ -28,7 +28,6 @@ namespace gfx { enum class VRHMDType : uint16_t { Oculus, Cardboard, - Oculus050, OSVR, NumHMDTypes }; diff --git a/gfx/vr/gfxVROculus050.cpp b/gfx/vr/gfxVROculus050.cpp deleted file mode 100644 index 34968c4c106b..000000000000 --- a/gfx/vr/gfxVROculus050.cpp +++ /dev/null @@ -1,639 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * 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/. */ - -#include -#if defined(_WIN32) -#include -#endif - -#include "prlink.h" -#include "prmem.h" -#include "prenv.h" -#include "gfxPrefs.h" -#include "nsString.h" -#include "mozilla/Preferences.h" -#include "mozilla/TimeStamp.h" - -#include "gfxVROculus050.h" - -#ifndef M_PI -# define M_PI 3.14159265358979323846 -#endif - -using namespace ovr050; -using namespace mozilla::gfx; -using namespace mozilla::gfx::impl; - -namespace { - -#ifdef OVR_CAPI_050_LIMITED_MOZILLA -static pfn_ovr_Initialize ovr_Initialize = nullptr; -static pfn_ovr_Shutdown ovr_Shutdown = nullptr; -static pfn_ovrHmd_Detect ovrHmd_Detect = nullptr; -static pfn_ovrHmd_Create ovrHmd_Create = nullptr; -static pfn_ovrHmd_Destroy ovrHmd_Destroy = nullptr; -static pfn_ovrHmd_CreateDebug ovrHmd_CreateDebug = nullptr; -static pfn_ovrHmd_GetLastError ovrHmd_GetLastError = nullptr; -static pfn_ovrHmd_AttachToWindow ovrHmd_AttachToWindow = nullptr; -static pfn_ovrHmd_GetEnabledCaps ovrHmd_GetEnabledCaps = nullptr; -static pfn_ovrHmd_SetEnabledCaps ovrHmd_SetEnabledCaps = nullptr; -static pfn_ovrHmd_ConfigureTracking ovrHmd_ConfigureTracking = nullptr; -static pfn_ovrHmd_RecenterPose ovrHmd_RecenterPose = nullptr; -static pfn_ovrHmd_GetTrackingState ovrHmd_GetTrackingState = nullptr; -static pfn_ovrHmd_GetFovTextureSize ovrHmd_GetFovTextureSize = nullptr; -static pfn_ovrHmd_GetRenderDesc ovrHmd_GetRenderDesc = nullptr; -static pfn_ovrHmd_CreateDistortionMesh ovrHmd_CreateDistortionMesh = nullptr; -static pfn_ovrHmd_DestroyDistortionMesh ovrHmd_DestroyDistortionMesh = nullptr; -static pfn_ovrHmd_GetRenderScaleAndOffset ovrHmd_GetRenderScaleAndOffset = nullptr; -static pfn_ovrHmd_GetFrameTiming ovrHmd_GetFrameTiming = nullptr; -static pfn_ovrHmd_BeginFrameTiming ovrHmd_BeginFrameTiming = nullptr; -static pfn_ovrHmd_EndFrameTiming ovrHmd_EndFrameTiming = nullptr; -static pfn_ovrHmd_ResetFrameTiming ovrHmd_ResetFrameTiming = nullptr; -static pfn_ovrHmd_GetEyePoses ovrHmd_GetEyePoses = nullptr; -static pfn_ovrHmd_GetHmdPosePerEye ovrHmd_GetHmdPosePerEye = nullptr; -static pfn_ovrHmd_GetEyeTimewarpMatrices ovrHmd_GetEyeTimewarpMatrices = nullptr; -static pfn_ovrMatrix4f_Projection ovrMatrix4f_Projection = nullptr; -static pfn_ovrMatrix4f_OrthoSubProjection ovrMatrix4f_OrthoSubProjection = nullptr; -static pfn_ovr_GetTimeInSeconds ovr_GetTimeInSeconds = nullptr; - -#ifdef HAVE_64BIT_BUILD -#define BUILD_BITS 64 -#else -#define BUILD_BITS 32 -#endif - -#define LIBOVR_PRODUCT_VERSION 0 -#define LIBOVR_MAJOR_VERSION 5 -#define LIBOVR_MINOR_VERSION 0 - -static bool -InitializeOculusCAPI() -{ - static PRLibrary *ovrlib = nullptr; - - if (!ovrlib) { - nsTArray libSearchPaths; - nsCString libName; - nsCString searchPath; - -#if defined(_WIN32) - static const char dirSep = '\\'; -#else - static const char dirSep = '/'; -#endif - -#if defined(_WIN32) - static const int pathLen = 260; - searchPath.SetCapacity(pathLen); - int realLen = ::GetSystemDirectoryA(searchPath.BeginWriting(), pathLen); - if (realLen != 0 && realLen < pathLen) { - searchPath.SetLength(realLen); - libSearchPaths.AppendElement(searchPath); - } - libName.AppendPrintf("LibOVRRT%d_%d_%d.dll", BUILD_BITS, LIBOVR_PRODUCT_VERSION, LIBOVR_MAJOR_VERSION); -#elif defined(__APPLE__) - searchPath.Truncate(); - searchPath.AppendPrintf("/Library/Frameworks/LibOVRRT_%d.framework/Versions/%d", LIBOVR_PRODUCT_VERSION, LIBOVR_MAJOR_VERSION); - libSearchPaths.AppendElement(searchPath); - - if (PR_GetEnv("HOME")) { - searchPath.Truncate(); - searchPath.AppendPrintf("%s/Library/Frameworks/LibOVRRT_%d.framework/Versions/%d", PR_GetEnv("HOME"), LIBOVR_PRODUCT_VERSION, LIBOVR_MAJOR_VERSION); - libSearchPaths.AppendElement(searchPath); - } - // The following will match the va_list overload of AppendPrintf if the product version is 0 - // That's bad times. - //libName.AppendPrintf("LibOVRRT_%d", LIBOVR_PRODUCT_VERSION); - libName.Append("LibOVRRT_"); - libName.AppendInt(LIBOVR_PRODUCT_VERSION); -#else - libSearchPaths.AppendElement(nsCString("/usr/local/lib")); - libSearchPaths.AppendElement(nsCString("/usr/lib")); - libName.AppendPrintf("libOVRRT%d_%d.so.%d", BUILD_BITS, LIBOVR_PRODUCT_VERSION, LIBOVR_MAJOR_VERSION); -#endif - - // If the pref is present, we override libName - nsAdoptingCString prefLibPath = mozilla::Preferences::GetCString("dom.vr.ovr_lib_path"); - if (prefLibPath && prefLibPath.get()) { - libSearchPaths.InsertElementsAt(0, 1, prefLibPath); - } - - nsAdoptingCString prefLibName = mozilla::Preferences::GetCString("dom.vr.ovr_lib_name"); - if (prefLibName && prefLibName.get()) { - libName.Assign(prefLibName); - } - - // search the path/module dir - libSearchPaths.InsertElementsAt(0, 1, nsCString()); - - // If the env var is present, we override libName - if (PR_GetEnv("OVR_LIB_PATH")) { - searchPath = PR_GetEnv("OVR_LIB_PATH"); - libSearchPaths.InsertElementsAt(0, 1, searchPath); - } - - if (PR_GetEnv("OVR_LIB_NAME")) { - libName = PR_GetEnv("OVR_LIB_NAME"); - } - - for (uint32_t i = 0; i < libSearchPaths.Length(); ++i) { - nsCString& libPath = libSearchPaths[i]; - nsCString fullName; - if (libPath.Length() == 0) { - fullName.Assign(libName); - } else { - fullName.AppendPrintf("%s%c%s", libPath.BeginReading(), dirSep, libName.BeginReading()); - } - - ovrlib = PR_LoadLibrary(fullName.BeginReading()); - if (ovrlib) - break; - } - - if (!ovrlib) { - return false; - } - } - - // was it already initialized? - if (ovr_Initialize) - return true; - -#define REQUIRE_FUNCTION(_x) do { \ - *(void **)&_x = (void *) PR_FindSymbol(ovrlib, #_x); \ - if (!_x) { printf_stderr(#_x " symbol missing\n"); goto fail; } \ - } while (0) - - REQUIRE_FUNCTION(ovr_Initialize); - REQUIRE_FUNCTION(ovr_Shutdown); - REQUIRE_FUNCTION(ovrHmd_Detect); - REQUIRE_FUNCTION(ovrHmd_Create); - REQUIRE_FUNCTION(ovrHmd_Destroy); - REQUIRE_FUNCTION(ovrHmd_CreateDebug); - REQUIRE_FUNCTION(ovrHmd_GetLastError); - REQUIRE_FUNCTION(ovrHmd_AttachToWindow); - REQUIRE_FUNCTION(ovrHmd_GetEnabledCaps); - REQUIRE_FUNCTION(ovrHmd_SetEnabledCaps); - REQUIRE_FUNCTION(ovrHmd_ConfigureTracking); - REQUIRE_FUNCTION(ovrHmd_RecenterPose); - REQUIRE_FUNCTION(ovrHmd_GetTrackingState); - - REQUIRE_FUNCTION(ovrHmd_GetFovTextureSize); - REQUIRE_FUNCTION(ovrHmd_GetRenderDesc); - REQUIRE_FUNCTION(ovrHmd_CreateDistortionMesh); - REQUIRE_FUNCTION(ovrHmd_DestroyDistortionMesh); - REQUIRE_FUNCTION(ovrHmd_GetRenderScaleAndOffset); - REQUIRE_FUNCTION(ovrHmd_GetFrameTiming); - REQUIRE_FUNCTION(ovrHmd_BeginFrameTiming); - REQUIRE_FUNCTION(ovrHmd_EndFrameTiming); - REQUIRE_FUNCTION(ovrHmd_ResetFrameTiming); - REQUIRE_FUNCTION(ovrHmd_GetEyePoses); - REQUIRE_FUNCTION(ovrHmd_GetHmdPosePerEye); - REQUIRE_FUNCTION(ovrHmd_GetEyeTimewarpMatrices); - REQUIRE_FUNCTION(ovrMatrix4f_Projection); - REQUIRE_FUNCTION(ovrMatrix4f_OrthoSubProjection); - REQUIRE_FUNCTION(ovr_GetTimeInSeconds); - -#undef REQUIRE_FUNCTION - - return true; - - fail: - ovr_Initialize = nullptr; - return false; -} - -#else -// we're statically linked; it's available -static bool InitializeOculusCAPI() -{ - return true; -} -#endif - -ovrFovPort -ToFovPort(const VRFieldOfView& aFOV) -{ - ovrFovPort fovPort; - fovPort.LeftTan = tan(aFOV.leftDegrees * M_PI / 180.0); - fovPort.RightTan = tan(aFOV.rightDegrees * M_PI / 180.0); - fovPort.UpTan = tan(aFOV.upDegrees * M_PI / 180.0); - fovPort.DownTan = tan(aFOV.downDegrees * M_PI / 180.0); - return fovPort; -} - -VRFieldOfView -FromFovPort(const ovrFovPort& aFOV) -{ - VRFieldOfView fovInfo; - fovInfo.leftDegrees = atan(aFOV.LeftTan) * 180.0 / M_PI; - fovInfo.rightDegrees = atan(aFOV.RightTan) * 180.0 / M_PI; - fovInfo.upDegrees = atan(aFOV.UpTan) * 180.0 / M_PI; - fovInfo.downDegrees = atan(aFOV.DownTan) * 180.0 / M_PI; - return fovInfo; -} - -} // anonymous namespace - -HMDInfoOculus050::HMDInfoOculus050(ovrHmd aHMD, bool aDebug, int aDeviceID) - : VRHMDInfo(VRHMDType::Oculus050, false) - , mHMD(aHMD) - , mTracking(false) - , mDebug(aDebug) - , mDeviceID(aDeviceID) - , mSensorTrackingFramesRemaining(0) -{ - MOZ_ASSERT(sizeof(HMDInfoOculus050::DistortionVertex) == sizeof(VRDistortionVertex), - "HMDInfoOculus050::DistortionVertex must match the size of VRDistortionVertex"); - - MOZ_COUNT_CTOR_INHERITED(HMDInfoOculus050, VRHMDInfo); - - if (aDebug) { - mDeviceInfo.mDeviceName.AssignLiteral("Oculus VR HMD (0.5.0 Debug)"); - } else { - mDeviceInfo.mDeviceName.AssignLiteral("Oculus VR HMD (0.5.0)"); - } - - mDeviceInfo.mSupportedSensorBits = VRStateValidFlags::State_None; - if (mHMD->TrackingCaps & ovrTrackingCap_Orientation) { - mDeviceInfo.mSupportedSensorBits |= VRStateValidFlags::State_Orientation; - } - if (mHMD->TrackingCaps & ovrTrackingCap_Position) { - mDeviceInfo.mSupportedSensorBits |= VRStateValidFlags::State_Position; - } - - mDeviceInfo.mRecommendedEyeFOV[VRDeviceInfo::Eye_Left] = FromFovPort(mHMD->DefaultEyeFov[ovrEye_Left]); - mDeviceInfo.mRecommendedEyeFOV[VRDeviceInfo::Eye_Right] = FromFovPort(mHMD->DefaultEyeFov[ovrEye_Right]); - - mDeviceInfo.mMaximumEyeFOV[VRDeviceInfo::Eye_Left] = FromFovPort(mHMD->MaxEyeFov[ovrEye_Left]); - mDeviceInfo.mMaximumEyeFOV[VRDeviceInfo::Eye_Right] = FromFovPort(mHMD->MaxEyeFov[ovrEye_Right]); - - mDeviceInfo.mScreenRect.x = mHMD->WindowsPos.x; - mDeviceInfo.mScreenRect.y = mHMD->WindowsPos.y; - mDeviceInfo.mScreenRect.width = mHMD->Resolution.w; - mDeviceInfo.mScreenRect.height = mHMD->Resolution.h; - mDeviceInfo.mIsFakeScreen = false; - - SetFOV(mDeviceInfo.mRecommendedEyeFOV[VRDeviceInfo::Eye_Left], mDeviceInfo.mRecommendedEyeFOV[VRDeviceInfo::Eye_Right], 0.01, 10000.0); -} - -bool -HMDInfoOculus050::GetIsDebug() const -{ - return mDebug; -} - -int -HMDInfoOculus050::GetDeviceID() const -{ - return mDeviceID; -} - -void -HMDInfoOculus050::Destroy() -{ - StopSensorTracking(); - - if (mHMD) { - ovrHmd_Destroy(mHMD); - mHMD = nullptr; - } -} - -bool -HMDInfoOculus050::SetFOV(const VRFieldOfView& aFOVLeft, const VRFieldOfView& aFOVRight, - double zNear, double zFar) -{ - float pixelsPerDisplayPixel = 1.0; - ovrSizei texSize[2]; - - uint32_t caps = ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette; // XXX TODO add TimeWarp - - // get eye parameters and create the mesh - for (uint32_t eye = 0; eye < VRDeviceInfo::NumEyes; eye++) { - mDeviceInfo.mEyeFOV[eye] = eye == 0 ? aFOVLeft : aFOVRight; - mFOVPort[eye] = ToFovPort(mDeviceInfo.mEyeFOV[eye]); - - ovrEyeRenderDesc renderDesc = ovrHmd_GetRenderDesc(mHMD, (ovrEyeType) eye, mFOVPort[eye]); - - // these values are negated so that content can add the adjustment to its camera position, - // instead of subtracting - mDeviceInfo.mEyeTranslation[eye] = Point3D(-renderDesc.HmdToEyeViewOffset.x, -renderDesc.HmdToEyeViewOffset.y, -renderDesc.HmdToEyeViewOffset.z); - - // note that we are using a right-handed coordinate system here, to match CSS - mDeviceInfo.mEyeProjectionMatrix[eye] = mDeviceInfo.mEyeFOV[eye].ConstructProjectionMatrix(zNear, zFar, true); - - texSize[eye] = ovrHmd_GetFovTextureSize(mHMD, (ovrEyeType) eye, mFOVPort[eye], pixelsPerDisplayPixel); - - ovrDistortionMesh mesh; - bool ok = ovrHmd_CreateDistortionMesh(mHMD, (ovrEyeType) eye, mFOVPort[eye], caps, &mesh); - if (!ok) - return false; - - mDistortionMesh[eye].mVertices.SetLength(mesh.VertexCount); - mDistortionMesh[eye].mIndices.SetLength(mesh.IndexCount); - - ovrDistortionVertex *srcv = mesh.pVertexData; - HMDInfoOculus050::DistortionVertex *destv = reinterpret_cast(mDistortionMesh[eye].mVertices.Elements()); - memset(destv, 0, mesh.VertexCount * sizeof(VRDistortionVertex)); - for (uint32_t i = 0; i < mesh.VertexCount; ++i) { - destv[i].pos[0] = srcv[i].ScreenPosNDC.x; - destv[i].pos[1] = srcv[i].ScreenPosNDC.y; - - destv[i].texR[0] = srcv[i].TanEyeAnglesR.x; - destv[i].texR[1] = srcv[i].TanEyeAnglesR.y; - destv[i].texG[0] = srcv[i].TanEyeAnglesG.x; - destv[i].texG[1] = srcv[i].TanEyeAnglesG.y; - destv[i].texB[0] = srcv[i].TanEyeAnglesB.x; - destv[i].texB[1] = srcv[i].TanEyeAnglesB.y; - - destv[i].genericAttribs[0] = srcv[i].VignetteFactor; - destv[i].genericAttribs[1] = srcv[i].TimeWarpFactor; - } - - memcpy(mDistortionMesh[eye].mIndices.Elements(), mesh.pIndexData, mesh.IndexCount * sizeof(uint16_t)); - ovrHmd_DestroyDistortionMesh(&mesh); - } - - // take the max of both for eye resolution - mDeviceInfo.mEyeResolution.width = std::max(texSize[VRDeviceInfo::Eye_Left].w, texSize[VRDeviceInfo::Eye_Right].w); - mDeviceInfo.mEyeResolution.height = std::max(texSize[VRDeviceInfo::Eye_Left].h, texSize[VRDeviceInfo::Eye_Right].h); - - mConfiguration.hmdType = mDeviceInfo.mType; - mConfiguration.value = 0; - mConfiguration.fov[0] = aFOVLeft; - mConfiguration.fov[1] = aFOVRight; - - return true; -} - -void -HMDInfoOculus050::FillDistortionConstants(uint32_t whichEye, - const IntSize& textureSize, - const IntRect& eyeViewport, - const Size& destViewport, - const Rect& destRect, - VRDistortionConstants& values) -{ - ovrSizei texSize = { textureSize.width, textureSize.height }; - ovrRecti eyePort = { { eyeViewport.x, eyeViewport.y }, { eyeViewport.width, eyeViewport.height } }; - ovrVector2f scaleOut[2]; - - ovrHmd_GetRenderScaleAndOffset(mFOVPort[whichEye], texSize, eyePort, scaleOut); - - values.eyeToSourceScaleAndOffset[0] = scaleOut[1].x; - values.eyeToSourceScaleAndOffset[1] = scaleOut[1].y; - values.eyeToSourceScaleAndOffset[2] = scaleOut[0].x; - values.eyeToSourceScaleAndOffset[3] = scaleOut[0].y; - - // These values are in clip space [-1..1] range, but we're providing - // scaling in the 0..2 space for sanity. - - // this is the destRect in clip space - float x0 = destRect.x / destViewport.width * 2.0 - 1.0; - float x1 = (destRect.x + destRect.width) / destViewport.width * 2.0 - 1.0; - - float y0 = destRect.y / destViewport.height * 2.0 - 1.0; - float y1 = (destRect.y + destRect.height) / destViewport.height * 2.0 - 1.0; - - // offset - values.destinationScaleAndOffset[0] = (x0+x1) / 2.0; - values.destinationScaleAndOffset[1] = (y0+y1) / 2.0; - // scale - values.destinationScaleAndOffset[2] = destRect.width / destViewport.width; - values.destinationScaleAndOffset[3] = destRect.height / destViewport.height; -} - -bool -HMDInfoOculus050::KeepSensorTracking() -{ - // Keep sensor tracking alive for short time after the last request for - // tracking state by content. Value conservatively high to accomodate - // potentially high frame rates. - const uint32_t kKeepAliveFrames = 200; - - bool success = true; - if (mSensorTrackingFramesRemaining == 0) { - success = StartSensorTracking(); - } - if (success) { - mSensorTrackingFramesRemaining = kKeepAliveFrames; - } - - return success; -} - -void -HMDInfoOculus050::NotifyVsync(const mozilla::TimeStamp& aVsyncTimestamp) -{ - if (mSensorTrackingFramesRemaining == 1) { - StopSensorTracking(); - } - if (mSensorTrackingFramesRemaining) { - --mSensorTrackingFramesRemaining; - } -} - -bool -HMDInfoOculus050::StartSensorTracking() -{ - if (!mTracking) { - mTracking = ovrHmd_ConfigureTracking(mHMD, ovrTrackingCap_Orientation | ovrTrackingCap_Position, 0); - } - - return mTracking; -} - -void -HMDInfoOculus050::StopSensorTracking() -{ - if (mTracking) { - ovrHmd_ConfigureTracking(mHMD, 0, 0); - mTracking = false; - } -} - -void -HMDInfoOculus050::ZeroSensor() -{ - ovrHmd_RecenterPose(mHMD); -} - -VRHMDSensorState -HMDInfoOculus050::GetImmediateSensorState() -{ - return GetSensorState(); -} - -VRHMDSensorState -HMDInfoOculus050::GetSensorState() -{ - VRHMDSensorState result; - result.Clear(); - - // XXX this is the wrong time base for timeOffset; we need to figure out how to synchronize - // the Oculus time base and the browser one. - ovrTrackingState state = ovrHmd_GetTrackingState(mHMD, ovr_GetTimeInSeconds()); - ovrPoseStatef& pose(state.HeadPose); - - result.timestamp = pose.TimeInSeconds; - - if (state.StatusFlags & ovrStatus_OrientationTracked) { - result.flags |= VRStateValidFlags::State_Orientation; - - result.orientation[0] = pose.ThePose.Orientation.x; - result.orientation[1] = pose.ThePose.Orientation.y; - result.orientation[2] = pose.ThePose.Orientation.z; - result.orientation[3] = pose.ThePose.Orientation.w; - - result.angularVelocity[0] = pose.AngularVelocity.x; - result.angularVelocity[1] = pose.AngularVelocity.y; - result.angularVelocity[2] = pose.AngularVelocity.z; - - result.angularAcceleration[0] = pose.AngularAcceleration.x; - result.angularAcceleration[1] = pose.AngularAcceleration.y; - result.angularAcceleration[2] = pose.AngularAcceleration.z; - } - - if (state.StatusFlags & ovrStatus_PositionTracked) { - result.flags |= VRStateValidFlags::State_Position; - - result.position[0] = pose.ThePose.Position.x; - result.position[1] = pose.ThePose.Position.y; - result.position[2] = pose.ThePose.Position.z; - - result.linearVelocity[0] = pose.LinearVelocity.x; - result.linearVelocity[1] = pose.LinearVelocity.y; - result.linearVelocity[2] = pose.LinearVelocity.z; - - result.linearAcceleration[0] = pose.LinearAcceleration.x; - result.linearAcceleration[1] = pose.LinearAcceleration.y; - result.linearAcceleration[2] = pose.LinearAcceleration.z; - } - - return result; -} - -/*static*/ already_AddRefed -VRHMDManagerOculus050::Create() -{ - MOZ_ASSERT(NS_IsMainThread()); - - if (!gfxPrefs::VREnabled() || !gfxPrefs::VROculus050Enabled()) - { - return nullptr; - } - - if (!InitializeOculusCAPI()) { - return nullptr; - } - - RefPtr manager = new VRHMDManagerOculus050(); - return manager.forget(); -} - -bool -VRHMDManagerOculus050::Init() -{ - if (!mOculusInitialized) { - nsIThread* thread = nullptr; - NS_GetCurrentThread(&thread); - mOculusThread = already_AddRefed(thread); - - ovrInitParams params; - memset(¶ms, 0, sizeof(params)); - params.Flags = ovrInit_RequestVersion; - params.RequestedMinorVersion = LIBOVR_MINOR_VERSION; - params.LogCallback = nullptr; - params.ConnectionTimeoutMS = 0; - - bool ok = ovr_Initialize(¶ms); - - if (ok) { - mOculusInitialized = true; - } - } - return mOculusInitialized; -} - -void -VRHMDManagerOculus050::Destroy() -{ - if (mOculusInitialized) { - MOZ_ASSERT(NS_GetCurrentThread() == mOculusThread); - mOculusThread = nullptr; - - for (size_t i = 0; i < mOculusHMDs.Length(); ++i) { - mOculusHMDs[i]->Destroy(); - } - - mOculusHMDs.Clear(); - - ovr_Shutdown(); - - mOculusInitialized = false; - } -} - -void -VRHMDManagerOculus050::GetHMDs(nsTArray>& aHMDResult) -{ - if (!mOculusInitialized) { - return; - } - - nsTArray > newHMDs; - - int count = ovrHmd_Detect(); - - for (int j = 0; j < count; ++j) { - bool is_new = true; - for (size_t i = 0; i < mOculusHMDs.Length(); ++i) { - if(mOculusHMDs[i]->GetDeviceID() == j) { - newHMDs.AppendElement(mOculusHMDs[i]); - is_new = false; - break; - } - } - - if(is_new) { - ovrHmd hmd = ovrHmd_Create(j); - if (hmd) { - RefPtr oc = new HMDInfoOculus050(hmd, false, j); - newHMDs.AppendElement(oc); - } - } - } - - // VRAddTestDevices == 1: add test device only if no real devices present - // VRAddTestDevices == 2: add test device always - if ((count == 0 && gfxPrefs::VRAddTestDevices() == 1) || - (gfxPrefs::VRAddTestDevices() == 2)) - { - // Keep existing debug HMD if possible - bool foundDebug = false; - for (size_t i = 0; i < mOculusHMDs.Length(); ++i) { - if (mOculusHMDs[i]->GetIsDebug()) { - newHMDs.AppendElement(mOculusHMDs[i]); - foundDebug = true; - } - } - - // If there isn't already a debug HMD, create one - if (!foundDebug) { - ovrHmd hmd = ovrHmd_CreateDebug(ovrHmd_DK2); - if (hmd) { - RefPtr oc = new HMDInfoOculus050(hmd, true, -1); - newHMDs.AppendElement(oc); - } - } - } - - mOculusHMDs = newHMDs; - - for (size_t j = 0; j < mOculusHMDs.Length(); ++j) { - aHMDResult.AppendElement(mOculusHMDs[j]); - } -} diff --git a/gfx/vr/gfxVROculus050.h b/gfx/vr/gfxVROculus050.h deleted file mode 100644 index 9a439bc333fd..000000000000 --- a/gfx/vr/gfxVROculus050.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * 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_OCULUS_050_H -#define GFX_VR_OCULUS_050_H - -#include "nsTArray.h" -#include "nsThreadUtils.h" -#include "mozilla/EnumeratedArray.h" -#include "mozilla/gfx/2D.h" -#include "mozilla/RefPtr.h" - -#include "gfxVR.h" -#include "ovr_capi_dynamic050.h" - -namespace mozilla { -namespace gfx { -namespace impl { - -class HMDInfoOculus050 : public VRHMDInfo { -public: - explicit HMDInfoOculus050(ovr050::ovrHmd aHMD, bool aDebug, int aDeviceID); - - bool SetFOV(const VRFieldOfView& aFOVLeft, const VRFieldOfView& aFOVRight, - double zNear, double zFar) override; - - virtual VRHMDSensorState GetSensorState() override; - virtual VRHMDSensorState GetImmediateSensorState() override; - void ZeroSensor() override; - bool KeepSensorTracking() override; - void NotifyVsync(const TimeStamp& aVsyncTimestamp) override; - - void FillDistortionConstants(uint32_t whichEye, - const IntSize& textureSize, const IntRect& eyeViewport, - const Size& destViewport, const Rect& destRect, - VRDistortionConstants& values) override; - - void Destroy(); - bool GetIsDebug() const; - int GetDeviceID() const; - -protected: - virtual ~HMDInfoOculus050() { - Destroy(); - MOZ_COUNT_DTOR_INHERITED(HMDInfoOculus050, VRHMDInfo); - } - - bool StartSensorTracking(); - void StopSensorTracking(); - - // must match the size of VRDistortionVertex - struct DistortionVertex { - float pos[2]; - float texR[2]; - float texG[2]; - float texB[2]; - float genericAttribs[4]; - }; - - ovr050::ovrHmd mHMD; - ovr050::ovrFovPort mFOVPort[2]; - uint32_t mTracking; - bool mDebug; // True if this is a debug HMD - int mDeviceID; // ID of device passed to ovrHmd_Create - - uint32_t mSensorTrackingFramesRemaining; -}; - -} // namespace impl - -class VRHMDManagerOculus050 : public VRHMDManager -{ -public: - static already_AddRefed Create(); - virtual bool Init() override; - virtual void Destroy() override; - virtual void GetHMDs(nsTArray >& aHMDResult) override; -protected: - VRHMDManagerOculus050() - : mOculusInitialized(false) - { } - - nsTArray > mOculusHMDs; - bool mOculusInitialized; - RefPtr mOculusThread; -}; - -} // namespace gfx -} // namespace mozilla - -#endif /* GFX_VR_OCULUS_050_H */ diff --git a/gfx/vr/moz.build b/gfx/vr/moz.build index b677a6e73923..191d0719009c 100644 --- a/gfx/vr/moz.build +++ b/gfx/vr/moz.build @@ -29,10 +29,6 @@ UNIFIED_SOURCES += [ 'VRManager.cpp', ] -SOURCES += [ - 'gfxVROculus050.cpp', -] - IPDL_SOURCES = [ 'ipc/PVRManager.ipdl', ] diff --git a/gfx/vr/ovr_capi_dynamic050.h b/gfx/vr/ovr_capi_dynamic050.h deleted file mode 100644 index 32dad2c35a61..000000000000 --- a/gfx/vr/ovr_capi_dynamic050.h +++ /dev/null @@ -1,284 +0,0 @@ -/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ -/* 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/. */ - -/* This file contains just the needed struct definitions for - * interacting with the Oculus VR C API, without needing to #include - * OVR_CAPI.h directly. Note that it uses the same type names as the - * CAPI, and cannot be #included at the same time as OVR_CAPI.h. It - * does not include the entire C API, just want's needed. - */ - -#ifndef mozilla_ovr_capi_dynamic050_h_ -#define mozilla_ovr_capi_dynamic050_h_ - -#define OVR_CAPI_050_LIMITED_MOZILLA 1 - -#if defined(_WIN32) -#define OVR_PFN __cdecl -#else -#define OVR_PFN -#endif - -#if !defined(OVR_ALIGNAS) -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 408) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)) -#define OVR_ALIGNAS(n) alignas(n) -#elif defined(__clang__) && !defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 300) && (__cplusplus >= 201103L) -#define OVR_ALIGNAS(n) alignas(n) -#elif defined(__clang__) && defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 401) && (__cplusplus >= 201103L) -#define OVR_ALIGNAS(n) alignas(n) -#elif defined(_MSC_VER) && (_MSC_VER >= 1900) -#define OVR_ALIGNAS(n) alignas(n) -#elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408) -#define OVR_ALIGNAS(n) alignas(n) -#elif defined(__GNUC__) || defined(__clang__) -#define OVR_ALIGNAS(n) __attribute__((aligned(n))) -#elif defined(_MSC_VER) || defined(__INTEL_COMPILER) -#define OVR_ALIGNAS(n) __declspec(align(n)) -#else -#error Need to define OVR_ALIGNAS -#endif -#endif - -namespace ovr050 { - -typedef char ovrBool; -typedef struct { int x, y; } ovrVector2i; -typedef struct { int w, h; } ovrSizei; -typedef struct { ovrVector2i Pos; ovrSizei Size; } ovrRecti; -typedef struct { float x, y, z, w; } ovrQuatf; -typedef struct { float x, y; } ovrVector2f; -typedef struct { float x, y, z; } ovrVector3f; -typedef struct { float M[4][4]; } ovrMatrix4f; - -typedef struct { - ovrQuatf Orientation; - ovrVector3f Position; -} ovrPosef; - -typedef struct OVR_ALIGNAS(8) { - ovrPosef ThePose; - ovrVector3f AngularVelocity; - ovrVector3f LinearVelocity; - ovrVector3f AngularAcceleration; - ovrVector3f LinearAcceleration; - float Pad; - double TimeInSeconds; -} ovrPoseStatef; - -typedef struct { - float UpTan; - float DownTan; - float LeftTan; - float RightTan; -} ovrFovPort; - -typedef enum { - ovrHmd_None = 0, - ovrHmd_DK1 = 3, - ovrHmd_DKHD = 4, - ovrHmd_DK2 = 6, - ovrHmd_BlackStar = 7, - ovrHmd_CB = 8, - ovrHmd_Other = 9, - ovrHmd_EnumSize = 0x7fffffff -} ovrHmdType; - -typedef enum { - ovrHmdCap_Present = 0x0001, - ovrHmdCap_Available = 0x0002, - ovrHmdCap_Captured = 0x0004, - ovrHmdCap_ExtendDesktop = 0x0008, - ovrHmdCap_DebugDevice = 0x0010, - ovrHmdCap_DisplayOff = 0x0040, - ovrHmdCap_LowPersistence = 0x0080, - ovrHmdCap_DynamicPrediction = 0x0200, - ovrHmdCap_NoVSync = 0x1000, - ovrHmdCap_NoMirrorToWindow = 0x2000 -} ovrHmdCapBits; - -typedef enum -{ - ovrTrackingCap_Orientation = 0x0010, - ovrTrackingCap_MagYawCorrection = 0x0020, - ovrTrackingCap_Position = 0x0040, - ovrTrackingCap_Idle = 0x0100, - ovrTrackingCap_EnumSize = 0x7fffffff -} ovrTrackingCaps; - -typedef enum { - ovrDistortionCap_Chromatic = 0x01, - ovrDistortionCap_TimeWarp = 0x02, - ovrDistortionCap_Vignette = 0x08, - ovrDistortionCap_NoRestore = 0x10, - ovrDistortionCap_FlipInput = 0x20, - ovrDistortionCap_SRGB = 0x40, - ovrDistortionCap_Overdrive = 0x80, - ovrDistortionCap_HqDistortion = 0x100, - ovrDistortionCap_LinuxDevFullscreen = 0x200, - ovrDistortionCap_ComputeShader = 0x400, - ovrDistortionCap_TimewarpJitDelay = 0x1000, - ovrDistortionCap_ProfileNoSpinWaits = 0x10000, - ovrDistortionCap_EnumSize = 0x7fffffff -} ovrDistortionCaps; - -typedef enum { - ovrEye_Left = 0, - ovrEye_Right = 1, - ovrEye_Count = 2, - ovrEye_EnumSize = 0x7fffffff -} ovrEyeType; - -typedef struct ovrHmdDesc_ { - void* Handle; - ovrHmdType Type; - const char* ProductName; - const char* Manufacturer; - short VendorId; - short ProductId; - char SerialNumber[24]; - short FirmwareMajor; - short FirmwareMinor; - float CameraFrustumHFovInRadians; - float CameraFrustumVFovInRadians; - float CameraFrustumNearZInMeters; - float CameraFrustumFarZInMeters; - - unsigned int HmdCaps; - unsigned int TrackingCaps; - unsigned int DistortionCaps; - - ovrFovPort DefaultEyeFov[ovrEye_Count]; - ovrFovPort MaxEyeFov[ovrEye_Count]; - ovrEyeType EyeRenderOrder[ovrEye_Count]; - - ovrSizei Resolution; - ovrVector2i WindowsPos; - - const char* DisplayDeviceName; - int DisplayId; -} ovrHmdDesc; - -typedef const ovrHmdDesc* ovrHmd; - -typedef enum { - ovrStatus_OrientationTracked = 0x0001, - ovrStatus_PositionTracked = 0x0002, - ovrStatus_CameraPoseTracked = 0x0004, - ovrStatus_PositionConnected = 0x0020, - ovrStatus_HmdConnected = 0x0080, - ovrStatus_EnumSize = 0x7fffffff -} ovrStatusBits; - -typedef struct ovrSensorData_ { - ovrVector3f Accelerometer; - ovrVector3f Gyro; - ovrVector3f Magnetometer; - float Temperature; - float TimeInSeconds; -} ovrSensorData; - - -typedef struct ovrTrackingState_ { - ovrPoseStatef HeadPose; - ovrPosef CameraPose; - ovrPosef LeveledCameraPose; - ovrSensorData RawSensorData; - unsigned int StatusFlags; - double LastVisionProcessingTime; - uint32_t LastCameraFrameCounter; - uint32_t Pad; -} ovrTrackingState; - -typedef struct OVR_ALIGNAS(8) ovrFrameTiming_ { - float DeltaSeconds; - float Pad; - double ThisFrameSeconds; - double TimewarpPointSeconds; - double NextFrameSeconds; - double ScanoutMidpointSeconds; - double EyeScanoutSeconds[2]; -} ovrFrameTiming; - -typedef struct ovrEyeRenderDesc_ { - ovrEyeType Eye; - ovrFovPort Fov; - ovrRecti DistortedViewport; - ovrVector2f PixelsPerTanAngleAtCenter; - ovrVector3f HmdToEyeViewOffset; -} ovrEyeRenderDesc; - -typedef struct ovrDistortionVertex_ { - ovrVector2f ScreenPosNDC; - float TimeWarpFactor; - float VignetteFactor; - ovrVector2f TanEyeAnglesR; - ovrVector2f TanEyeAnglesG; - ovrVector2f TanEyeAnglesB; -} ovrDistortionVertex; - -typedef struct ovrDistortionMesh_ { - ovrDistortionVertex* pVertexData; - unsigned short* pIndexData; - unsigned int VertexCount; - unsigned int IndexCount; -} ovrDistortionMesh; - -typedef enum { - ovrInit_Debug = 0x00000001, - ovrInit_ServerOptional = 0x00000002, - ovrInit_RequestVersion = 0x00000004, - ovrInit_ForceNoDebug = 0x00000008 -} ovrInitFlags; - -typedef enum { - ovrLogLevel_Debug = 0, - ovrLogLevel_Info = 1, - ovrLogLevel_Error = 2 -} ovrLogLevel; - -typedef void (OVR_PFN *ovrLogCallback)(int level, const char* message); - -typedef struct { - uint32_t Flags; - uint32_t RequestedMinorVersion; - ovrLogCallback LogCallback; - uint32_t ConnectionTimeoutMS; -} ovrInitParams; - -extern "C" { - -typedef ovrBool (OVR_PFN *pfn_ovr_Initialize)(ovrInitParams const* params); -typedef void (OVR_PFN *pfn_ovr_Shutdown)(); -typedef int (OVR_PFN *pfn_ovrHmd_Detect)(); -typedef ovrHmd (OVR_PFN *pfn_ovrHmd_Create)(int index); -typedef void (OVR_PFN *pfn_ovrHmd_Destroy)(ovrHmd hmd); -typedef ovrHmd (OVR_PFN *pfn_ovrHmd_CreateDebug)(ovrHmdType type); -typedef const char* (OVR_PFN *pfn_ovrHmd_GetLastError)(ovrHmd hmd); -typedef ovrBool (OVR_PFN *pfn_ovrHmd_AttachToWindow)(ovrHmd hmd, void* window, const ovrRecti* destMirrorRect, const ovrRecti* sourceRenderTargetRect); -typedef unsigned int (OVR_PFN *pfn_ovrHmd_GetEnabledCaps)(ovrHmd hmd); -typedef void (OVR_PFN *pfn_ovrHmd_SetEnabledCaps)(ovrHmd hmd, unsigned int hmdCaps); -typedef ovrBool (OVR_PFN *pfn_ovrHmd_ConfigureTracking)(ovrHmd hmd, unsigned int supportedTrackingCaps, unsigned int requiredTrackingCaps); -typedef void (OVR_PFN *pfn_ovrHmd_RecenterPose)(ovrHmd hmd); -typedef ovrTrackingState (OVR_PFN *pfn_ovrHmd_GetTrackingState)(ovrHmd hmd, double absTime); -typedef ovrSizei (OVR_PFN *pfn_ovrHmd_GetFovTextureSize)(ovrHmd hmd, ovrEyeType eye, ovrFovPort fov, float pixelsPerDisplayPixel); -typedef ovrEyeRenderDesc (OVR_PFN *pfn_ovrHmd_GetRenderDesc)(ovrHmd hmd, ovrEyeType eyeType, ovrFovPort fov); -typedef ovrBool (OVR_PFN *pfn_ovrHmd_CreateDistortionMesh)(ovrHmd hmd, ovrEyeType eyeType, ovrFovPort fov, unsigned int distortionCaps, ovrDistortionMesh *meshData); -typedef void (OVR_PFN *pfn_ovrHmd_DestroyDistortionMesh)(ovrDistortionMesh* meshData); -typedef void (OVR_PFN *pfn_ovrHmd_GetRenderScaleAndOffset)(ovrFovPort fov, ovrSizei textureSize, ovrRecti renderViewport, ovrVector2f uvScaleOffsetOut[2]); -typedef ovrFrameTiming (OVR_PFN *pfn_ovrHmd_GetFrameTiming)(ovrHmd hmd, unsigned int frameIndex); -typedef ovrFrameTiming (OVR_PFN *pfn_ovrHmd_BeginFrameTiming)(ovrHmd hmd, unsigned int frameIndex); -typedef void (OVR_PFN *pfn_ovrHmd_EndFrameTiming)(ovrHmd hmd); -typedef void (OVR_PFN *pfn_ovrHmd_ResetFrameTiming)(ovrHmd hmd, unsigned int frameIndex, bool vsync); -typedef void (OVR_PFN *pfn_ovrHmd_GetEyePoses)(ovrHmd hmd, unsigned int frameIndex, ovrVector3f hmdToEyeViewOffset[2], ovrPosef outEyePoses[2], ovrTrackingState* outHmdTrackingState); -typedef ovrPosef (OVR_PFN *pfn_ovrHmd_GetHmdPosePerEye)(ovrHmd hmd, ovrEyeType eye); -typedef void (OVR_PFN *pfn_ovrHmd_GetEyeTimewarpMatrices)(ovrHmd hmd, ovrEyeType eye, ovrPosef renderPose, ovrMatrix4f twmOut[2]); -typedef ovrMatrix4f (OVR_PFN *pfn_ovrMatrix4f_Projection) (ovrFovPort fov, float znear, float zfar, ovrBool rightHanded ); -typedef ovrMatrix4f (OVR_PFN *pfn_ovrMatrix4f_OrthoSubProjection) (ovrFovPort fov, ovrVector2f orthoScale, float orthoDistance, float eyeViewAdjustX); -typedef double (OVR_PFN *pfn_ovr_GetTimeInSeconds)(); - -} // extern "C" -} // namespace ovr050 - -#endif /* mozilla_ovr_capi_dynamic050_h_ */ diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index b703dd4347ad..925b2643c384 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -4922,16 +4922,11 @@ pref("dom.vr.enabled", false); #else pref("dom.vr.enabled", true); #endif -// Oculus > 0.5 pref("dom.vr.oculus.enabled", true); -// Oculus <= 0.5; will only trigger if > 0.5 is not used or found -pref("dom.vr.oculus050.enabled", true); // Cardboard VR device is disabled by default pref("dom.vr.cardboard.enabled", false); // OSVR device pref("dom.vr.osvr.enabled", false); -// 0 = never; 1 = only if real devices aren't there; 2 = always -pref("dom.vr.add-test-devices", 0); // Pose prediction reduces latency effects by returning future predicted HMD // poses to callers of the WebVR API. This currently only has an effect for // Oculus Rift on SDK 0.8 or greater. It is disabled by default for now due to