The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

st/oxr: Implement XR_KHR_vulkan_swapchain_format_list

+74 -10
+5
CMakeLists.txt
··· 378 378 if(NOT DEFINED XRT_FEATURE_OPENXR_VISIBILITY_MASK) 379 379 set(XRT_FEATURE_OPENXR_VISIBILITY_MASK ON) 380 380 endif() 381 + option( 382 + XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST 383 + "Enable support for the XR_KHR_vulkan_swapchain_format_list extension" ON 384 + ) 381 385 382 386 # Interaction extension support. 383 387 if(NOT DEFINED XRT_FEATURE_OPENXR_INTERACTION_EXT_EYE_GAZE) ··· 635 639 message(STATUS "# FEATURE_OPENXR_SPACE_LOCAL_FLOOR: ${XRT_FEATURE_OPENXR_SPACE_LOCAL_FLOOR}") 636 640 message(STATUS "# FEATURE_OPENXR_SPACE_UNBOUNDED: ${XRT_FEATURE_OPENXR_SPACE_UNBOUNDED}") 637 641 message(STATUS "# FEATURE_OPENXR_VISIBILITY_MASK ${XRT_FEATURE_OPENXR_VISIBILITY_MASK}") 642 + message(STATUS "# FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST ${XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST}") 638 643 message(STATUS "# FEATURE_RENDERDOC: ${XRT_FEATURE_RENDERDOC}") 639 644 message(STATUS "# FEATURE_SERVICE: ${XRT_FEATURE_SERVICE}") 640 645 message(STATUS "# FEATURE_SERVICE_SYSTEMD: ${XRT_FEATURE_SERVICE_SYSTEMD}")
+1
scripts/generate_oxr_ext_support.py
··· 52 52 ['XR_KHR_visibility_mask', 'XRT_FEATURE_OPENXR_VISIBILITY_MASK'], 53 53 ['XR_KHR_vulkan_enable', 'XR_USE_GRAPHICS_API_VULKAN'], 54 54 ['XR_KHR_vulkan_enable2', 'XR_USE_GRAPHICS_API_VULKAN'], 55 + ['XR_KHR_vulkan_swapchain_format_list', 'XR_USE_GRAPHICS_API_VULKAN', 'XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST'], 55 56 ['XR_KHR_win32_convert_performance_counter_time', 'XR_USE_PLATFORM_WIN32'], 56 57 ['XR_EXT_debug_utils', 'XRT_FEATURE_OPENXR_DEBUG_UTILS'], 57 58 ['XR_EXT_dpad_binding'],
+22
src/xrt/state_trackers/oxr/oxr_api_swapchain.c
··· 12 12 #include "util/u_debug.h" 13 13 #include "util/u_trace_marker.h" 14 14 15 + #include "oxr_chain.h" 15 16 #include "oxr_objects.h" 16 17 #include "oxr_logger.h" 17 18 #include "oxr_two_call.h" ··· 115 116 return oxr_error(&log, XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED, 116 117 "(createInfo->format == 0x%04" PRIx64 ") is not supported", createInfo->format); 117 118 } 119 + 120 + #ifdef OXR_HAVE_KHR_vulkan_swapchain_format_list 121 + const XrVulkanSwapchainFormatListCreateInfoKHR *format_list = NULL; 122 + if (sess->sys->inst->extensions.KHR_vulkan_swapchain_format_list) { 123 + format_list = OXR_GET_INPUT_FROM_CHAIN(createInfo, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR, 124 + XrVulkanSwapchainFormatListCreateInfoKHR); 125 + } 126 + 127 + if (format_list) { 128 + if ((createInfo->usageFlags & XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT) == 0) { 129 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, 130 + "(createInfo->usageFlags) passing in XrVulkanSwapchainFormatListCreateInfoKHR " 131 + "requires the XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT bit set"); 132 + } 133 + 134 + if (sess->gfx_ext != OXR_SESSION_GRAPHICS_EXT_VULKAN) { 135 + return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, 136 + "XrVulkanSwapchainFormatListCreateInfoKHR used with non-Vulkan graphics API."); 137 + } 138 + } 139 + #endif 118 140 119 141 ret = sess->create_swapchain(&log, sess, createInfo, &sc); 120 142 if (ret != XR_SUCCESS) {
+13
src/xrt/state_trackers/oxr/oxr_extension_support.h
··· 235 235 236 236 237 237 /* 238 + * XR_KHR_vulkan_swapchain_format_list 239 + */ 240 + #if defined(XR_KHR_vulkan_swapchain_format_list) && defined(XR_USE_GRAPHICS_API_VULKAN) 241 + #define OXR_HAVE_KHR_vulkan_swapchain_format_list 242 + #define OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_) \ 243 + _(KHR_vulkan_swapchain_format_list, KHR_VULKAN_SWAPCHAIN_FORMAT_LIST) 244 + #else 245 + #define OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_) 246 + #endif 247 + 248 + 249 + /* 238 250 * XR_KHR_win32_convert_performance_counter_time 239 251 */ 240 252 #if defined(XR_KHR_win32_convert_performance_counter_time) && defined(XR_USE_PLATFORM_WIN32) ··· 548 560 OXR_EXTENSION_SUPPORT_KHR_visibility_mask(_) \ 549 561 OXR_EXTENSION_SUPPORT_KHR_vulkan_enable(_) \ 550 562 OXR_EXTENSION_SUPPORT_KHR_vulkan_enable2(_) \ 563 + OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_) \ 551 564 OXR_EXTENSION_SUPPORT_KHR_win32_convert_performance_counter_time(_) \ 552 565 OXR_EXTENSION_SUPPORT_EXT_debug_utils(_) \ 553 566 OXR_EXTENSION_SUPPORT_EXT_dpad_binding(_) \
+33 -10
src/xrt/state_trackers/oxr/oxr_swapchain.c
··· 10 10 #include "util/u_debug.h" 11 11 #include "util/u_misc.h" 12 12 13 + #include "oxr_chain.h" 13 14 #include "oxr_objects.h" 14 15 #include "oxr_logger.h" 15 16 #include "oxr_handle.h" ··· 276 277 { 277 278 xrt_result_t xret = XRT_SUCCESS; 278 279 279 - struct xrt_swapchain_create_info info; 280 - info.create = convert_create_flags(createInfo->createFlags); 281 - info.bits = convert_usage_bits(createInfo->usageFlags); 282 - info.format = createInfo->format; 283 - info.sample_count = createInfo->sampleCount; 284 - info.width = createInfo->width; 285 - info.height = createInfo->height; 286 - info.face_count = createInfo->faceCount; 287 - info.array_size = createInfo->arraySize; 288 - info.mip_count = createInfo->mipCount; 280 + struct xrt_swapchain_create_info info = { 281 + .create = convert_create_flags(createInfo->createFlags), 282 + .bits = convert_usage_bits(createInfo->usageFlags), 283 + .format = createInfo->format, 284 + .sample_count = createInfo->sampleCount, 285 + .width = createInfo->width, 286 + .height = createInfo->height, 287 + .face_count = createInfo->faceCount, 288 + .array_size = createInfo->arraySize, 289 + .mip_count = createInfo->mipCount, 290 + }; 291 + 292 + #ifdef OXR_HAVE_KHR_vulkan_swapchain_format_list 293 + const XrVulkanSwapchainFormatListCreateInfoKHR *format_list = NULL; 294 + if (sess->sys->inst->extensions.KHR_vulkan_swapchain_format_list) { 295 + format_list = OXR_GET_INPUT_FROM_CHAIN(createInfo, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR, 296 + XrVulkanSwapchainFormatListCreateInfoKHR); 297 + } 298 + 299 + if (format_list) { 300 + // Check in oxr_api_swapchain.c verification. 301 + assert((createInfo->usageFlags & XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT) == 0); 302 + 303 + if (format_list->viewFormatCount > ARRAY_SIZE(info.formats)) { 304 + /* Hardcoded limit of 8 formats */ 305 + return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Too many formats"); 306 + } 307 + 308 + info.format_count = format_list->viewFormatCount; 309 + memcpy(info.formats, format_list->viewFormats, sizeof(uint32_t) * info.format_count); 310 + } 311 + #endif 289 312 290 313 struct xrt_swapchain *xsc = NULL; // Has to be NULL. 291 314 xret = xrt_comp_create_swapchain(sess->compositor, &info, &xsc);