Trigger callbacks in RAF

This commit is contained in:
Manish Goregaokar 2019-07-08 16:19:59 -07:00
parent 33421e8ee0
commit 877b6c67a1
3 changed files with 33 additions and 21 deletions

View file

@ -845,20 +845,7 @@ impl VRDisplay {
let now = self.global().as_window().Performance().Now(); let now = self.global().as_window().Performance().Now();
if let Some(session) = self.xr_session.get() { if let Some(session) = self.xr_session.get() {
let mut callbacks = mem::replace(&mut *self.xr_raf_callback_list.borrow_mut(), vec![]); unreachable!("old webxr-on-webvr cruft")
if callbacks.is_empty() {
return;
}
self.sync_frame_data();
let frame = XRFrame::new(&self.global(), &session, self.frame_data.borrow().clone());
for (_, callback) in callbacks.drain(..) {
if let Some(callback) = callback {
let _ = callback.Call__(Finite::wrap(*now), &frame, ExceptionHandling::Report);
}
}
// frame submission is automatic in XR
self.SubmitFrame();
} else { } else {
self.running_display_raf.set(true); self.running_display_raf.set(true);
let mut callbacks = mem::replace(&mut *self.raf_callback_list.borrow_mut(), vec![]); let mut callbacks = mem::replace(&mut *self.raf_callback_list.borrow_mut(), vec![]);

View file

@ -16,6 +16,7 @@ use crate::dom::xrspace::XRSpace;
use crate::dom::xrviewerpose::XRViewerPose; use crate::dom::xrviewerpose::XRViewerPose;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use webvr_traits::WebVRFrameData; use webvr_traits::WebVRFrameData;
use webxr_api::Frame;
#[dom_struct] #[dom_struct]
pub struct XRFrame { pub struct XRFrame {
@ -34,11 +35,8 @@ impl XRFrame {
} }
} }
pub fn new( pub fn new(global: &GlobalScope, session: &XRSession, data: Frame) -> DomRoot<XRFrame> {
global: &GlobalScope, let data = unimplemented!();
session: &XRSession,
data: WebVRFrameData,
) -> DomRoot<XRFrame> {
reflect_dom_object( reflect_dom_object(
Box::new(XRFrame::new_inherited(session, data)), Box::new(XRFrame::new_inherited(session, data)),
global, global,

View file

@ -3,6 +3,7 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::compartments::InCompartment; use crate::compartments::InCompartment;
use crate::dom::bindings::callback::ExceptionHandling;
use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode; use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode;
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType;
@ -14,14 +15,16 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCal
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods;
use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods; use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods;
use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Error;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::refcounted::Trusted;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
use crate::dom::bindings::root::{DomRoot, MutDom, MutNullableDom}; use crate::dom::bindings::root::{DomRoot, MutDom, MutNullableDom};
use crate::dom::eventtarget::EventTarget; use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise; use crate::dom::promise::Promise;
use crate::dom::xrframe::XRFrame;
use crate::dom::xrinputsource::XRInputSource; use crate::dom::xrinputsource::XRInputSource;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::xrlayer::XRLayer; use crate::dom::xrlayer::XRLayer;
use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrrenderstate::XRRenderState; use crate::dom::xrrenderstate::XRRenderState;
@ -34,6 +37,7 @@ use ipc_channel::ipc::IpcSender;
use ipc_channel::router::ROUTER; use ipc_channel::router::ROUTER;
use profile_traits::ipc; use profile_traits::ipc;
use std::cell::Cell; use std::cell::Cell;
use std::mem;
use std::rc::Rc; use std::rc::Rc;
use webxr_api::{self, Frame, Session}; use webxr_api::{self, Frame, Session};
@ -98,7 +102,6 @@ impl XRSession {
/// https://immersive-web.github.io/webxr/#xr-animation-frame /// https://immersive-web.github.io/webxr/#xr-animation-frame
fn raf_callback(&self, (time, frame): (f64, Frame)) { fn raf_callback(&self, (time, frame): (f64, Frame)) {
let session = self.session.borrow_mut();
// Step 1 // Step 1
if let Some(pending) = self.pending_render_state.take() { if let Some(pending) = self.pending_render_state.take() {
// https://immersive-web.github.io/webxr/#apply-the-pending-render-state // https://immersive-web.github.io/webxr/#apply-the-pending-render-state
@ -110,6 +113,7 @@ impl XRSession {
// XXXManishearth handle inline sessions and composition disabled flag // XXXManishearth handle inline sessions and composition disabled flag
let layer = pending.GetBaseLayer(); let layer = pending.GetBaseLayer();
if let Some(layer) = layer { if let Some(layer) = layer {
let mut session = self.session.borrow_mut();
if let Some(layer) = layer.downcast::<XRWebGLLayer>() { if let Some(layer) = layer.downcast::<XRWebGLLayer>() {
session.update_webgl_external_image_api( session.update_webgl_external_image_api(
layer.Context().webgl_sender().webxr_external_image_api(), layer.Context().webgl_sender().webxr_external_image_api(),
@ -119,6 +123,29 @@ impl XRSession {
} }
} }
} }
// Step 2
if self.active_render_state.get().GetBaseLayer().is_none() {
return;
}
// Step 3: XXXManishearth handle inline session
// Step 4-5
let mut callbacks = mem::replace(&mut *self.raf_callback_list.borrow_mut(), vec![]);
let frame = XRFrame::new(&self.global(), self, frame);
// Step 6-7: XXXManishearth set `active`/`animationFrame` bools on `frame` to true
// Step 8
for (_, callback) in callbacks.drain(..) {
if let Some(callback) = callback {
let _ = callback.Call__(Finite::wrap(time), &frame, ExceptionHandling::Report);
}
}
// Step 9: XXXManishearth unset `active` bool on `frame`
self.session.borrow_mut().render_animation_frame();
} }
} }