1#ifndef HALIDE_RUNTIME_VULKAN_EXTENSIONS_H
2#define HALIDE_RUNTIME_VULKAN_EXTENSIONS_H
38void vk_set_layer_names_internal(
const char *n) {
48const char *vk_get_layer_names_internal(
void *user_context) {
50 const char *value =
getenv(
"HL_VK_LAYERS");
51 if (value ==
nullptr) {
52 value =
getenv(
"VK_INSTANCE_LAYERS");
54 vk_set_layer_names_internal(value);
59void vk_set_extension_names_internal(
const char *n) {
69const char *vk_get_extension_names_internal(
void *user_context) {
71 const char *name =
getenv(
"HL_VK_EXTENSIONS");
72 vk_set_extension_names_internal(name);
77void vk_set_device_type_internal(
const char *n) {
87const char *vk_get_device_type_internal(
void *user_context) {
89 const char *name =
getenv(
"HL_VK_DEVICE_TYPE");
90 vk_set_device_type_internal(name);
95void vk_set_build_options_internal(
const char *n) {
105const char *vk_get_build_options_internal(
void *user_context) {
107 const char *name =
getenv(
"HL_VK_BUILD_OPTIONS");
108 vk_set_build_options_internal(name);
113void vk_set_alloc_config_internal(
const char *n) {
123const char *vk_get_alloc_config_internal(
void *user_context) {
125 const char *name =
getenv(
"HL_VK_ALLOC_CONFIG");
126 vk_set_alloc_config_internal(name);
135 const char *
layer_names = vk_get_layer_names_internal(user_context);
140 const char *required_ext_table[] = {
"VK_KHR_get_physical_device_properties2"};
141 const uint32_t required_ext_count =
sizeof(required_ext_table) /
sizeof(required_ext_table[0]);
142 ext_table.
fill(user_context, (
const char **)required_ext_table, required_ext_count);
143 return required_ext_count;
152 debug(user_context) <<
"Vulkan: Missing vkEnumerateInstanceExtensionProperties proc address! Invalid loader?!\n";
156 debug(user_context) <<
"Vulkan: Checking vkEnumerateInstanceExtensionProperties for extensions ...\n";
161 if (avail_ext_count) {
166 BlockStorage extension_properties(user_context, config);
167 extension_properties.
resize(user_context, avail_ext_count);
172 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
174 debug(user_context) <<
" [" << n <<
"]: " << properties->
extensionName <<
"\n";
177 ext_table.
resize(user_context, avail_ext_count);
178 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
183 debug(user_context) <<
"Vulkan: vkEnumerateInstanceExtensionProperties found " << avail_ext_count <<
" extensions ...\n";
184 return avail_ext_count;
188 const char *required_ext_table[] = {
"VK_KHR_8bit_storage",
"VK_KHR_storage_buffer_storage_class"};
189 const uint32_t required_ext_count =
sizeof(required_ext_table) /
sizeof(required_ext_table[0]);
190 ext_table.
fill(user_context, (
const char **)required_ext_table, required_ext_count);
191 return required_ext_count;
195 const char *optional_ext_table[] = {
196 "VK_KHR_portability_subset",
197 "VK_KHR_16bit_storage",
198 "VK_KHR_shader_float16_int8",
199 "VK_KHR_shader_float_controls"};
200 const uint32_t optional_ext_count =
sizeof(optional_ext_table) /
sizeof(optional_ext_table[0]);
201 ext_table.
fill(user_context, (
const char **)optional_ext_table, optional_ext_count);
202 return optional_ext_count;
205uint32_t vk_get_supported_device_extensions(
void *user_context, VkPhysicalDevice physical_device,
StringTable &ext_table) {
206 debug(user_context) <<
"vk_get_supported_device_extensions\n";
208 debug(user_context) <<
"Vulkan: Missing vkEnumerateDeviceExtensionProperties proc address! Invalid loader?!\n";
212 debug(user_context) <<
"Vulkan: Checking vkEnumerateDeviceExtensionProperties for extensions ...\n";
216 if (avail_ext_count > 0) {
221 BlockStorage extension_properties(user_context, config);
222 extension_properties.
resize(user_context, avail_ext_count);
227 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
229 debug(user_context) <<
" [" << n <<
"]: " << properties->
extensionName <<
"\n";
232 ext_table.
resize(user_context, avail_ext_count);
233 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
239 debug(user_context) <<
"Vulkan: vkEnumerateDeviceExtensionProperties found " << avail_ext_count <<
" extensions ...\n";
240 return avail_ext_count;
243bool vk_validate_required_extension_support(
void *user_context,
246 debug(user_context) <<
"Vulkan: Validating " <<
uint32_t(required_extensions.
size()) <<
" extensions ...\n";
247 bool validated =
true;
248 for (
uint32_t n = 0; n < required_extensions.
size(); ++n) {
249 const char *extension = required_extensions[n];
250 if (!supported_extensions.
contains(extension)) {
251 debug(user_context) <<
"Vulkan: Missing required extension: '" << extension <<
"'!\n";
278 vk_set_layer_names_internal(n);
283 return vk_get_layer_names_internal(user_context);
288 vk_set_extension_names_internal(n);
293 return vk_get_extension_names_internal(user_context);
298 vk_set_device_type_internal(n);
303 return vk_get_device_type_internal(user_context);
308 vk_set_build_options_internal(n);
313 return vk_get_build_options_internal(user_context);
318 vk_set_alloc_config_internal(n);
323 return vk_get_alloc_config_internal(user_context);
void resize(void *user_context, size_t entry_count, bool realloc=true)
size_t parse(void *user_context, const char *str, const char *delim)
void assign(void *user_context, size_t index, const char *str, size_t length=0)
void resize(void *user_context, size_t capacity)
void fill(void *user_context, const char **array, size_t count)
bool contains(const char *str) const
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
VkResult(VKAPI_PTR * PFN_vkEnumerateInstanceExtensionProperties)(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
struct VkExtensionProperties VkExtensionProperties
WEAK bool layer_names_initialized
WEAK ScopedSpinLock::AtomicFlag alloc_config_lock
WEAK char build_options[1024]
WEAK char layer_names[1024]
WEAK bool build_options_initialized
WEAK ScopedSpinLock::AtomicFlag extension_names_lock
WEAK bool device_type_initialized
WEAK bool alloc_config_initialized
WEAK ScopedSpinLock::AtomicFlag layer_names_lock
WEAK ScopedSpinLock::AtomicFlag build_options_lock
WEAK char alloc_config[1024]
WEAK char device_type[256]
WEAK bool extension_names_initialized
WEAK ScopedSpinLock::AtomicFlag device_type_lock
WEAK char extension_names[1024]
This file defines the class FunctionDAG, which is our representation of a Halide pipeline,...
@ Internal
Not visible externally, similar to 'static' linkage in C.
unsigned __INT32_TYPE__ uint32_t
char * getenv(const char *)
uint32_t minimum_capacity
static size_t copy_up_to(char *dst, const char *src, size_t max_chars)
char extensionName[VK_MAX_EXTENSION_NAME_SIZE]
WEAK void halide_vulkan_set_layer_names(const char *n)
WEAK void halide_vulkan_set_build_options(const char *n)
WEAK void halide_vulkan_set_extension_names(const char *n)
WEAK void halide_vulkan_set_device_type(const char *n)
WEAK const char * halide_vulkan_get_alloc_config(void *user_context)
WEAK const char * halide_vulkan_get_layer_names(void *user_context)
WEAK void halide_vulkan_set_alloc_config(const char *n)
WEAK const char * halide_vulkan_get_build_options(void *user_context)
WEAK const char * halide_vulkan_get_extension_names(void *user_context)
WEAK const char * halide_vulkan_get_device_type(void *user_context)