Skip to content

Commit

Permalink
Compositor: Use PostPresentHandoff() to postpone waiting on the runni…
Browse files Browse the repository at this point in the history
…ng start.
  • Loading branch information
LibreVR committed Oct 26, 2016
1 parent dc8b0ce commit f867beb
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 8 deletions.
1 change: 1 addition & 0 deletions Revive/Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ ovrMirrorTextureData::ovrMirrorTextureData(vr::EGraphicsAPIConvention api, ovrMi
ovrHmdStruct::ovrHmdStruct()
: ShouldQuit(false)
, IsVisible(false)
, Submitted(true)
, FrameIndex(0)
, StatsIndex(0)
, Compositor(nullptr)
Expand Down
1 change: 1 addition & 0 deletions Revive/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct ovrMirrorTextureData
struct ovrHmdStruct
{
// Session status
bool Submitted;
bool ShouldQuit;
bool IsVisible;
char StringBuffer[vr::k_unMaxPropertyStringSize];
Expand Down
16 changes: 9 additions & 7 deletions Revive/CompositorBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,13 @@ vr::EVRCompositorError CompositorBase::SubmitFrame(const ovrViewScaleDesc* viewS
}
m_ActiveOverlays = activeOverlays;

// TODO: Handle compositor errors.
vr::EVRCompositorError error;
if (m_SceneLayer && m_SceneLayer->Type == ovrLayerType_EyeFov)
{
ovrLayerEyeFov* sceneLayer = (ovrLayerEyeFov*)m_SceneLayer;
SubmitSceneLayer(sceneLayer->Viewport, sceneLayer->Fov, sceneLayer->ColorTexture, sceneLayer->Header.Flags);
error = SubmitSceneLayer(sceneLayer->Viewport, sceneLayer->Fov, sceneLayer->ColorTexture, sceneLayer->Header.Flags);

if (m_MirrorTexture)
if (m_MirrorTexture && error == vr::VRCompositorError_None)
RenderMirrorTexture(m_MirrorTexture, sceneLayer->ColorTexture);
}
else if (m_SceneLayer && m_SceneLayer->Type == ovrLayerType_EyeMatrix)
Expand All @@ -124,16 +124,18 @@ vr::EVRCompositorError CompositorBase::SubmitFrame(const ovrViewScaleDesc* viewS
MatrixToFovPort(sceneLayer->Matrix[ovrEye_Right])
};

SubmitSceneLayer(sceneLayer->Viewport, fov, sceneLayer->ColorTexture, sceneLayer->Header.Flags);
error = SubmitSceneLayer(sceneLayer->Viewport, fov, sceneLayer->ColorTexture, sceneLayer->Header.Flags);

if (m_MirrorTexture)
if (m_MirrorTexture && error == vr::VRCompositorError_None)
RenderMirrorTexture(m_MirrorTexture, sceneLayer->ColorTexture);
}

m_SceneLayer = nullptr;

// Call WaitGetPoses() to actually display the frame.
return vr::VRCompositor()->WaitGetPoses(nullptr, 0, nullptr, 0);
// Call PostPresentHandoff() to actually display the frame.
vr::VRCompositor()->PostPresentHandoff();

return error;
}

vr::VROverlayHandle_t CompositorBase::CreateOverlay()
Expand Down
7 changes: 6 additions & 1 deletion Revive/REV_CAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,11 @@ OVR_PUBLIC_FUNCTION(ovrTrackingState) ovr_GetTrackingState(ovrSession session, d

// Get the device poses.
vr::TrackedDevicePose_t poses[vr::k_unMaxTrackedDeviceCount];
vr::VRCompositor()->GetLastPoses(poses, vr::k_unMaxTrackedDeviceCount, nullptr, 0);
if (session->Submitted)
vr::VRCompositor()->WaitGetPoses(poses, vr::k_unMaxTrackedDeviceCount, nullptr, 0);
else
vr::VRCompositor()->GetLastPoses(poses, vr::k_unMaxTrackedDeviceCount, nullptr, 0);
session->Submitted = false;

// Convert the head pose
state.HeadPose = rev_TrackedDevicePoseToOVRPose(poses[vr::k_unTrackedDeviceIndex_Hmd], absTime);
Expand Down Expand Up @@ -758,6 +762,7 @@ OVR_PUBLIC_FUNCTION(ovrResult) ovr_SubmitFrame(ovrSession session, long long fra
session->FrameIndex++;
else
session->FrameIndex = frameIndex;
session->Submitted = true;

vr::VRCompositor()->GetCumulativeStats(&session->Stats[session->FrameIndex % ovrMaxProvidedFrameStats], sizeof(vr::Compositor_CumulativeStats));

Expand Down

0 comments on commit f867beb

Please sign in to comment.