Configuration option for oculus prediction time workaround

pull/615/head
Mads Buvik Sandvei 5 years ago
parent c9e761eb88
commit b5675b7525

@ -19,6 +19,7 @@
#include <osg/Camera> #include <osg/Camera>
#include <algorithm>
#include <vector> #include <vector>
#include <array> #include <array>
#include <iostream> #include <iostream>
@ -56,6 +57,10 @@ namespace MWVR
return; return;
} }
Log(Debug::Verbose) << "Using openxr sync phase " << syncPhase; Log(Debug::Verbose) << "Using openxr sync phase " << syncPhase;
mUseSteadyClock = Settings::Manager::getBool("use steady clock", "VR");
if (mUseSteadyClock)
Log(Debug::Verbose) << "Using chrono::steady_clock instead of openxr predicted display times.";
} }
VRSession::~VRSession() VRSession::~VRSession()
@ -236,32 +241,22 @@ namespace MWVR
auto* xr = Environment::get().getManager(); auto* xr = Environment::get().getManager();
xr->handleEvents(); xr->handleEvents();
//auto frameState = xr->impl().frameState(); auto epochTime = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
// auto predictedDisplayTime = frameState.predictedDisplayTime; auto predictedDisplayTime = std::max(xr->getLastPredictedDisplayTime(), epochTime);
// if (predictedDisplayTime == 0) auto predictedDisplayPeriod = std::max(xr->getLastPredictedDisplayPeriod(), (long long)1000000);
// { float intervalsf = static_cast<double>(mLastFrameInterval.count()) / static_cast<double>(predictedDisplayPeriod);
// // First time, need to invent a frame time since openxr won't help us without a call to waitframe.
// predictedDisplayTime = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
// }
// else
// {
// // Predict display time based on real framerate
// float intervalsf = static_cast<double>(mLastFrameInterval.count()) / static_cast<double>(mLastPredictedDisplayPeriod);
// int intervals = std::max((int)std::roundf(intervalsf), 1);
// predictedDisplayTime = mLastPredictedDisplayTime + intervals * (mFrames - mLastRenderedFrame) * mLastPredictedDisplayPeriod;
// }
//////////////////////// OCULUS BUG //////////////////////// OCULUS BUG
//////////////////// Oculus will suddenly start monotonically increasing their predicted display time by precisely 1 second //////////////////// Oculus will suddenly start increasing their predicted display time by precisely 1 second per frame
//////////////////// regardless of real time passed, causing predictions to go crazy due to the time difference. //////////////////// regardless of real time passed, causing predictions to go crazy due to the time difference.
//////////////////// Therefore, for the time being, i ignore oculus' predicted display time altogether. //////////////////// Therefore, for the time being, i ignore oculus' predicted display time altogether.
long long predictedDisplayTime = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count(); if(mUseSteadyClock)
predictedDisplayTime = epochTime;
if (mFrames > 1) if (mFrames > 1)
{ {
auto framePeriod = xr->getLastPredictedDisplayPeriod();
float intervalsf = static_cast<double>(mLastFrameInterval.count()) / static_cast<double>(framePeriod);
int intervals = std::max((int)std::roundf(intervalsf), 1); int intervals = std::max((int)std::roundf(intervalsf), 1);
predictedDisplayTime = predictedDisplayTime + intervals * (mFrames - mLastRenderedFrame) * framePeriod; predictedDisplayTime = predictedDisplayTime + intervals * (mFrames - mLastRenderedFrame) * predictedDisplayPeriod;
} }

@ -84,6 +84,7 @@ namespace MWVR
std::condition_variable mCondition{}; std::condition_variable mCondition{};
FramePhase mXrSyncPhase{ FramePhase::Cull }; FramePhase mXrSyncPhase{ FramePhase::Cull };
bool mUseSteadyClock{ false };
long long mFrames{ 0 }; long long mFrames{ 0 };
long long mLastRenderedFrame{ 0 }; long long mLastRenderedFrame{ 0 };
long long mLastPredictedDisplayTime{ 0 }; long long mLastPredictedDisplayTime{ 0 };

@ -916,4 +916,8 @@ realistic combat maximum swing velocity = 4.0
haptics enabled = true haptics enabled = true
# Flip the order of eyes in the mirror texture (to allow cross eyed view) # Flip the order of eyes in the mirror texture (to allow cross eyed view)
flip mirror texture order = false flip mirror texture order = false
# Work around for some preview openxr runtimes whose display time predictions do not work
# Use this if tracking seems crazy.
use steady clock = true
Loading…
Cancel
Save