@@ -245,7 +245,7 @@ void OpenXRCompositionLayer::_clear_composition_layer_provider() {
245245
246246void OpenXRCompositionLayer::_on_openxr_session_begun () {
247247 openxr_session_running = true ;
248- if (is_natively_supported () && is_visible () && is_inside_tree ()) {
248+ if (_should_register ()) {
249249 _setup_composition_layer_provider ();
250250 }
251251 if (!fallback && _should_use_fallback_node ()) {
@@ -265,6 +265,10 @@ void OpenXRCompositionLayer::update_fallback_mesh() {
265265 should_update_fallback_mesh = true ;
266266}
267267
268+ bool OpenXRCompositionLayer::_should_register () {
269+ return !registered && openxr_session_running && is_inside_tree () && is_visible () && is_natively_supported ();
270+ }
271+
268272XrPosef OpenXRCompositionLayer::get_openxr_pose () {
269273 Transform3D reference_frame = XRServer::get_singleton ()->get_reference_frame ();
270274 Transform3D transform = reference_frame.inverse () * get_transform ();
@@ -298,7 +302,7 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
298302 }
299303
300304 layer_viewport = p_viewport;
301- if (!registered && is_natively_supported () && openxr_session_running && is_inside_tree () && is_visible ()) {
305+ if (_should_register ()) {
302306 _setup_composition_layer_provider ();
303307 }
304308
@@ -328,8 +332,13 @@ void OpenXRCompositionLayer::set_use_android_surface(bool p_use_android_surface)
328332
329333 use_android_surface = p_use_android_surface;
330334 if (use_android_surface) {
335+ // It's possible that the layer provider is unregistered here (if previously invisible)
331336 set_layer_viewport (nullptr );
332337 openxr_layer_provider->set_use_android_surface (true , android_surface_size);
338+ // ...and it may not be set up above because of viewport = null, android surface is false, so set it up again:
339+ if (_should_register ()) {
340+ _setup_composition_layer_provider ();
341+ }
333342 } else {
334343 openxr_layer_provider->set_use_android_surface (false , Size2i ());
335344 }
0 commit comments