The open source OpenXR runtime

xrt: Fixes #411, KHR_vulkan_swapchain_format_list not enabled client-side

* Fixes VK_KHR_image_format_list not being added to
extension lists or not enabling flags on
client-side vk_bundle / vk client compositor.

* Fixes missing extension VK_KHR_image_format_list to
the vulkan device extension list for XR_KHR_vulkan_enable

* Fixes format lists for KHR_vulkan_swapchain_format_list
not be used/applied on client vk images.

* Fixes vulkan validation errors on client that attempt
to use & chain format lists for image view creation
outside of OpenXR / runtime

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2352>

+65 -12
+8 -1
src/xrt/auxiliary/vk/vk_bundle_init.c
··· 1 - // Copyright 2019-2023, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file ··· 14 14 * @author Jakob Bornecrantz <jakob@collabora.com> 15 15 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 16 16 * @author Moses Turner <moses@collabora.com> 17 + * @author Korcan Hussein <korcan.hussein@collabora.com> 17 18 * @ingroup aux_vk 18 19 */ 19 20 ··· 1395 1396 bool external_fence_fd_enabled, 1396 1397 bool external_semaphore_fd_enabled, 1397 1398 bool timeline_semaphore_enabled, 1399 + bool image_format_list_enabled, 1398 1400 bool debug_utils_enabled, 1399 1401 enum u_logging_level log_level) 1400 1402 { ··· 1433 1435 // Vulkan does not let us read what extensions was enabled. 1434 1436 if (external_semaphore_fd_enabled) { 1435 1437 vk->has_KHR_external_semaphore_fd = true; 1438 + } 1439 + 1440 + // Vulkan does not let us read what extensions was enabled. 1441 + if (image_format_list_enabled) { 1442 + vk->has_KHR_image_format_list = image_format_list_enabled; 1436 1443 } 1437 1444 1438 1445 #ifdef VK_KHR_timeline_semaphore
+14
src/xrt/auxiliary/vk/vk_helpers.c
··· 1136 1136 .handleTypes = handle_type, 1137 1137 }; 1138 1138 1139 + #ifdef VK_KHR_image_format_list 1140 + VkImageFormatListCreateInfoKHR image_format_list_create_info = { 1141 + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, 1142 + .pNext = NULL, 1143 + .viewFormatCount = info->format_count, 1144 + .pViewFormats = info->formats, 1145 + }; 1146 + const bool has_mutable_format_list = 1147 + has_mutable_usage && vk->has_KHR_image_format_list && info->format_count > 0; 1148 + if (has_mutable_format_list) { 1149 + external_memory_image_create_info.pNext = &image_format_list_create_info; 1150 + } 1151 + #endif 1152 + 1139 1153 // In 1140 1154 VkImageCreateInfo vk_info = { 1141 1155 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+3 -1
src/xrt/auxiliary/vk/vk_helpers.h
··· 1 - // Copyright 2019-2023, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file ··· 14 14 * @author Jakob Bornecrantz <jakob@collabora.com> 15 15 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 16 16 * @author Moses Turner <moses@collabora.com> 17 + * @author Korcan Hussein <korcan.hussein@collabora.com> 17 18 * @ingroup aux_vk 18 19 */ 19 20 ··· 1049 1050 bool external_fence_fd_enabled, 1050 1051 bool external_semaphore_fd_enabled, 1051 1052 bool timeline_semaphore_enabled, 1053 + bool image_format_list_enabled, 1052 1054 bool debug_utils_enabled, 1053 1055 enum u_logging_level log_level); 1054 1056
+4 -1
src/xrt/compositor/client/comp_vk_client.c
··· 1 - // Copyright 2019-2023, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Vulkan client side glue to compositor implementation. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 7 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 8 + * @author Korcan Hussein <korcan.hussein@collabora.com> 8 9 * @ingroup comp_client 9 10 */ 10 11 ··· 816 817 bool external_fence_fd_enabled, 817 818 bool external_semaphore_fd_enabled, 818 819 bool timeline_semaphore_enabled, 820 + bool image_format_list_enabled, 819 821 bool debug_utils_enabled, 820 822 bool renderdoc_enabled, 821 823 uint32_t queueFamilyIndex, ··· 872 874 external_fence_fd_enabled, // external_fence_fd_enabled 873 875 external_semaphore_fd_enabled, // external_semaphore_fd_enabled 874 876 timeline_semaphore_enabled, // timeline_semaphore_enabled 877 + image_format_list_enabled, // image_format_list_enabled 875 878 debug_utils_enabled, // debug_utils_enabled 876 879 log_level); // log_level 877 880 if (ret != VK_SUCCESS) {
+3 -1
src/xrt/compositor/client/comp_vk_client.h
··· 1 - // Copyright 2019-2023, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Vulkan client side glue to compositor header. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 7 * @author Lubosz Sarnecki <lubosz.sarnecki@collabora.com> 8 + * @author Korcan Hussein <korcan.hussein@collabora.com> 8 9 * @ingroup comp_client 9 10 */ 10 11 ··· 108 109 bool external_fence_fd_enabled, 109 110 bool external_semaphore_fd_enabled, 110 111 bool timeline_semaphore_enabled, 112 + bool image_format_list_enabled, 111 113 bool debug_utils_enabled, 112 114 bool renderdoc_enabled, 113 115 uint32_t queueFamilyIndex,
+5 -1
src/xrt/compositor/client/comp_vk_glue.c
··· 1 - // Copyright 2019, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Glue code to vulkan client side code. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 8 * @ingroup comp_client 8 9 */ 9 10 ··· 26 27 const char *xrt_gfx_vk_device_extensions = VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME 27 28 " " VK_KHR_EXTERNAL_FENCE_EXTENSION_NAME " " VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME 28 29 " " VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME " " VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME 30 + " " VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME 29 31 30 32 // Platform version of "external_memory" 31 33 #if defined(XRT_GRAPHICS_BUFFER_HANDLE_IS_FD) ··· 76 78 bool external_fence_fd_enabled, 77 79 bool external_semaphore_fd_enabled, 78 80 bool timeline_semaphore_enabled, 81 + bool image_format_list_enabled, 79 82 bool debug_utils_enabled, 80 83 bool renderdoc_enabled, 81 84 uint32_t queue_family_index, ··· 90 93 external_fence_fd_enabled, // 91 94 external_semaphore_fd_enabled, // 92 95 timeline_semaphore_enabled, // 96 + image_format_list_enabled, // 93 97 debug_utils_enabled, // 94 98 renderdoc_enabled, // 95 99 queue_family_index, //
+3 -1
src/xrt/include/xrt/xrt_gfx_vk.h
··· 1 - // Copyright 2019, Collabora, Ltd. 1 + // Copyright 2019-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Header defining an XRT graphics provider. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 8 * @ingroup xrt_iface 8 9 */ 9 10 ··· 64 65 bool external_fence_fd_enabled, 65 66 bool external_semaphore_fd_enabled, 66 67 bool timeline_semaphore_enabled, 68 + bool image_format_list_enabled, 67 69 bool debug_utils_enabled, 68 70 bool renderdoc_enabled, 69 71 uint32_t queue_family_index,
+1
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1503 1503 bool external_semaphore_fd_enabled; 1504 1504 bool timeline_semaphore_enabled; 1505 1505 bool debug_utils_enabled; 1506 + bool image_format_list_enabled; 1506 1507 } vk; 1507 1508 1508 1509 #endif
+5 -1
src/xrt/state_trackers/oxr/oxr_session_gfx_vk.c
··· 1 - // Copyright 2018-2022, Collabora, Ltd. 1 + // Copyright 2018-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Holds Vulkan specific session functions. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 8 * @ingroup oxr_main 8 9 * @ingroup comp_client 9 10 */ ··· 82 83 bool timeline_semaphore_enabled = sess->sys->vk.timeline_semaphore_enabled; 83 84 bool external_fence_fd_enabled = sess->sys->vk.external_fence_fd_enabled; 84 85 bool external_semaphore_fd_enabled = sess->sys->vk.external_semaphore_fd_enabled; 86 + bool image_format_list_enabled = 87 + sys->inst->extensions.KHR_vulkan_enable || sess->sys->vk.image_format_list_enabled; 85 88 bool debug_utils_enabled = false; 86 89 bool renderdoc_enabled = false; 87 90 ··· 146 149 external_fence_fd_enabled, // 147 150 external_semaphore_fd_enabled, // 148 151 timeline_semaphore_enabled, // 152 + image_format_list_enabled, // 149 153 debug_utils_enabled, // 150 154 renderdoc_enabled, // 151 155 next->queueFamilyIndex, //
+13 -1
src/xrt/state_trackers/oxr/oxr_vulkan.c
··· 1 - // Copyright 2018-2020, Collabora, Ltd. 1 + // Copyright 2018-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Holds Vulkan related functions. 6 6 * @author Jakob Bornecrantz <jakob@collabora.com> 7 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 8 * @ingroup oxr_main 8 9 */ 9 10 ··· 428 429 bool external_fence_fd_enabled = false; 429 430 bool external_semaphore_fd_enabled = false; 430 431 #endif 432 + bool image_format_list_enabled = false; 431 433 432 434 for (uint32_t i = 0; i < ARRAY_SIZE(optional_device_extensions); i++) { 433 435 // Empty list or a not supported extension. ··· 446 448 external_semaphore_fd_enabled = true; 447 449 } 448 450 #endif 451 + 452 + if (strcmp(optional_device_extensions[i], VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME) == 0) { 453 + image_format_list_enabled = true; 454 + } 449 455 } 450 456 451 457 free(props); ··· 546 552 if (*vulkanResult == VK_SUCCESS) { 547 553 sys->vk.timeline_semaphore_enabled = timeline_semaphore_info.timelineSemaphore; 548 554 U_LOG_D("timeline semaphores enabled: %d", timeline_semaphore_info.timelineSemaphore); 555 + } 556 + #endif 557 + 558 + #ifdef VK_KHR_image_format_list 559 + if (*vulkanResult == VK_SUCCESS) { 560 + sys->vk.image_format_list_enabled = image_format_list_enabled; 549 561 } 550 562 #endif 551 563
+6 -4
tests/tests_comp_client_vulkan.cpp
··· 1 - // Copyright 2022, Collabora, Ltd. 1 + // Copyright 2022-2024, Collabora, Ltd. 2 2 // SPDX-License-Identifier: BSL-1.0 3 3 /*! 4 4 * @file 5 5 * @brief Basic Vulkan compositor tests. 6 6 * @author Rylie Pavlik <rylie.pavlik@collabora.com> 7 + * @author Korcan Hussein <korcan.hussein@collabora.com> 7 8 */ 8 9 9 10 ··· 148 149 #else 149 150 #error "Need port for fence sync handles checkers" 150 151 #endif 151 - false, // debug_utils_enabled 152 - false, // renderdoc_enabled 153 - vk->queue_family_index, // 152 + vk->has_KHR_image_format_list, // image_format_list_enabled 153 + false, // debug_utils_enabled 154 + false, // renderdoc_enabled 155 + vk->queue_family_index, // 154 156 vk->queue_index); 155 157 struct xrt_compositor *xc = &xcvk->base; 156 158