diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/vrdisplay.rs | 15 | ||||
-rw-r--r-- | components/script/dom/xrframe.rs | 8 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 31 |
3 files changed, 33 insertions, 21 deletions
diff --git a/components/script/dom/vrdisplay.rs b/components/script/dom/vrdisplay.rs index 0fd9cfee560..422ba181410 100644 --- a/components/script/dom/vrdisplay.rs +++ b/components/script/dom/vrdisplay.rs @@ -845,20 +845,7 @@ impl VRDisplay { let now = self.global().as_window().Performance().Now(); if let Some(session) = self.xr_session.get() { - let mut callbacks = mem::replace(&mut *self.xr_raf_callback_list.borrow_mut(), vec![]); - 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(); + unreachable!("old webxr-on-webvr cruft") } else { self.running_display_raf.set(true); let mut callbacks = mem::replace(&mut *self.raf_callback_list.borrow_mut(), vec![]); diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index 67602709d9b..04fb1d4ee7f 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -16,6 +16,7 @@ use crate::dom::xrspace::XRSpace; use crate::dom::xrviewerpose::XRViewerPose; use dom_struct::dom_struct; use webvr_traits::WebVRFrameData; +use webxr_api::Frame; #[dom_struct] pub struct XRFrame { @@ -34,11 +35,8 @@ impl XRFrame { } } - pub fn new( - global: &GlobalScope, - session: &XRSession, - data: WebVRFrameData, - ) -> DomRoot<XRFrame> { + pub fn new(global: &GlobalScope, session: &XRSession, data: Frame) -> DomRoot<XRFrame> { + let data = unimplemented!(); reflect_dom_object( Box::new(XRFrame::new_inherited(session, data)), global, diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 58f6dfcb24f..172a2ccebbd 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -3,6 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::compartments::InCompartment; +use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode; 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::XRWebGLLayerBinding::XRWebGLLayerMethods; 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::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::{DomRoot, MutDom, MutNullableDom}; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; +use crate::dom::xrframe::XRFrame; use crate::dom::xrinputsource::XRInputSource; -use crate::dom::bindings::inheritance::Castable; use crate::dom::xrlayer::XRLayer; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrenderstate::XRRenderState; @@ -34,6 +37,7 @@ use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; use profile_traits::ipc; use std::cell::Cell; +use std::mem; use std::rc::Rc; use webxr_api::{self, Frame, Session}; @@ -98,7 +102,6 @@ impl XRSession { /// https://immersive-web.github.io/webxr/#xr-animation-frame fn raf_callback(&self, (time, frame): (f64, Frame)) { - let session = self.session.borrow_mut(); // Step 1 if let Some(pending) = self.pending_render_state.take() { // 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 let layer = pending.GetBaseLayer(); if let Some(layer) = layer { + let mut session = self.session.borrow_mut(); if let Some(layer) = layer.downcast::<XRWebGLLayer>() { session.update_webgl_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(); } } |