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) { ...@@ -942,6 +942,7 @@ void VrShellGl::DrawFrame(int16_t frame_index, base::TimeTicks current_time) {
if (ShouldDrawWebVr()) { if (ShouldDrawWebVr()) {
static_assert(!((kPoseRingBufferSize - 1) & kPoseRingBufferSize), static_assert(!((kPoseRingBufferSize - 1) & kPoseRingBufferSize),
"kPoseRingBufferSize must be a power of 2"); "kPoseRingBufferSize must be a power of 2");
// Copy into render info for overlay UI. WebVR doesn't use this.
render_info_primary_.head_pose = render_info_primary_.head_pose =
webvr_head_pose_[frame_index % kPoseRingBufferSize]; webvr_head_pose_[frame_index % kPoseRingBufferSize];
webvr_frame_oustanding_[frame_index % kPoseRingBufferSize] = false; webvr_frame_oustanding_[frame_index % kPoseRingBufferSize] = false;
...@@ -1085,6 +1086,11 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index, ...@@ -1085,6 +1086,11 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index,
acquired_frame_.Unbind(); 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_) { if (ShouldDrawWebVr() && surfaceless_rendering_ && !webvr_use_gpu_fence_) {
// Continue with submit once a GL fence signals that current drawing // Continue with submit once a GL fence signals that current drawing
// operations have completed. // operations have completed.
...@@ -1095,10 +1101,10 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index, ...@@ -1095,10 +1101,10 @@ void VrShellGl::DrawIntoAcquiredFrame(int16_t frame_index,
task_runner_->PostTask( task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index, base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
render_info_primary_.head_pose, base::Passed(&fence))); webvr_head_pose, base::Passed(&fence)));
} else { } else {
// Continue with submit immediately. // 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( ...@@ -1115,7 +1121,7 @@ void VrShellGl::DrawFrameSubmitWhenReady(
task_runner_->PostTask( task_runner_->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index, base::BindOnce(webvr_delayed_frame_submit_.callback(), frame_index,
render_info_primary_.head_pose, base::Passed(&fence))); head_pose, base::Passed(&fence)));
return; 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