aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/webglrenderingcontext.rs2
-rw-r--r--components/script/dom/xrsession.rs17
-rw-r--r--components/script/dom/xrsystem.rs3
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