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