diff --git a/Cargo.lock b/Cargo.lock index c3fe8ce3951..9881819468c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6778,7 +6778,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#de60f3ebe01b1e829393c980a6126924b5f60075" +source = "git+https://github.com/servo/webxr#d9ec2263b017d9c415ce35e0f4417a454564bcf2" dependencies = [ "android_injected_glue", "bindgen", @@ -6801,7 +6801,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#de60f3ebe01b1e829393c980a6126924b5f60075" +source = "git+https://github.com/servo/webxr#d9ec2263b017d9c415ce35e0f4417a454564bcf2" dependencies = [ "euclid", "ipc-channel", diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index a9a76d71960..3c27c523866 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -763,6 +763,19 @@ impl WebGLThread { &self.contexts, &mut self.bound_context_id, ); + + // Destroy WebXR layers associated with this context + let webxr_context_id = WebXRContextId::from(context_id); + let mut webxr_contexts = WebXRBridgeContexts { + contexts: &mut self.contexts, + bound_context_id: &mut self.bound_context_id, + }; + self.webxr_bridge.destroy_all_layers( + &mut self.device, + &mut webxr_contexts, + webxr_context_id, + ); + // Release GL context. let mut data = match self.contexts.remove(&context_id) { Some(data) => data, @@ -774,11 +787,6 @@ impl WebGLThread { .destroy(context_id, &mut self.device, &mut data.ctx) .unwrap(); - // Destroy WebXR layers associated with this context - let webxr_context_id = WebXRContextId::from(context_id); - self.webxr_bridge - .destroy_all_layers(&mut self.device, &mut data.ctx, webxr_context_id); - // Destroy the context self.device.destroy_context(&mut data.ctx).unwrap(); @@ -3193,10 +3201,7 @@ impl WebXRBridge { .managers .get_mut(&manager_id) .ok_or(WebXRError::NoMatchingDevice)?; - let context = contexts - .context(device, context_id) - .ok_or(WebXRError::NoMatchingDevice)?; - manager.create_layer(device, context, context_id, layer_init) + manager.create_layer(device, contexts, context_id, layer_init) } fn destroy_layer( @@ -3208,22 +3213,20 @@ impl WebXRBridge { layer_id: WebXRLayerId, ) { if let Some(manager) = self.managers.get_mut(&manager_id) { - if let Some(context) = contexts.context(device, context_id) { - manager.destroy_layer(device, context, context_id, layer_id); - } + manager.destroy_layer(device, contexts, context_id, layer_id); } } fn destroy_all_layers( &mut self, device: &mut Device, - context: &mut Context, + contexts: &mut dyn WebXRContexts, context_id: WebXRContextId, ) { for (_, manager) in &mut self.managers { for (other_id, layer_id) in manager.layers().to_vec() { if other_id == context_id { - manager.destroy_layer(device, context, context_id, layer_id); + manager.destroy_layer(device, contexts, context_id, layer_id); } } } @@ -3335,7 +3338,7 @@ impl WebXRLayerManagerAPI for WebXRBridgeManager { fn create_layer( &mut self, _: &mut GL::Device, - _: &mut GL::Context, + _: &mut dyn WebXRContexts, context_id: WebXRContextId, init: WebXRLayerInit, ) -> Result { @@ -3358,7 +3361,7 @@ impl WebXRLayerManagerAPI for WebXRBridgeManager { fn destroy_layer( &mut self, _: &mut GL::Device, - _: &mut GL::Context, + _: &mut dyn WebXRContexts, context_id: WebXRContextId, layer_id: WebXRLayerId, ) { diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index c4dd5999636..69f3e30de1a 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -240,7 +240,19 @@ impl XRWebGLLayer { 0, ) .ok()?; - // TODO: depth/stencil + if let Some(id) = sub_images.sub_image.as_ref()?.depth_stencil_texture { + // TODO: Cache this texture + let depth_stencil_texture_id = WebGLTextureId::maybe_new(id)?; + let depth_stencil_texture = WebGLTexture::new(context, depth_stencil_texture_id); + framebuffer + .texture2d_even_if_opaque( + constants::DEPTH_STENCIL_ATTACHMENT, + constants::TEXTURE_2D, + Some(&depth_stencil_texture), + 0, + ) + .ok()?; + } Some(()) } @@ -253,6 +265,14 @@ impl XRWebGLLayer { framebuffer .texture2d_even_if_opaque(constants::COLOR_ATTACHMENT0, self.texture_target(), None, 0) .ok()?; + framebuffer + .texture2d_even_if_opaque( + constants::DEPTH_STENCIL_ATTACHMENT, + constants::DEPTH_STENCIL_ATTACHMENT, + None, + 0, + ) + .ok()?; framebuffer.upcast::().context().Flush(); Some(()) }