mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Trigger callbacks in RAF
This commit is contained in:
parent
33421e8ee0
commit
877b6c67a1
3 changed files with 33 additions and 21 deletions
|
@ -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![]);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue