diff options
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 2 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 17 | ||||
-rw-r--r-- | components/script/dom/xrsystem.rs | 3 |
3 files changed, 21 insertions, 1 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index f23ca9f1415..53dff84c6ec 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -503,7 +503,7 @@ impl WebGLRenderingContext { } } - fn mark_as_dirty(&self) { + pub fn mark_as_dirty(&self) { // If we have a bound framebuffer, then don't mark the canvas as dirty. if self.bound_draw_framebuffer.get().is_some() { return; diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 53e6c492b68..dc2b5b3c497 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; @@ -319,6 +322,9 @@ impl XRSession { self, ); event.upcast::<Event>().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]); @@ -463,6 +469,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 0e2a44f09cb..0fc4ab108e2 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -81,6 +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 + session.dirty_layers(); } } self.active_inline_sessions |