aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/vrdisplay.rs15
-rw-r--r--components/script/dom/xrframe.rs8
-rw-r--r--components/script/dom/xrsession.rs31
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();
}
}