diff --git a/modules/openxr/extensions/openxr_fb_foveation_extension.cpp b/modules/openxr/extensions/openxr_fb_foveation_extension.cpp index d156e6e494..d87a4fa346 100644 --- a/modules/openxr/extensions/openxr_fb_foveation_extension.cpp +++ b/modules/openxr/extensions/openxr_fb_foveation_extension.cpp @@ -153,7 +153,7 @@ void *OpenXRFBFoveationExtension::set_system_properties_and_get_next_pointer(voi void *OpenXRFBFoveationExtension::set_swapchain_create_info_and_get_next_pointer(void *p_next_pointer) { void *next = p_next_pointer; - if (is_enabled()) { + if (is_enabled() && foveation_level > 0) { swapchain_create_info_foveation_fb.next = next; next = &swapchain_create_info_foveation_fb; @@ -247,7 +247,7 @@ void OpenXRFBFoveationExtension::set_foveation_with_subsampled_images_enabled(bo } bool OpenXRFBFoveationExtension::is_foveation_with_subsampled_images_enabled() const { - return is_enabled() && meta_vulkan_swapchain_create_info_ext && foveation_with_subsampled_images_enabled; + return is_enabled() && foveation_level > 0 && meta_vulkan_swapchain_create_info_ext && foveation_with_subsampled_images_enabled; } void OpenXRFBFoveationExtension::set_foveation_with_subsampled_images_active(bool p_active) { diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 9f9bf646ab..2fa25ccba3 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -86,7 +86,7 @@ Vector OpenXRAPI::OpenXRSwapChainInfo::free_queue; -bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size) { +bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, bool p_use_next_extensions) { OpenXRAPI *openxr_api = OpenXRAPI::get_singleton(); ERR_FAIL_NULL_V(openxr_api, false); @@ -102,10 +102,12 @@ bool OpenXRAPI::OpenXRSwapChainInfo::create(XrSwapchainCreateFlags p_create_flag XrResult result; void *next_pointer = nullptr; - for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_registered_extension_wrappers()) { - void *np = wrapper->set_swapchain_create_info_and_get_next_pointer(next_pointer); - if (np != nullptr) { - next_pointer = np; + if (p_use_next_extensions) { + for (OpenXRExtensionWrapper *wrapper : OpenXRAPI::get_registered_extension_wrappers()) { + void *np = wrapper->set_swapchain_create_info_and_get_next_pointer(next_pointer); + if (np != nullptr) { + next_pointer = np; + } } } @@ -1315,7 +1317,7 @@ bool OpenXRAPI::create_main_swapchains(const Size2i &p_size) { // We start with our color swapchain... if (color_swapchain_format != 0) { - if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_COLOR].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, color_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size())) { + if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_COLOR].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT | XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, color_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size(), true)) { return false; } @@ -1327,7 +1329,7 @@ bool OpenXRAPI::create_main_swapchains(const Size2i &p_size) { // - we support our depth layer extension // Note: Application Space Warp and Frame Synthesis use a separate lower resolution depth buffer. if (depth_swapchain_format != 0 && submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) { - if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_DEPTH].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, depth_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size())) { + if (!render_state.main_swapchains[OPENXR_SWAPCHAIN_DEPTH].create(0, XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, depth_swapchain_format, render_state.main_swapchain_size.width, render_state.main_swapchain_size.height, sample_count, view_configuration_views.size(), true)) { return false; } diff --git a/modules/openxr/openxr_api.h b/modules/openxr/openxr_api.h index 45ab7f66b3..8ca2e44e82 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -69,7 +69,7 @@ public: _FORCE_INLINE_ XrSwapchain get_swapchain() const { return swapchain; } _FORCE_INLINE_ bool is_image_acquired() const { return image_acquired; } - bool create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size); + bool create(XrSwapchainCreateFlags p_create_flags, XrSwapchainUsageFlags p_usage_flags, int64_t p_swapchain_format, uint32_t p_width, uint32_t p_height, uint32_t p_sample_count, uint32_t p_array_size, bool p_next_extensions = false); void queue_free(); static void free_queued(); void free();