• Klaus Weidner's avatar
    Add SubmitFrameMissing mojo call for WebVR/WebXR · f5bbb138
    Klaus Weidner authored
    Goal is that we get a clean lifecycle for a functioning WebVR/WebXR
    presentation render loop. It's started by a presenting SendVSync, calls
    GetVSync to schedule the next frame, and is ended by a SubmitFrame
    call. If there was nothing drawn, it uses SubmitFrameMissing instead of the
    usual SubmitFrame/SubmitFrameWithTextureHandle.
    
    In WebVR 1.1, submitFrame is a JS call, and the app can exit its animation
    loop without calling it. WebXR had an analogous feature where SubmitFrame
    was skipped if the framebuffer wasn't touched by drawing calls. This
    made it hard to tell for the device side if a frame is done or not.
    
    WebVR 1.1 worked around this by deferring a GetVSync call until after
    SubmitFrame, but this was complex:
    
    -  // The logic here is a bit subtle. We get called from one of the following
    -  // four contexts:
    -  //
    -  // (a) from requestAnimationFrame if outside an animating context (i.e. the
    -  //     first rAF call from inside a getVRDisplays() promise)
    -  //
    -  // (b) from requestAnimationFrame in an animating context if the JS code
    -  //     calls rAF after submitFrame.
    -  //
    -  // (c) from submitFrame if that is called after rAF.
    -  //
    -  // (d) from ProcessScheduledAnimations if a rAF callback finishes without
    -  //     submitting a frame.
    -  //
    -  // These cases are mutually exclusive which prevents duplicate GetVSync
    -  // calls. Case (a) only applies outside an animating context
    -  // (in_animation_frame_ is false), and (b,c,d) all require an animating
    -  // context. While in an animating context, submitFrame is called either
    -  // before rAF (b), after rAF (c), or not at all (d). If rAF isn't called at
    -  // all, there won't be future frames.
    
    This CL removes those special cases and just always calls RequestVSync from
    requestAnimationFrame, collapsing cases (a) and (b) into an unconditional call.
    Cases (c) and (d) are now no longer needed and removed.
    
    The layout tests now check the SubmitFrameMissing call count.
    
    Also added a check for a WebXR exclusive session ending in the middle of a
    frame. (The layout tests revealed this since OnEndFrame no longer exits early
    on a clean framebuffer.)
    
    Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
    Change-Id: I5722097d421ca9448760e696ea379895a1320199
    Reviewed-on: https://chromium-review.googlesource.com/996614Reviewed-by: default avatarIan Vollick <vollick@chromium.org>
    Reviewed-by: default avatarBrandon Jones <bajones@chromium.org>
    Reviewed-by: default avatarMartin Barbella <mbarbella@chromium.org>
    Reviewed-by: default avatarBill Orr <billorr@chromium.org>
    Commit-Queue: Klaus Weidner <klausw@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#548518}
    f5bbb138
oculus_render_loop.h 3.15 KB