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);
145 const char *optional_ext_table[] = {
146 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
147 VK_EXT_DEBUG_UTILS_EXTENSION_NAME};
148 const uint32_t optional_ext_count =
sizeof(optional_ext_table) /
sizeof(optional_ext_table[0]);
149 ext_table.
fill(
user_context, (
const char **)optional_ext_table, optional_ext_count);
150 return optional_ext_count;
155 PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)
156 vkGetInstanceProcAddr(
nullptr,
"vkEnumerateInstanceExtensionProperties");
158 if (vkEnumerateInstanceExtensionProperties ==
nullptr) {
159 debug(
user_context) <<
"Vulkan: Missing vkEnumerateInstanceExtensionProperties proc address! Invalid loader?!\n";
163 debug(
user_context) <<
"Vulkan: Checking vkEnumerateInstanceExtensionProperties for extensions ...\n";
166 vkEnumerateInstanceExtensionProperties(
nullptr, &avail_ext_count,
nullptr);
168 if (avail_ext_count) {
170 config.
entry_size =
sizeof(VkExtensionProperties);
176 vkEnumerateInstanceExtensionProperties(
nullptr,
177 &avail_ext_count,
static_cast<VkExtensionProperties *
>(extension_properties.
data()));
179 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
180 const VkExtensionProperties *properties =
static_cast<const VkExtensionProperties *
>(extension_properties[n]);
185 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
186 const VkExtensionProperties *properties =
static_cast<const VkExtensionProperties *
>(extension_properties[n]);
190 debug(
user_context) <<
"Vulkan: vkEnumerateInstanceExtensionProperties found " << avail_ext_count <<
" extensions ...\n";
191 return avail_ext_count;
197 const char *before_v1p1_ext_table[] = {
198 VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME};
199 const uint32_t before_v1p1_ext_count =
sizeof(before_v1p1_ext_table) /
sizeof(before_v1p1_ext_table[0]);
201 const char *before_v1p2_ext_table[] = {
202 before_v1p1_ext_table[0],
203 VK_KHR_8BIT_STORAGE_EXTENSION_NAME};
204 const uint32_t before_v1p2_ext_count =
sizeof(before_v1p2_ext_table) /
sizeof(before_v1p2_ext_table[0]);
207 if (major_version >= 1) {
208 if (minor_version < 1) {
209 ext_table.
fill(
user_context, (
const char **)before_v1p1_ext_table, before_v1p1_ext_count);
210 required_ext_count = before_v1p1_ext_count;
211 }
else if (minor_version < 2) {
212 ext_table.
fill(
user_context, (
const char **)before_v1p2_ext_table, before_v1p2_ext_count);
213 required_ext_count = before_v1p2_ext_count;
216 return required_ext_count;
222 const char *before_v1p1_ext_table[] = {
223 VK_KHR_16BIT_STORAGE_EXTENSION_NAME};
224 const uint32_t before_v1p1_ext_count =
sizeof(before_v1p1_ext_table) /
sizeof(before_v1p1_ext_table[0]);
226 const char *before_v1p2_ext_table[] = {
227 before_v1p1_ext_table[0],
228 "VK_KHR_portability_subset",
229 VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME,
230 VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME};
231 const uint32_t before_v1p2_ext_count =
sizeof(before_v1p2_ext_table) /
sizeof(before_v1p2_ext_table[0]);
233 const char *v1p3_ext_table[] = {
234 "VK_KHR_portability_subset",
235 VK_KHR_MAINTENANCE_5_EXTENSION_NAME};
236 const uint32_t v1p3_ext_count =
sizeof(v1p3_ext_table) /
sizeof(v1p3_ext_table[0]);
239 if (major_version >= 1) {
240 if (minor_version < 1) {
241 ext_table.
fill(
user_context, (
const char **)before_v1p1_ext_table, before_v1p1_ext_count);
242 optional_ext_count = before_v1p1_ext_count;
243 }
else if (minor_version < 2) {
244 ext_table.
fill(
user_context, (
const char **)before_v1p2_ext_table, before_v1p2_ext_count);
245 optional_ext_count = before_v1p2_ext_count;
246 }
else if (minor_version >= 3) {
247 ext_table.
fill(
user_context, (
const char **)v1p3_ext_table, v1p3_ext_count);
248 optional_ext_count = v1p3_ext_count;
251 return optional_ext_count;
256 if (vkEnumerateDeviceExtensionProperties ==
nullptr) {
257 debug(
user_context) <<
"Vulkan: Missing vkEnumerateDeviceExtensionProperties proc address! Invalid loader?!\n";
261 debug(
user_context) <<
"Vulkan: Checking vkEnumerateDeviceExtensionProperties for extensions ...\n";
264 vkEnumerateDeviceExtensionProperties(physical_device,
nullptr, &avail_ext_count,
nullptr);
265 if (avail_ext_count > 0) {
267 config.
entry_size =
sizeof(VkExtensionProperties);
273 vkEnumerateDeviceExtensionProperties(physical_device,
nullptr,
274 &avail_ext_count,
static_cast<VkExtensionProperties *
>(extension_properties.
data()));
276 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
277 const VkExtensionProperties *properties =
static_cast<const VkExtensionProperties *
>(extension_properties[n]);
282 for (
uint32_t n = 0; n < avail_ext_count; ++n) {
283 const VkExtensionProperties *properties =
static_cast<const VkExtensionProperties *
>(extension_properties[n]);
288 debug(
user_context) <<
"Vulkan: vkEnumerateDeviceExtensionProperties found " << avail_ext_count <<
" extensions ...\n";
289 return avail_ext_count;
292bool vk_validate_required_extension_support(
void *
user_context,
296 bool validated =
true;
297 for (
uint32_t n = 0; n < required_extensions.
size(); ++n) {
298 const char *extension = required_extensions[n];
299 if (!supported_extensions.
contains(extension)) {
300 debug(
user_context) <<
"Vulkan: Missing required extension: '" << extension <<
"'!\n";
327 vk_set_layer_names_internal(n);
337 vk_set_extension_names_internal(n);
347 vk_set_device_type_internal(n);
357 vk_set_build_options_internal(n);
367 vk_set_alloc_config_internal(n);
#define debug(n)
For optional debugging during codegen, use the debug macro as follows:
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
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)
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)