From 45d6728eed6d8ef23170f3e5b0b83c9093fc3956 Mon Sep 17 00:00:00 2001 From: David Snopek Date: Fri, 22 May 2026 09:40:48 -0500 Subject: [PATCH] OpenXR: Fix `XR_ERROR_VALIDATION_FAILURE` on first frame with frame synthesis on Meta Quest --- .../extensions/openxr_frame_synthesis_extension.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/openxr/extensions/openxr_frame_synthesis_extension.cpp b/modules/openxr/extensions/openxr_frame_synthesis_extension.cpp index 7c899f48da..d67198a238 100644 --- a/modules/openxr/extensions/openxr_frame_synthesis_extension.cpp +++ b/modules/openxr/extensions/openxr_frame_synthesis_extension.cpp @@ -298,6 +298,9 @@ void OpenXRFrameSynthesisExtension::on_pre_draw_viewport(RID p_render_target) { Quaternion delta_quat = delta_transform.basis.get_quaternion(); Vector3 delta_origin = delta_transform.origin; + float z_far = openxr_api->get_render_state_z_far(); + float z_near = openxr_api->get_render_state_z_near(); + // Z near/far can change per frame, so make sure we update this. for (XrFrameSynthesisInfoEXT &frame_synthesis_info : render_state.frame_synthesis_info) { frame_synthesis_info.layerFlags = render_state.relax_frame_interval ? XR_FRAME_SYNTHESIS_INFO_REQUEST_RELAXED_FRAME_INTERVAL_BIT_EXT : 0; @@ -307,9 +310,12 @@ void OpenXRFrameSynthesisExtension::on_pre_draw_viewport(RID p_render_target) { { (float)delta_origin.x, (float)delta_origin.y, (float)delta_origin.z } }; - // Note: reverse-Z. - frame_synthesis_info.nearZ = openxr_api->get_render_state_z_far(); - frame_synthesis_info.farZ = openxr_api->get_render_state_z_near(); + // Ensure we only use valid near/far Z values. + if (z_far != z_near) { + // Note: reverse-Z. + frame_synthesis_info.nearZ = z_far; + frame_synthesis_info.farZ = z_near; + } } // Remember our transform.