mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-29 05:40:12 -04:00
render/vulkan: get only available validation layers
This commit is contained in:
parent
fb393ddf84
commit
347b32642f
1 changed files with 74 additions and 8 deletions
|
|
@ -33,6 +33,72 @@ static const char *find_extensions(const VkExtensionProperties *avail,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* const *get_instance_layers(uint32_t *layer_count) {
|
||||||
|
static const char * const layers[] = {
|
||||||
|
"VK_LAYER_KHRONOS_validation",
|
||||||
|
// "VK_LAYER_RENDERDOC_Capture",
|
||||||
|
// "VK_LAYER_live_introspection",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const size_t layers_len = sizeof(layers) / sizeof(layers[0]);
|
||||||
|
|
||||||
|
VkLayerProperties *layer_props = NULL;
|
||||||
|
|
||||||
|
uint32_t count;
|
||||||
|
if (vkEnumerateInstanceLayerProperties(&count, NULL) != VK_SUCCESS) {
|
||||||
|
wlr_log(WLR_ERROR, "Failed to call vkEnumerateInstanceLayerProperties");
|
||||||
|
goto layers_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0) {
|
||||||
|
wlr_log(WLR_DEBUG, "No validation layers found");
|
||||||
|
goto layers_err;
|
||||||
|
}
|
||||||
|
wlr_log(WLR_DEBUG, "%"PRIu32" instance layers available", count);
|
||||||
|
|
||||||
|
layer_props = calloc((size_t)count, sizeof(VkLayerProperties));
|
||||||
|
if (layer_props == NULL) {
|
||||||
|
wlr_log(WLR_ERROR, "Failed to allocate %"PRIu32" VkLayerProperties",
|
||||||
|
count);
|
||||||
|
goto layers_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vkEnumerateInstanceLayerProperties(&count, layer_props) != VK_SUCCESS) {
|
||||||
|
wlr_log(WLR_ERROR, "Failed to call vkEnumerateInstanceLayerProperties");
|
||||||
|
goto layers_err;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < count; ++i) {
|
||||||
|
wlr_log(WLR_DEBUG, "Vulkan instance validation layer %s v%"PRIu32,
|
||||||
|
layer_props[i].layerName, layer_props[i].implementationVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < layers_len; ++i) {
|
||||||
|
bool found = false;
|
||||||
|
for (size_t j = 0; j < count; ++j) {
|
||||||
|
if (strcmp(layer_props[j].layerName, layers[i]) == 0) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
wlr_log(WLR_ERROR, "Vulkan instance layer %s not found", layers[i]);
|
||||||
|
goto layers_err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(layer_props);
|
||||||
|
|
||||||
|
*layer_count = layers_len;
|
||||||
|
return layers;
|
||||||
|
|
||||||
|
layers_err:
|
||||||
|
free(layer_props);
|
||||||
|
*layer_count = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static VkBool32 debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
|
static VkBool32 debug_callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
|
||||||
VkDebugUtilsMessageTypeFlagsEXT type,
|
VkDebugUtilsMessageTypeFlagsEXT type,
|
||||||
const VkDebugUtilsMessengerCallbackDataEXT *debug_data,
|
const VkDebugUtilsMessengerCallbackDataEXT *debug_data,
|
||||||
|
|
@ -163,13 +229,13 @@ struct wlr_vk_instance *vulkan_instance_create(size_t ext_count,
|
||||||
application_info.engineVersion = WLR_VERSION_NUM;
|
application_info.engineVersion = WLR_VERSION_NUM;
|
||||||
application_info.apiVersion = VK_API_VERSION_1_1;
|
application_info.apiVersion = VK_API_VERSION_1_1;
|
||||||
|
|
||||||
const char *layers[] = {
|
uint32_t layer_count = 0;
|
||||||
"VK_LAYER_KHRONOS_validation",
|
const char * const *layers = get_instance_layers(&layer_count);
|
||||||
// "VK_LAYER_RENDERDOC_Capture",
|
wlr_log(WLR_DEBUG, "Using %"PRIu32" instance validation layers",
|
||||||
// "VK_LAYER_live_introspection",
|
layer_count);
|
||||||
};
|
for (uint32_t i = 0; i < layer_count; ++i) {
|
||||||
|
wlr_log(WLR_DEBUG, "%s", layers[i]);
|
||||||
unsigned layer_count = debug * (sizeof(layers) / sizeof(layers[0]));
|
}
|
||||||
|
|
||||||
VkInstanceCreateInfo instance_info = {0};
|
VkInstanceCreateInfo instance_info = {0};
|
||||||
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||||
|
|
@ -177,7 +243,7 @@ struct wlr_vk_instance *vulkan_instance_create(size_t ext_count,
|
||||||
instance_info.enabledExtensionCount = ini->extension_count;
|
instance_info.enabledExtensionCount = ini->extension_count;
|
||||||
instance_info.ppEnabledExtensionNames = ini->extensions;
|
instance_info.ppEnabledExtensionNames = ini->extensions;
|
||||||
instance_info.enabledLayerCount = layer_count;
|
instance_info.enabledLayerCount = layer_count;
|
||||||
instance_info.ppEnabledLayerNames = layers;
|
instance_info.ppEnabledLayerNames = (const char *const *)layers;
|
||||||
|
|
||||||
VkDebugUtilsMessageSeverityFlagsEXT severity =
|
VkDebugUtilsMessageSeverityFlagsEXT severity =
|
||||||
// VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
|
// VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue