diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index 540efdf89..7d28b4bae 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -752,6 +752,8 @@ namespace MWInput } } } + +#ifndef USE_OPENXR if (actionIsActive(A_MoveForward) || actionIsActive(A_MoveBackward) || actionIsActive(A_MoveLeft) || @@ -766,6 +768,7 @@ namespace MWInput } else { updateIdleTime(dt); } +#endif } else mGamepadZoom = 0; diff --git a/apps/openmw/mwvr/openxrsession.cpp b/apps/openmw/mwvr/openxrsession.cpp index 43afb3d48..04c8f5bb6 100644 --- a/apps/openmw/mwvr/openxrsession.cpp +++ b/apps/openmw/mwvr/openxrsession.cpp @@ -26,15 +26,11 @@ namespace MWVR OpenXRSession::OpenXRSession( osg::ref_ptr XR) : mXR(XR) - , mFrameEndTimePoint(clock::now()) - , mFrameBeginTimePoint(mFrameEndTimePoint) { - mXRThread = std::thread([this] {run(); }); } OpenXRSession::~OpenXRSession() { - mShouldQuit = true; } void OpenXRSession::setLayer( @@ -51,55 +47,15 @@ namespace MWVR static int wat = 0; if (!mXR->sessionRunning()) return; - if (!mShouldRenderLayers) - { + if (!mPredictionsReady) return; - } - //if (wat++ % 100 != 0) - // return; - - - //std::unique_lock renderLock(mRenderMutex); - //timer.checkpoint("Mutex"); for (auto layer : mLayerStack.layerObjects()) layer->swapBuffers(gc); - mFrameEndTimePoint = clock::now(); - auto nanoseconds_elapsed = std::chrono::duration_cast(mFrameEndTimePoint - mFrameBeginTimePoint); - auto milliseconds_elapsed = std::chrono::duration_cast(nanoseconds_elapsed); - mRenderTimes.push_back(nanoseconds_elapsed.count()); - Log(Debug::Verbose) << "Render time: " << milliseconds_elapsed.count() << "ms"; - //mShouldRenderLayers = true; + timer.checkpoint("Rendered"); - mXR->endFrame(predictedDisplayTime(), &mLayerStack); - Log(Debug::Verbose) << "mFrameEndTimePoint: " << mFrameEndTimePoint.time_since_epoch().count() / 1000000; - Log(Debug::Verbose) << "mFrameBeginTimePoint: " << mFrameBeginTimePoint.time_since_epoch().count() / 1000000; - Log(Debug::Verbose) << "mPredictedDisplayTimeRealTime: " << mPredictedDisplayTimeRealTime.time_since_epoch().count() / 1000000; - Log(Debug::Verbose) << "mPredictedTime: " << predictedDisplayTime() / 1000000; - Log(Debug::Verbose) << "mXrDisplayTime: " << mXR->impl().frameState().predictedDisplayTime / 1000000; - //mShouldRenderLayers = false; - mFrameBeginTimePoint = clock::now(); - - //mRenderTimes.push_front(std::chrono::duration_cast(mFrameEndTimePoint - mFrameBeginTimePoint).count()); - //if(mRenderTimes.size() > 33) mRenderTimes.pop_back(); - - //if (mPredictedPeriod == 0) - //{ - // mPredictedPeriod = milliseconds_elapsed; - // mPredictedPeriods = 1; - //} - //else - //{ - // double periodDevianceMagnitude = static_cast(std::max(milliseconds_elapsed, mPredictedPeriod)) / static_cast(std::min(milliseconds_elapsed, mPredictedPeriod)); - // double periodStability = std::pow(periodDevianceMagnitude, -2.); - // mPredictedPeriod = (1. - periodStability) * mPredictedPeriod + (periodStability)*milliseconds_elapsed; - //} - - } - - void OpenXRSession::run() - { + mXR->endFrame(mXR->impl().frameState().predictedDisplayTime, &mLayerStack); } void OpenXRSession::waitFrame() @@ -107,35 +63,17 @@ namespace MWVR // For now it seems we must just accept crap performance from the rendering loop // Since Oculus' implementation of waitFrame() does not even attempt to reflect real // render time and just incurs a huge useless delay. - - Log(Debug::Verbose) << "OpenXRSesssion::beginframe"; - Timer timer("OpenXRSession::beginFrame"); + Timer timer("OpenXRSession::waitFrame"); mXR->waitFrame(); timer.checkpoint("waitFrame"); predictNext(0); - mShouldRenderLayers = true; + mPredictionsReady = true; } void OpenXRSession::predictNext(int extraPeriods) { - int64_t sum = 0; - while (mRenderTimes.size() > 10) - mRenderTimes.pop_front(); - for (unsigned i = 0; i < mRenderTimes.size(); i++) - { - sum += mRenderTimes[i] / mXR->impl().frameState().predictedDisplayPeriod; - } - int64_t average = sum / std::max((int64_t)mRenderTimes.size(), (int64_t)1); - - mPredictedPeriods = std::max(average, (int64_t)0) + extraPeriods; - - Log(Debug::Verbose) << "Periods: " << mPredictedPeriods; - - int64_t future = (mPredictedPeriods)*mXR->impl().frameState().predictedDisplayPeriod; - - mPredictedDisplayTime = mXR->impl().frameState().predictedDisplayTime + future; - mPredictedDisplayTimeRealTime = mFrameBeginTimePoint + nanoseconds(future + mXR->impl().frameState().predictedDisplayPeriod); + auto mPredictedDisplayTime = mXR->impl().frameState().predictedDisplayTime; // Update pose predictions mPredictedPoses.head[(int)TrackedSpace::STAGE] = mXR->impl().getPredictedLimbPose(mPredictedDisplayTime, TrackedLimb::HEAD, TrackedSpace::STAGE); @@ -150,9 +88,6 @@ namespace MWVR mPredictedPoses.eye[(int)Chirality::LEFT_HAND][(int)TrackedSpace::VIEW] = fromXR(hmdViews[(int)Chirality::LEFT_HAND].pose); mPredictedPoses.eye[(int)Chirality::RIGHT_HAND][(int)TrackedSpace::STAGE] = fromXR(stageViews[(int)Chirality::RIGHT_HAND].pose); mPredictedPoses.eye[(int)Chirality::RIGHT_HAND][(int)TrackedSpace::VIEW] = fromXR(hmdViews[(int)Chirality::RIGHT_HAND].pose); - - //std::unique_lock lock(mSyncMutex); - //mSync.notify_all(); } } diff --git a/apps/openmw/mwvr/openxrsession.hpp b/apps/openmw/mwvr/openxrsession.hpp index f6ded7aea..a6152e121 100644 --- a/apps/openmw/mwvr/openxrsession.hpp +++ b/apps/openmw/mwvr/openxrsession.hpp @@ -37,41 +37,21 @@ namespace MWVR void setLayer(OpenXRLayerStack::Layer layerType, OpenXRLayer* layer); void swapBuffers(osg::GraphicsContext* gc); - void run(); PoseSets& predictedPoses() { return mPredictedPoses; }; - //! Call before rendering to update predictions + //! Call before updating poses void waitFrame(); - //! Most recent prediction for display time of next frame. - int64_t predictedDisplayTime() { return mPredictedDisplayTime; }; - //! Update predictions void predictNext(int extraPeriods); OpenXRLayerStack mLayerStack{}; osg::ref_ptr mXR; - std::thread mXRThread; - bool mShouldQuit = false; PoseSets mPredictedPoses{}; - int64_t mPredictedDisplayTime{ 0 }; - time_point mPredictedDisplayTimeRealTime{ nanoseconds(0) }; - std::deque mRenderTimes; - int64_t mPredictedPeriods{ 0 }; - double mFps{ 0. }; - time_point mFrameEndTimePoint; - time_point mFrameBeginTimePoint; - - bool mNeedSync = true; - std::condition_variable mSync{}; - std::mutex mSyncMutex{}; - - bool mShouldRenderLayers = false; - std::condition_variable mRenderSignal{}; - std::mutex mRenderMutex{}; + bool mPredictionsReady; }; } diff --git a/apps/openmw/mwvr/openxrswapchain.cpp b/apps/openmw/mwvr/openxrswapchain.cpp index b8c79aad3..050d13fd8 100644 --- a/apps/openmw/mwvr/openxrswapchain.cpp +++ b/apps/openmw/mwvr/openxrswapchain.cpp @@ -137,20 +137,8 @@ namespace MWVR { waitInfo.timeout = XR_INFINITE_DURATION; CHECK_XRCMD(xrWaitSwapchainImage(mSwapchain, &waitInfo)); - // Oculus bug: Either the swapchain image index is off by 1 or xrEndFrame() choses the wrong swapchain image. - //mRenderBuffer->endFrame(gc, mSwapchainImageBuffers[0].image); - //mRenderBuffer->endFrame(gc, mSwapchainImageBuffers[1].image); - //mRenderBuffer->endFrame(gc, mSwapchainImageBuffers[2].image); - // mRenderBuffer->endFrame(gc, mSwapchainImageBuffers[(swapchainImageIndex + 1) % 3].image); mRenderBuffer->endFrame(gc, mSwapchainImageBuffers[swapchainImageIndex].image); - //Log(Debug::Verbose) << "swapchainImageIndex: " << swapchainImageIndex; - //Log(Debug::Verbose) << "swapchainImage: " << mSwapchainImageBuffers[swapchainImageIndex].image; - static int asdf = 0; - //Log(Debug::Verbose) << "OpenXRSwapchainImpl ENDFRAME[ " << (asdf++ / 3) << "]"; - - swapCount = asdf / 3; - XrSwapchainImageReleaseInfo releaseInfo{ XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO }; CHECK_XRCMD(xrReleaseSwapchainImage(mSwapchain, &releaseInfo)); return swapchainImageIndex; diff --git a/apps/openmw/mwvr/openxrswapchain.hpp b/apps/openmw/mwvr/openxrswapchain.hpp index 496ca6049..5a52b25c8 100644 --- a/apps/openmw/mwvr/openxrswapchain.hpp +++ b/apps/openmw/mwvr/openxrswapchain.hpp @@ -10,8 +10,6 @@ namespace MWVR { class OpenXRSwapchainImpl; - extern int swapCount; - class OpenXRSwapchain { public: diff --git a/apps/openmw/mwvr/openxrviewer.cpp b/apps/openmw/mwvr/openxrviewer.cpp index c3ad1486e..dbd70711b 100644 --- a/apps/openmw/mwvr/openxrviewer.cpp +++ b/apps/openmw/mwvr/openxrviewer.cpp @@ -199,7 +199,7 @@ namespace MWVR timer.checkpoint("Poses"); // TODO: Keep track of these in the session too. - auto stageViews = mXR->impl().getPredictedViews(mXRSession->predictedDisplayTime(), TrackedSpace::STAGE); + auto stageViews = mXR->impl().getPredictedViews(mXR->impl().frameState().predictedDisplayTime, TrackedSpace::STAGE); mCompositionLayerProjectionViews[0].fov = stageViews[0].fov; mCompositionLayerProjectionViews[1].fov = stageViews[1].fov; timer.checkpoint("Fovs");