Chromium Code Reviews| Index: third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| diff --git a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| index 5122c99d42d313daa98f7a7ad95c259908966e61..a98b7a8de59704317c8f0ffc8d6b0042e7a75bde 100644 |
| --- a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| +++ b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| @@ -129,12 +129,10 @@ VREyeParameters* VRDisplay::getEyeParameters(const String& which_eye) { |
| } |
| } |
| -int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { |
| - DVLOG(2) << __FUNCTION__; |
| - Document* doc = this->GetDocument(); |
| - if (!doc) |
| - return 0; |
| - pending_vrdisplay_raf_ = true; |
| +void VRDisplay::RequestVSync() { |
| + if (pending_vsync_ || !pending_vrdisplay_raf_) |
| + return; |
| + |
| if (!vr_v_sync_provider_.is_bound()) { |
| ConnectVSyncProvider(); |
| } else if (!display_blurred_ && !pending_vsync_) { |
| @@ -142,6 +140,17 @@ int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { |
| vr_v_sync_provider_->GetVSync(ConvertToBaseCallback( |
| WTF::Bind(&VRDisplay::OnVSync, WrapWeakPersistent(this)))); |
| } |
| +} |
| + |
| +int VRDisplay::requestAnimationFrame(FrameRequestCallback* callback) { |
| + DVLOG(2) << __FUNCTION__; |
| + Document* doc = this->GetDocument(); |
| + if (!doc) |
| + return 0; |
| + pending_vrdisplay_raf_ = true; |
| + if (did_submit_this_frame_) { |
| + RequestVSync(); |
| + } |
|
bajones
2017/05/18 15:59:18
I'm not sure what this call site provides? Seems l
mthiesse
2017/05/18 16:09:01
This code is all really subtle and kind of scary.
klausw
2017/05/18 22:22:29
I've added a detailed explanation in RequestVSync,
|
| callback->use_legacy_time_base_ = false; |
| return EnsureScriptedAnimationController(doc).RegisterCallback(callback); |
| } |
| @@ -606,6 +615,8 @@ void VRDisplay::submitFrame() { |
| vr_frame_id_, |
| gpu::MailboxHolder(static_image->GetMailbox(), |
| static_image->GetSyncToken(), GL_TEXTURE_2D)); |
| + did_submit_this_frame_ = true; |
| + RequestVSync(); |
| // If preserveDrawingBuffer is false, must clear now. Normally this |
| // happens as part of compositing, but that's not active while |
| @@ -756,7 +767,12 @@ void VRDisplay::ProcessScheduledAnimations(double timestamp) { |
| // that may be called later. |
| AutoReset<bool> animating(&in_animation_frame_, true); |
| pending_vrdisplay_raf_ = false; |
| + did_submit_this_frame_ = false; |
| scripted_animation_controller_->ServiceScriptedAnimations(timestamp); |
| + if (!did_submit_this_frame_) { |
| + DVLOG(2) << __FUNCTION__ << ": vrDisplay.rAF did not submit a frame"; |
| + RequestVSync(); |
| + } |
| } |
|
mthiesse
2017/05/18 16:09:01
Add a DCHECK here that if pending_vrdisplay_raf_ i
klausw
2017/05/18 22:22:29
Done.
|
| // For GVR, we shut down normal vsync processing during VR presentation. |