···975975 return false;
976976}
977977978978-static bool
978978+static VkResult
979979build_device_extensions(struct vk_bundle *vk,
980980 VkPhysicalDevice physical_device,
981981 struct u_string_list *required_device_ext_list,
···992992 NULL, // layer_name
993993 &prop_count, // out_prop_count
994994 &props); // out_props
995995- if (ret != VK_SUCCESS) {
996996- VK_ERROR(vk, "vk_enumerate_physical_device_extension_properties: %s", vk_result_string(ret));
997997- return false;
998998- }
995995+ VK_CHK_AND_RET(ret, "vk_enumerate_physical_device_extension_properties");
9999961000997 uint32_t required_device_ext_count = u_string_list_get_size(required_device_ext_list);
1001998 const char *const *required_device_exts = u_string_list_get_data(required_device_ext_list);
···10041001 for (uint32_t i = 0; i < required_device_ext_count; i++) {
10051002 const char *ext = required_device_exts[i];
10061003 if (!check_extension(vk, props, prop_count, ext)) {
10071007- VK_DEBUG(vk, "VkPhysicalDevice does not support required extension %s", ext);
10041004+ VK_ERROR(vk, "VkPhysicalDevice does not support required extension %s", ext);
10081005 free(props);
10091009- return false;
10061006+ return VK_ERROR_EXTENSION_NOT_PRESENT;
10101007 }
10111008 VK_DEBUG(vk, "Using required device ext %s", ext);
10121009 }
···1042103910431040 free(props);
1044104110451045-10461046- return true;
10421042+ return VK_SUCCESS;
10471043}
1048104410491045/*!
···13251321 struct u_string_list *optional_device_ext_list,
13261322 const struct vk_device_features *optional_device_features)
13271323{
13241324+ struct u_string_list *device_ext_list = NULL;
13281325 VkResult ret;
1329132613301327 ret = select_physical_device(vk, forced_index);
13311331- if (ret != VK_SUCCESS) {
13321332- return ret;
13331333- }
13281328+ VK_CHK_WITH_GOTO(ret, "select_physical_device", err_destroy);
1334132913351335- struct u_string_list *device_ext_list = NULL;
13361336- if (!build_device_extensions(vk, vk->physical_device, required_device_ext_list, optional_device_ext_list,
13371337- &device_ext_list)) {
13381338- return VK_ERROR_EXTENSION_NOT_PRESENT;
13391339- }
13301330+ ret = build_device_extensions( //
13311331+ vk, //
13321332+ vk->physical_device, //
13331333+ required_device_ext_list, //
13341334+ optional_device_ext_list, //
13351335+ &device_ext_list); //
13361336+ VK_CHK_WITH_GOTO(ret, "build_device_extensions", err_destroy);
134013371341133813421339 /*
···13591356 if (!vk->has_EXT_global_priority && //
13601357 !vk->has_KHR_global_priority && //
13611358 global_priority != VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT) {
13621362- return VK_ERROR_NOT_PERMITTED_EXT;
13591359+ ret = VK_ERROR_NOT_PERMITTED_EXT;
13601360+ goto err_destroy;
13631361 }
1364136213651363 vk_reset_queues(vk);
···13671365 struct vk_queue_family main_queue_family = {0};
13681366 if (only_compute) {
13691367 ret = find_queue_family(vk, VK_QUEUE_COMPUTE_BIT, &main_queue_family);
13681368+ VK_CHK_WITH_GOTO(ret, "find_queue_family", err_destroy);
13701369 } else {
13711370 ret = find_graphics_queue_family(vk, &main_queue_family);
13721372- }
13731373-13741374- if (ret != VK_SUCCESS) {
13751375- return ret;
13711371+ VK_CHK_WITH_GOTO(ret, "find_graphics_queue_family", err_destroy);
13761372 }
1377137313781374 assert(main_queue_family.queue_family.queueCount > 0);
···1576157215771573 ret = vk->vkCreateDevice(vk->physical_device, &device_create_info, NULL, &vk->device);
1578157415751575+ // Destroy the list now.
15791576 u_string_list_destroy(&device_ext_list);
1580157715811581- if (ret != VK_SUCCESS) {
15821582- VK_DEBUG(vk, "vkCreateDevice: %s (%d)", vk_result_string(ret), ret);
15831583- if (ret == VK_ERROR_NOT_PERMITTED_EXT) {
15841584- VK_DEBUG(vk, "Is CAP_SYS_NICE set? Try: sudo setcap cap_sys_nice+ep monado-service");
15851585- }
15861586- return ret;
15781578+ if (ret == VK_ERROR_NOT_PERMITTED_EXT) {
15791579+ // Don't spam the not permitted returns as we try all of the different priorities.
15801580+ VK_DEBUG(vk, "Is CAP_SYS_NICE set? Try: sudo setcap cap_sys_nice+ep monado-service");
15811581+ goto err_destroy;
15871582 }
15831583+ VK_CHK_WITH_GOTO(ret, "vkCreateDevice", err_destroy);
1588158415891585 // Fill in the device features we are interested in.
15901586 fill_in_device_features(vk, main_queue.family_index);
···1594159015951591 // Now setup all of the device specific functions.
15961592 ret = vk_get_device_functions(vk);
15971597- if (ret != VK_SUCCESS) {
15981598- goto err_destroy;
15991599- }
15931593+ VK_CHK_WITH_GOTO(ret, "vk_get_device_functions", err_destroy);
1600159416011595 vk->main_queue = vk_insert_get_queue(vk, &main_queue);
16021596 assert(vk->main_queue != NULL);
15971597+16031598#if defined(VK_KHR_video_encode_queue)
16041599 vk->encode_queue = vk_insert_get_queue(vk, &encode_queue);
16051600#endif
···16111606 return ret;
1612160716131608err_destroy:
16141614- vk->vkDestroyDevice(vk->device, NULL);
16151615- vk->device = NULL;
16091609+ if (vk->device != VK_NULL_HANDLE) {
16101610+ vk->vkDestroyDevice(vk->device, NULL);
16111611+ vk->device = VK_NULL_HANDLE;
16121612+ }
16131613+16141614+ // Safe to call even if null.
16151615+ u_string_list_destroy(&device_ext_list);
1616161616171617 return ret;
16181618}
+3
src/xrt/auxiliary/vk/vk_helpers.h
···10781078/*!
10791079 * Creates a VkDevice and initialises the VkQueue.
10801080 *
10811081+ * The @p vk_bundle must have been zero initialized, have the instance functions
10821082+ * loaded and a valid instance.
10831083+ *
10811084 * @ingroup aux_vk
10821085 */
10831086XRT_CHECK_RESULT VkResult