diff options
-rw-r--r-- | components/script/dom/navigator.rs | 4 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 6 | ||||
-rw-r--r-- | components/script/dom/window.rs | 8 |
3 files changed, 18 insertions, 0 deletions
diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 7d120ba2eba..731960518ea 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -59,6 +59,10 @@ impl Navigator { pub fn new(window: &Window) -> DomRoot<Navigator> { reflect_dom_object(Box::new(Navigator::new_inherited()), window) } + + pub fn xr(&self) -> Option<DomRoot<XRSystem>> { + self.xr.get() + } } impl NavigatorMethods for Navigator { diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 33000497abf..ff4dea4fdb3 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -502,6 +502,12 @@ impl WebGLRenderingContext { return; } + // Dirtying the canvas is unnecessary if we're actively displaying immersive + // XR content right now. + if self.global().as_window().in_immersive_xr_session() { + return; + } + self.canvas .upcast::<Node>() .dirty(NodeDamage::OtherNodeDamage); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 688ced4fda7..71094a0cd2e 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -2225,6 +2225,14 @@ impl Window { pub fn webrender_document(&self) -> DocumentId { self.webrender_document } + + pub fn in_immersive_xr_session(&self) -> bool { + self.navigator + .get() + .as_ref() + .and_then(|nav| nav.xr()) + .map_or(false, |xr| xr.pending_or_active_session()) + } } impl Window { |