diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 3396ca669c1..9b05ae1e933 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -14,6 +14,9 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCal use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRVisibilityState; use crate::dom::bindings::codegen::Bindings::XRSystemBinding::XRSessionMode; +use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::{ + XRWebGLLayerMethods, XRWebGLRenderingContext, +}; use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::refcounted::Trusted; @@ -322,6 +325,9 @@ impl XRSession { self, ); event.upcast::().fire(self.upcast()); + // The page may be visible again, dirty the layers + // This also wakes up the event loop if necessary + self.dirty_layers(); }, XREvent::AddInput(info) => { self.input_sources.add_input_sources(self, &[info]); @@ -452,6 +458,17 @@ impl XRSession { pub fn session_id(&self) -> SessionId { self.session.borrow().id() } + + pub fn dirty_layers(&self) { + if let Some(layer) = self.RenderState().GetBaseLayer() { + match layer.Context() { + XRWebGLRenderingContext::WebGLRenderingContext(c) => c.mark_as_dirty(), + XRWebGLRenderingContext::WebGL2RenderingContext(c) => { + c.base_context().mark_as_dirty() + }, + } + } + } } impl XRSessionMethods for XRSession { diff --git a/components/script/dom/xrsystem.rs b/components/script/dom/xrsystem.rs index 7bd7f72e8fe..0fc4ab108e2 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -3,13 +3,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::cell::DomRefCell; -use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateMethods; -use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRSystemBinding::XRSessionInit; use crate::dom::bindings::codegen::Bindings::XRSystemBinding::{XRSessionMode, XRSystemMethods}; -use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::{ - XRWebGLLayerMethods, XRWebGLRenderingContext, -}; use crate::dom::bindings::conversions::{ConversionResult, FromJSValConvertible}; use crate::dom::bindings::error::Error; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; @@ -86,17 +81,9 @@ impl XRSystem { if let Some(active) = self.active_immersive_session.get() { if Dom::from_ref(&*active) == Dom::from_ref(session) { self.active_immersive_session.set(None); - // Dirty the canvas, since it has been skipping this step whilst in immersive // mode - if let Some(layer) = session.RenderState().GetBaseLayer() { - match layer.Context() { - XRWebGLRenderingContext::WebGLRenderingContext(c) => c.mark_as_dirty(), - XRWebGLRenderingContext::WebGL2RenderingContext(c) => { - c.base_context().mark_as_dirty() - }, - } - } + session.dirty_layers(); } } self.active_inline_sessions