aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-07-08 16:12:08 -0700
committerManish Goregaokar <manishsmail@gmail.com>2019-07-11 11:12:59 -0700
commit33421e8ee0087b99cd9d87729e633e8e7479b61c (patch)
treefd0fc3dddbfb3d43bcf679067bf02d5347f35272 /components/script
parentcf53cf6cc59a8ed05d970d7646bb75fde36b673b (diff)
downloadservo-33421e8ee0087b99cd9d87729e633e8e7479b61c.tar.gz
servo-33421e8ee0087b99cd9d87729e633e8e7479b61c.zip
Apply pending render states in RAF
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/xrrenderstate.rs2
-rw-r--r--components/script/dom/xrsession.rs32
2 files changed, 30 insertions, 4 deletions
diff --git a/components/script/dom/xrrenderstate.rs b/components/script/dom/xrrenderstate.rs
index 04ce6d1810a..824b7a6d37a 100644
--- a/components/script/dom/xrrenderstate.rs
+++ b/components/script/dom/xrrenderstate.rs
@@ -47,7 +47,7 @@ impl XRRenderState {
)
}
- pub fn copy(&self) -> DomRoot<Self> {
+ pub fn clone_object(&self) -> DomRoot<Self> {
XRRenderState::new(
&self.global(),
self.depth_near.get(),
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index c8eb50d5dfa..58f6dfcb24f 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -7,10 +7,12 @@ use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode;
use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType;
use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateInit;
+use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateMethods;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlendMode;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback;
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::refcounted::Trusted;
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject};
@@ -19,10 +21,12 @@ use crate::dom::eventtarget::EventTarget;
use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise;
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;
use crate::dom::xrspace::XRSpace;
+use crate::dom::xrwebgllayer::XRWebGLLayer;
use crate::task_source::TaskSource;
use dom_struct::dom_struct;
use euclid::Vector3D;
@@ -92,8 +96,29 @@ impl XRSession {
unimplemented!()
}
+ /// https://immersive-web.github.io/webxr/#xr-animation-frame
fn raf_callback(&self, (time, frame): (f64, Frame)) {
- unimplemented!()
+ 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
+ // (Steps 1-4 are implicit)
+ // Step 5
+ self.active_render_state.set(&pending);
+ // Step 6-7: XXXManishearth handle inlineVerticalFieldOfView
+
+ // XXXManishearth handle inline sessions and composition disabled flag
+ let layer = pending.GetBaseLayer();
+ if let Some(layer) = layer {
+ if let Some(layer) = layer.downcast::<XRWebGLLayer>() {
+ session.update_webgl_external_image_api(
+ layer.Context().webgl_sender().webxr_external_image_api(),
+ );
+ } else {
+ error!("updateRenderState() called with unknown layer type")
+ }
+ }
+ }
}
}
@@ -119,7 +144,7 @@ impl XRSessionMethods for XRSession {
let pending = self
.pending_render_state
- .or_init(|| self.active_render_state.get().copy());
+ .or_init(|| self.active_render_state.get().clone_object());
if let Some(near) = init.depthNear {
pending.set_depth_near(*near);
}
@@ -179,7 +204,8 @@ impl XRSessionMethods for XRSession {
let sender = self.raf_sender.borrow().clone().unwrap();
// request animation frame
- self.session.borrow_mut()
+ self.session
+ .borrow_mut()
.request_animation_frame(FrameCallback { sender });
raf_id