Merge pull request #104658 from m4gr3d/fix_composition_layer_setup

Ensure the composition layer is registered when the layer viewport is updated
This commit is contained in:
Rémi Verschelde
2025-03-28 17:30:40 +01:00
2 changed files with 6 additions and 0 deletions

View File

@@ -219,6 +219,7 @@ void OpenXRCompositionLayer::_setup_composition_layer_provider() {
if (use_android_surface || layer_viewport) { if (use_android_surface || layer_viewport) {
if (composition_layer_extension) { if (composition_layer_extension) {
composition_layer_extension->register_viewport_composition_layer_provider(openxr_layer_provider); composition_layer_extension->register_viewport_composition_layer_provider(openxr_layer_provider);
registered = true;
} }
// NOTE: We don't setup/clear when using Android surfaces, so we don't destroy the surface unexpectedly. // NOTE: We don't setup/clear when using Android surfaces, so we don't destroy the surface unexpectedly.
@@ -232,6 +233,7 @@ void OpenXRCompositionLayer::_setup_composition_layer_provider() {
void OpenXRCompositionLayer::_clear_composition_layer_provider() { void OpenXRCompositionLayer::_clear_composition_layer_provider() {
if (composition_layer_extension) { if (composition_layer_extension) {
composition_layer_extension->unregister_viewport_composition_layer_provider(openxr_layer_provider); composition_layer_extension->unregister_viewport_composition_layer_provider(openxr_layer_provider);
registered = false;
} }
// NOTE: We don't setup/clear when using Android surfaces, so we don't destroy the surface unexpectedly. // NOTE: We don't setup/clear when using Android surfaces, so we don't destroy the surface unexpectedly.
@@ -296,6 +298,9 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
} }
layer_viewport = p_viewport; layer_viewport = p_viewport;
if (!registered && is_natively_supported() && openxr_session_running && is_inside_tree() && is_visible()) {
_setup_composition_layer_provider();
}
if (layer_viewport) { if (layer_viewport) {
SubViewport::UpdateMode update_mode = layer_viewport->get_update_mode(); SubViewport::UpdateMode update_mode = layer_viewport->get_update_mode();

View File

@@ -91,6 +91,7 @@ private:
MeshInstance3D *fallback = nullptr; MeshInstance3D *fallback = nullptr;
bool should_update_fallback_mesh = false; bool should_update_fallback_mesh = false;
bool openxr_session_running = false; bool openxr_session_running = false;
bool registered = false;
OpenXRViewportCompositionLayerProvider::SwapchainState *swapchain_state = nullptr; OpenXRViewportCompositionLayerProvider::SwapchainState *swapchain_state = nullptr;