aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Jeffrey <ajeffrey@mozilla.com>2020-08-03 13:19:22 -0500
committerAlan Jeffrey <ajeffrey@mozilla.com>2020-08-03 13:19:22 -0500
commit31de34704d4f5911a5db7bec77cbe5c53a909c53 (patch)
tree21d9d0bd09def31587025fb92d7c2a914aa70f45
parentbf7f4eae31f0332b0ab8460132c937f8facbed47 (diff)
downloadservo-31de34704d4f5911a5db7bec77cbe5c53a909c53.tar.gz
servo-31de34704d4f5911a5db7bec77cbe5c53a909c53.zip
Implement the changes to updating the render state from the WebXR Layers spec
-rw-r--r--components/script/dom/xrsession.rs73
1 files changed, 56 insertions, 17 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index bf386c9d6cf..1655328ec5a 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -602,12 +602,67 @@ impl XRSessionMethods for XRSession {
return Err(Error::InvalidState);
}
- // TODO: Add the checks in
// https://immersive-web.github.io/layers/#updaterenderstatechanges
+ // Step 1.
+ // TODO: support the `layers' feature.
+ let session_created_with_layers_enabled = false;
+ if init.baseLayer.is_some() {
+ if session_created_with_layers_enabled {
+ return Err(Error::NotSupported);
+ }
+ // https://github.com/immersive-web/layers/issues/189
+ if init.layers.is_some() {
+ return Err(Error::Type(String::from(
+ "Cannot set WebXR layers and baseLayer",
+ )));
+ }
+ }
+
+ if let Some(Some(ref layers)) = init.layers {
+ // Step 2
+ for layer in layers {
+ let count = layers
+ .iter()
+ .filter(|other| other.layer_id() == layer.layer_id())
+ .count();
+ if count > 1 {
+ return Err(Error::Type(String::from("Duplicate entry in WebXR layers")));
+ }
+ }
+
+ // Step 3
+ for layer in layers {
+ if layer.session() != self {
+ return Err(Error::Type(String::from(
+ "Layer from different session in WebXR layers",
+ )));
+ }
+ }
+ }
+ // Step 4-5
let pending = self
.pending_render_state
.or_init(|| self.active_render_state.get().clone_object());
+
+ // Step 6
+ if let Some(ref layers) = init.layers {
+ let layers = layers.as_deref().unwrap_or_default();
+ pending.set_base_layer(None);
+ pending.set_layers(layers.iter().map(|x| &**x).collect());
+ let layers = layers
+ .iter()
+ .filter_map(|layer| {
+ let context_id = WebXRContextId::from(layer.context_id());
+ let layer_id = layer.layer_id()?;
+ Some((context_id, layer_id))
+ })
+ .collect();
+ self.session.borrow_mut().set_layers(layers);
+ }
+
+ // End of https://immersive-web.github.io/layers/#updaterenderstatechanges
+
if let Some(near) = init.depthNear {
let mut near = *near;
// Step 8 from #apply-the-pending-render-state
@@ -657,22 +712,6 @@ impl XRSessionMethods for XRSession {
.update_clip_planes(*pending.DepthNear() as f32, *pending.DepthFar() as f32);
}
- // https://immersive-web.github.io/layers/#updaterenderstatechanges
- if let Some(ref layers) = init.layers {
- let layers = layers.as_deref().unwrap_or_default();
- pending.set_base_layer(None);
- pending.set_layers(layers.iter().map(|x| &**x).collect());
- let layers = layers
- .iter()
- .filter_map(|layer| {
- let context_id = WebXRContextId::from(layer.context_id());
- let layer_id = layer.layer_id()?;
- Some((context_id, layer_id))
- })
- .collect();
- self.session.borrow_mut().set_layers(layers);
- }
-
Ok(())
}