The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

a/vk: small refactor/clean-up vk queue setup

Part-of: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2600>

+51 -23
+51 -23
src/xrt/auxiliary/vk/vk_bundle_init.c
··· 631 631 return VK_SUCCESS; 632 632 } 633 633 634 + struct vk_queue_family 635 + { 636 + VkQueueFamilyProperties queue_family; 637 + uint32_t family_index; 638 + }; 639 + 634 640 static VkResult 635 - find_graphics_queue_family(struct vk_bundle *vk, uint32_t *out_graphics_queue_family) 641 + find_graphics_queue_family(struct vk_bundle *vk, struct vk_queue_family *out_graphics_queue_family) 636 642 { 637 643 /* Find the first graphics queue */ 638 644 uint32_t queue_family_count = 0; ··· 659 665 goto err_free; 660 666 } 661 667 662 - *out_graphics_queue_family = i; 668 + *out_graphics_queue_family = (struct vk_queue_family){ 669 + .queue_family = queue_family_props[i], 670 + .family_index = i, 671 + }; 663 672 664 673 free(queue_family_props); 665 674 ··· 671 680 } 672 681 673 682 static VkResult 674 - find_queue_family(struct vk_bundle *vk, VkQueueFlags required_flags, uint32_t *out_queue_family) 683 + find_queue_family(struct vk_bundle *vk, VkQueueFlags required_flags, struct vk_queue_family *out_queue_family) 675 684 { 676 685 /* Find the "best" queue with the requested flags (prefer queues without graphics) */ 677 686 uint32_t queue_family_count = 0; ··· 711 720 } 712 721 } 713 722 714 - *out_queue_family = i; 723 + *out_queue_family = (struct vk_queue_family){ 724 + .queue_family = queue_family_props[i], 725 + .family_index = i, 726 + }; 715 727 716 728 free(queue_family_props); 717 729 ··· 1352 1364 1353 1365 vk_reset_queues(vk); 1354 1366 1355 - struct vk_queue_pair main_queue = VK_NULL_QUEUE_PAIR; 1367 + struct vk_queue_family main_queue_family = {0}; 1356 1368 if (only_compute) { 1357 - ret = find_queue_family(vk, VK_QUEUE_COMPUTE_BIT, &main_queue.family_index); 1369 + ret = find_queue_family(vk, VK_QUEUE_COMPUTE_BIT, &main_queue_family); 1358 1370 } else { 1359 - ret = find_graphics_queue_family(vk, &main_queue.family_index); 1371 + ret = find_graphics_queue_family(vk, &main_queue_family); 1360 1372 } 1361 1373 1362 1374 if (ret != VK_SUCCESS) { 1363 1375 return ret; 1364 1376 } 1365 1377 1378 + assert(main_queue_family.queue_family.queueCount > 0); 1379 + 1380 + const struct vk_queue_pair main_queue = { 1381 + .family_index = main_queue_family.family_index, 1382 + .index = 0, 1383 + }; 1384 + 1366 1385 VkDeviceQueueGlobalPriorityCreateInfoEXT priority_info = { 1367 1386 .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT, 1368 1387 .pNext = NULL, 1369 1388 .globalPriority = global_priority, 1370 1389 }; 1371 1390 1372 - float queue_priority = 0.0f; 1373 - VkDeviceQueueCreateInfo queue_create_info[2] = {0}; 1391 + const float queue_priority[VK_BUNDLE_MAX_QUEUES] = { 1392 + 0.f, 1393 + 0.f, 1394 + }; 1395 + VkDeviceQueueCreateInfo queue_create_info[VK_BUNDLE_MAX_QUEUES] = {0}; 1374 1396 uint32_t queue_create_info_count = 1; 1375 1397 1376 1398 // Compute or Graphics queue 1377 - main_queue.index = 0; 1378 - queue_create_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 1379 - queue_create_info[0].pNext = NULL; 1380 - queue_create_info[0].queueCount = 1; 1381 - queue_create_info[0].queueFamilyIndex = main_queue.family_index; 1382 - queue_create_info[0].pQueuePriorities = &queue_priority; 1399 + queue_create_info[0] = (VkDeviceQueueCreateInfo){ 1400 + .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 1401 + .pNext = NULL, 1402 + .queueCount = 1, 1403 + .queueFamilyIndex = main_queue.family_index, 1404 + .pQueuePriorities = queue_priority, 1405 + }; 1383 1406 1384 1407 #ifdef VK_KHR_video_encode_queue 1385 1408 // Video encode queue 1386 1409 struct vk_queue_pair encode_queue = VK_NULL_QUEUE_PAIR; 1387 1410 if (u_string_list_contains(device_ext_list, VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME)) { 1388 - ret = find_queue_family(vk, VK_QUEUE_VIDEO_ENCODE_BIT_KHR, &encode_queue.family_index); 1411 + struct vk_queue_family encode_queue_family = {0}; 1412 + ret = find_queue_family(vk, VK_QUEUE_VIDEO_ENCODE_BIT_KHR, &encode_queue_family); 1389 1413 if (ret == VK_SUCCESS) { 1390 - encode_queue.index = 0; 1391 - queue_create_info[queue_create_info_count].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; 1392 - queue_create_info[queue_create_info_count].pNext = NULL; 1393 - queue_create_info[queue_create_info_count].queueCount = 1; 1394 - queue_create_info[queue_create_info_count].queueFamilyIndex = encode_queue.family_index; 1395 - queue_create_info[queue_create_info_count].pQueuePriorities = &queue_priority; 1396 - queue_create_info_count++; 1414 + encode_queue = (struct vk_queue_pair){ 1415 + .family_index = encode_queue_family.family_index, 1416 + .index = 0, 1417 + }; 1418 + queue_create_info[queue_create_info_count++] = (VkDeviceQueueCreateInfo){ 1419 + .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 1420 + .pNext = NULL, 1421 + .queueCount = 1, 1422 + .queueFamilyIndex = encode_queue.family_index, 1423 + .pQueuePriorities = queue_priority, 1424 + }; 1397 1425 VK_DEBUG(vk, "Creating video encode queue, family index %d", encode_queue.family_index); 1398 1426 } 1399 1427 }