 Chromium Code Reviews
 Chromium Code Reviews Issue 2888313002:
  WebVR: Defer GetVSync calls until the current frame is submitted.  (Closed)
    
  
    Issue 2888313002:
  WebVR: Defer GetVSync calls until the current frame is submitted.  (Closed) 
  | 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. |