Commit ef56830b authored by Klaus Weidner's avatar Klaus Weidner Committed by Commit Bot

Fix out-of-sync poses for WebVR

Change 7332d074 "[vr] Add controller
tooltips" changed the OnVSync controller handling to overwrite
render_info_primary_.head_pose, and if this happened in between
DrawFrame and DrawIntoAcquiredFrame it would submit with a wrong
pose, leading to jerky head tracking.

The fix is to always use the saved WebVR pose and ignore the
render_info_primary_.head_pose member.

BUG=808147

Change-Id: I1c9b3e9c9e7dad6c9dff2837ae00d46a6fecb915
Reviewed-on: https://chromium-review.googlesource.com/903542Reviewed-by: default avatarIan Vollick <vollick@chromium.org>
Commit-Queue: Klaus Weidner <klausw@chromium.org>
Cr-Commit-Position: refs/heads/master@{#534609}
parent 1131391c
......@@ -942,6 +942,7 @@ void VrShellGl::DrawFrame(int16_t frame_index, base::TimeTicks current_time) {
if (ShouldDrawWebVr()) {
static_assert(!((kPoseRingBufferSize - 1) & kPoseRingBufferSize),
"kPoseRingBufferSize must be a power of 2");
// Copy into render info for overlay UI. WebVR doesn't use this.
render_info_primary_.head_pose =
webvr_head_pose_[frame_index % kPoseRingBufferSize];
webvr_frame_oustanding_[frame_index % kPoseRingBufferSize] = false;
......@@ -1085,6 +1086,11 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index,
acquired_frame_.Unbind();
}
// GVR submit needs the saved head pose that was used for JS rendering. Don't
// use render_info_primary_.head_pose here, that may have been overwritten by
// OnVSync's controller handling.
gfx::Transform webvr_head_pose =
webvr_head_pose_[frame_index % kPoseRingBufferSize];
if (ShouldDrawWebVr() && surfaceless_rendering_ && !webvr_use_gpu_fence_) {
// Continue with submit once a GL fence signals that current drawing
// operations have completed.
......@@ -1095,10 +1101,10 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index,
task_runner_->PostTask(
FROM_HERE,
base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
render_info_primary_.head_pose, base::Passed(&fence)));
webvr_head_pose, base::Passed(&fence)));
} else {
// Continue with submit immediately.
DrawFrameSubmitNow(frame_index, render_info_primary_.head_pose);
DrawFrameSubmitNow(frame_index, webvr_head_pose);
}
}
......@@ -1115,7 +1121,7 @@ void VrShellGl::DrawFrameSubmitWhenReady(
task_runner_->PostTask(
FROM_HERE,
base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
render_info_primary_.head_pose, base::Passed(&fence)));
head_pose, base::Passed(&fence)));
return;
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment