diff options
Diffstat (limited to 'components/script/dom/xrsession.rs')
-rw-r--r-- | components/script/dom/xrsession.rs | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 41f8392acfb..6fbdc592b0e 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -6,7 +6,6 @@ use crate::compartments::InCompartment; use crate::dom::bindings::callback::ExceptionHandling; use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorBinding::NavigatorMethods; -use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType; @@ -30,7 +29,6 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::node::Node; use crate::dom::node::NodeDamage; use crate::dom::promise::Promise; -use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot; use crate::dom::xrframe::XRFrame; use crate::dom::xrinputsourcearray::XRInputSourceArray; use crate::dom::xrinputsourceevent::XRInputSourceEvent; @@ -41,7 +39,6 @@ use crate::dom::xrspace::XRSpace; use crate::dom::xrwebgllayer::XRWebGLLayer; use crate::task_source::TaskSource; use dom_struct::dom_struct; -use euclid::default::Size2D; use euclid::RigidTransform3D; use ipc_channel::ipc::IpcSender; use ipc_channel::router::ROUTER; @@ -77,6 +74,9 @@ pub struct XRSession { end_promises: DomRefCell<Vec<Rc<Promise>>>, /// https://immersive-web.github.io/webxr/#ended ended: Cell<bool>, + /// Opaque framebuffers need to know the session is "outside of a requestAnimationFrame" + /// https://immersive-web.github.io/webxr/#opaque-framebuffer + outside_raf: Cell<bool>, } impl XRSession { @@ -102,6 +102,7 @@ impl XRSession { input_sources: Dom::from_ref(input_sources), end_promises: DomRefCell::new(vec![]), ended: Cell::new(false), + outside_raf: Cell::new(true), } } @@ -169,6 +170,10 @@ impl XRSession { self.session.borrow_mut().request_animation_frame(sender); } + pub fn is_outside_raf(&self) -> bool { + self.outside_raf.get() + } + fn attach_event_handler(&self) { let this = Trusted::new(self); let global = self.global(); @@ -276,6 +281,8 @@ impl XRSession { /// https://immersive-web.github.io/webxr/#xr-animation-frame fn raf_callback(&self, (time, mut frame): (f64, Frame)) { + debug!("WebXR RAF callback"); + // Step 1 if let Some(pending) = self.pending_render_state.take() { // https://immersive-web.github.io/webxr/#apply-the-pending-render-state @@ -285,19 +292,8 @@ impl XRSession { // Step 6-7: XXXManishearth handle inlineVerticalFieldOfView // XXXManishearth handle inline sessions and composition disabled flag - if let Some(layer) = pending.GetBaseLayer() { - let attachment = layer.framebuffer().attachment(constants::COLOR_ATTACHMENT0); - if let Some(WebGLFramebufferAttachmentRoot::Texture(texture)) = attachment { - let context = layer.Context().context_id().0; - let texture_id = texture.id().get(); - if let Some((width, height)) = layer.framebuffer().size() { - let size = Size2D::new(width, height); - self.session - .borrow_mut() - .set_texture(context, texture_id, size); - } - } - } + let swap_chain_id = pending.GetBaseLayer().map(|layer| layer.swap_chain_id()); + self.session.borrow_mut().set_swap_chain(swap_chain_id); } for event in frame.events.drain(..) { @@ -321,13 +317,16 @@ impl XRSession { frame.set_animation_frame(true); // Step 8 + self.outside_raf.set(false); for (_, callback) in callbacks.drain(..) { if let Some(callback) = callback { let _ = callback.Call__(Finite::wrap(time), &frame, ExceptionHandling::Report); } } + self.outside_raf.set(true); frame.set_active(false); + base_layer.swap_buffers(); self.session.borrow_mut().render_animation_frame(); self.request_new_xr_frame(); |