st/oxr: Implement XR_KHR_vulkan_swapchain_format_list

This commit is contained in:
Simon Zeni 2023-11-17 21:40:11 -05:00
parent 24ecd455ea
commit 8f6603d019
5 changed files with 74 additions and 10 deletions

View file

@ -378,6 +378,10 @@ endif()
if(NOT DEFINED XRT_FEATURE_OPENXR_VISIBILITY_MASK)
set(XRT_FEATURE_OPENXR_VISIBILITY_MASK ON)
endif()
option(
XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST
"Enable support for the XR_KHR_vulkan_swapchain_format_list extension" ON
)
# Interaction extension support.
if(NOT DEFINED XRT_FEATURE_OPENXR_INTERACTION_EXT_EYE_GAZE)
@ -635,6 +639,7 @@ message(STATUS "# FEATURE_OPENXR_OVERLAY: ${XRT_FEATURE
message(STATUS "# FEATURE_OPENXR_SPACE_LOCAL_FLOOR: ${XRT_FEATURE_OPENXR_SPACE_LOCAL_FLOOR}")
message(STATUS "# FEATURE_OPENXR_SPACE_UNBOUNDED: ${XRT_FEATURE_OPENXR_SPACE_UNBOUNDED}")
message(STATUS "# FEATURE_OPENXR_VISIBILITY_MASK ${XRT_FEATURE_OPENXR_VISIBILITY_MASK}")
message(STATUS "# FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST ${XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST}")
message(STATUS "# FEATURE_RENDERDOC: ${XRT_FEATURE_RENDERDOC}")
message(STATUS "# FEATURE_SERVICE: ${XRT_FEATURE_SERVICE}")
message(STATUS "# FEATURE_SERVICE_SYSTEMD: ${XRT_FEATURE_SERVICE_SYSTEMD}")

View file

@ -52,6 +52,7 @@ EXTENSIONS = (
['XR_KHR_visibility_mask', 'XRT_FEATURE_OPENXR_VISIBILITY_MASK'],
['XR_KHR_vulkan_enable', 'XR_USE_GRAPHICS_API_VULKAN'],
['XR_KHR_vulkan_enable2', 'XR_USE_GRAPHICS_API_VULKAN'],
['XR_KHR_vulkan_swapchain_format_list', 'XR_USE_GRAPHICS_API_VULKAN', 'XRT_FEATURE_OPENXR_VULKAN_SWAPCHAIN_FORMAT_LIST'],
['XR_KHR_win32_convert_performance_counter_time', 'XR_USE_PLATFORM_WIN32'],
['XR_EXT_debug_utils', 'XRT_FEATURE_OPENXR_DEBUG_UTILS'],
['XR_EXT_dpad_binding'],

View file

@ -12,6 +12,7 @@
#include "util/u_debug.h"
#include "util/u_trace_marker.h"
#include "oxr_chain.h"
#include "oxr_objects.h"
#include "oxr_logger.h"
#include "oxr_two_call.h"
@ -116,6 +117,27 @@ oxr_xrCreateSwapchain(XrSession session, const XrSwapchainCreateInfo *createInfo
"(createInfo->format == 0x%04" PRIx64 ") is not supported", createInfo->format);
}
#ifdef OXR_HAVE_KHR_vulkan_swapchain_format_list
const XrVulkanSwapchainFormatListCreateInfoKHR *format_list = NULL;
if (sess->sys->inst->extensions.KHR_vulkan_swapchain_format_list) {
format_list = OXR_GET_INPUT_FROM_CHAIN(createInfo, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR,
XrVulkanSwapchainFormatListCreateInfoKHR);
}
if (format_list) {
if ((createInfo->usageFlags & XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT) == 0) {
return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE,
"(createInfo->usageFlags) passing in XrVulkanSwapchainFormatListCreateInfoKHR "
"requires the XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT bit set");
}
if (sess->gfx_ext != OXR_SESSION_GRAPHICS_EXT_VULKAN) {
return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE,
"XrVulkanSwapchainFormatListCreateInfoKHR used with non-Vulkan graphics API.");
}
}
#endif
ret = sess->create_swapchain(&log, sess, createInfo, &sc);
if (ret != XR_SUCCESS) {
return ret;

View file

@ -234,6 +234,18 @@
#endif
/*
* XR_KHR_vulkan_swapchain_format_list
*/
#if defined(XR_KHR_vulkan_swapchain_format_list) && defined(XR_USE_GRAPHICS_API_VULKAN)
#define OXR_HAVE_KHR_vulkan_swapchain_format_list
#define OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_) \
_(KHR_vulkan_swapchain_format_list, KHR_VULKAN_SWAPCHAIN_FORMAT_LIST)
#else
#define OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_)
#endif
/*
* XR_KHR_win32_convert_performance_counter_time
*/
@ -548,6 +560,7 @@
OXR_EXTENSION_SUPPORT_KHR_visibility_mask(_) \
OXR_EXTENSION_SUPPORT_KHR_vulkan_enable(_) \
OXR_EXTENSION_SUPPORT_KHR_vulkan_enable2(_) \
OXR_EXTENSION_SUPPORT_KHR_vulkan_swapchain_format_list(_) \
OXR_EXTENSION_SUPPORT_KHR_win32_convert_performance_counter_time(_) \
OXR_EXTENSION_SUPPORT_EXT_debug_utils(_) \
OXR_EXTENSION_SUPPORT_EXT_dpad_binding(_) \

View file

@ -10,6 +10,7 @@
#include "util/u_debug.h"
#include "util/u_misc.h"
#include "oxr_chain.h"
#include "oxr_objects.h"
#include "oxr_logger.h"
#include "oxr_handle.h"
@ -276,16 +277,38 @@ oxr_swapchain_common_create(struct oxr_logger *log,
{
xrt_result_t xret = XRT_SUCCESS;
struct xrt_swapchain_create_info info;
info.create = convert_create_flags(createInfo->createFlags);
info.bits = convert_usage_bits(createInfo->usageFlags);
info.format = createInfo->format;
info.sample_count = createInfo->sampleCount;
info.width = createInfo->width;
info.height = createInfo->height;
info.face_count = createInfo->faceCount;
info.array_size = createInfo->arraySize;
info.mip_count = createInfo->mipCount;
struct xrt_swapchain_create_info info = {
.create = convert_create_flags(createInfo->createFlags),
.bits = convert_usage_bits(createInfo->usageFlags),
.format = createInfo->format,
.sample_count = createInfo->sampleCount,
.width = createInfo->width,
.height = createInfo->height,
.face_count = createInfo->faceCount,
.array_size = createInfo->arraySize,
.mip_count = createInfo->mipCount,
};
#ifdef OXR_HAVE_KHR_vulkan_swapchain_format_list
const XrVulkanSwapchainFormatListCreateInfoKHR *format_list = NULL;
if (sess->sys->inst->extensions.KHR_vulkan_swapchain_format_list) {
format_list = OXR_GET_INPUT_FROM_CHAIN(createInfo, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR,
XrVulkanSwapchainFormatListCreateInfoKHR);
}
if (format_list) {
// Check in oxr_api_swapchain.c verification.
assert((createInfo->usageFlags & XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT) == 0);
if (format_list->viewFormatCount > ARRAY_SIZE(info.formats)) {
/* Hardcoded limit of 8 formats */
return oxr_error(log, XR_ERROR_RUNTIME_FAILURE, "Too many formats");
}
info.format_count = format_list->viewFormatCount;
memcpy(info.formats, format_list->viewFormats, sizeof(uint32_t) * info.format_count);
}
#endif
struct xrt_swapchain *xsc = NULL; // Has to be NULL.
xret = xrt_comp_create_swapchain(sess->compositor, &info, &xsc);