Monado OpenXR Runtime
vk_extensions_helpers.h
Go to the documentation of this file.
1// Copyright 2019-2024, Collabora, Ltd.
2// Copyright 2024-2026, NVIDIA CORPORATION.
3// SPDX-License-Identifier: BSL-1.0
4/*!
5 * @file
6 * @brief Helper functions for Vulkan extension handling during initialization.
7 * @author Jakob Bornecrantz <jakob@collabora.com>
8 * @ingroup aux_vk
9 */
10
11#pragma once
12
13#include "vk/vk_helpers.h"
14
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20
21/*!
22 * Callback type for checking if an optional extension should be skipped.
23 */
25 struct u_extension_list *required_ext_list,
26 struct u_extension_list *optional_ext_list,
27 const char *ext);
28
29
30/*!
31 * Convert VkExtensionProperties array to u_extension_list.
32 */
33struct u_extension_list *
34vk_convert_extension_properties_to_string_list(VkExtensionProperties *props, uint32_t prop_count);
35
36/*!
37 * Log an extension list using pretty printing.
38 * The list will be sorted and logged at the specified log level. The argument
39 * skipped_ext_list is used to distinguish between skipped and unsupported
40 * extensions (must not be NULL).
41 */
42void
44 struct u_extension_list *ext_list,
45 struct u_extension_list *optional_ext_list,
46 struct u_extension_list *skipped_ext_list,
47 const char *ext_type_name,
48 enum u_logging_level log_level);
49
50/*!
51 * Check if all required extensions are present in the available extensions
52 * list. Prints a clear error message with all missing extensions if not all
53 * required extensions are available. Returns VK_SUCCESS if all required
54 * extensions are available, VK_ERROR_EXTENSION_NOT_PRESENT otherwise.
55 */
56VkResult
58 struct u_extension_list *available_ext_list,
59 struct u_extension_list *required_ext_list,
60 const char *ext_type_name);
61
62/*!
63 * Build instance extensions from required and optional instance extensions with
64 * skip callback.
65 *
66 * This function enumerates available instance extensions, checks required ones,
67 * and builds a final list. Returns VK_SUCCESS if successful.
68 * Only requires @ref vk_get_loader_functions to have been called.
69 *
70 * This internal function, use @ref vk_build_instance_extensions() instead.
71 *
72 * @param skip_func Callback to determine if an optional extension should be skipped,
73 * must not be NULL.
74 */
75VkResult
77 struct u_extension_list *required_instance_ext_list,
78 struct u_extension_list *optional_instance_ext_list,
80 struct u_extension_list **out_instance_ext_list);
81
82/*!
83 * Build device extensions from required and optional device extensions with
84 * skip callback. This function enumerates available device extensions, checks
85 * required ones, and builds a final list. Returns VK_SUCCESS if successful.
86 *
87 * This internal function, typically called from @ref vk_create_device().
88 *
89 * @param skip_func Callback to determine if an optional extension should be skipped,
90 * must not be NULL.
91 */
92VkResult
94 VkPhysicalDevice physical_device,
95 struct u_extension_list *required_device_ext_list,
96 struct u_extension_list *optional_device_ext_list,
98 struct u_extension_list **out_device_ext_list);
99
100
101#ifdef __cplusplus
102}
103#endif
u_logging_level
Logging level enum.
Definition: u_logging.h:45
Definition: u_extension_list.cpp:32
A bundle of Vulkan functions and objects, used by both Compositor and Compositor client code.
Definition: vk_helpers.h:75
VkResult vk_build_device_extensions_with_skip(struct vk_bundle *vk, VkPhysicalDevice physical_device, struct u_extension_list *required_device_ext_list, struct u_extension_list *optional_device_ext_list, vk_should_skip_ext_func_t skip_func, struct u_extension_list **out_device_ext_list)
Build device extensions from required and optional device extensions with skip callback.
Definition: vk_extensions_helpers.c:218
VkResult vk_check_required_extensions(struct vk_bundle *vk, struct u_extension_list *available_ext_list, struct u_extension_list *required_ext_list, const char *ext_type_name)
Check if all required extensions are present in the available extensions list.
Definition: vk_extensions_helpers.c:113
VkResult vk_build_instance_extensions_with_skip(struct vk_bundle *vk, struct u_extension_list *required_instance_ext_list, struct u_extension_list *optional_instance_ext_list, vk_should_skip_ext_func_t skip_func, struct u_extension_list **out_instance_ext_list)
Build instance extensions from required and optional instance extensions with skip callback.
Definition: vk_extensions_helpers.c:154
bool(* vk_should_skip_ext_func_t)(struct vk_bundle *vk, struct u_extension_list *required_ext_list, struct u_extension_list *optional_ext_list, const char *ext)
Callback type for checking if an optional extension should be skipped.
Definition: vk_extensions_helpers.h:24
void vk_log_extension_list(struct vk_bundle *vk, struct u_extension_list *ext_list, struct u_extension_list *optional_ext_list, struct u_extension_list *skipped_ext_list, const char *ext_type_name, enum u_logging_level log_level)
Log an extension list using pretty printing.
Definition: vk_extensions_helpers.c:97
struct u_extension_list * vk_convert_extension_properties_to_string_list(VkExtensionProperties *props, uint32_t prop_count)
Convert VkExtensionProperties array to u_extension_list.
Definition: vk_extensions_helpers.c:87
Common Vulkan code header.