AdamYuan / VulkanQueueSelector

An single-header library to select optimal vulkan queues.
The Unlicense
1 stars 0 forks source link

Vulkan Queue Selector

An single-header c library to select optimal vulkan queues.

Usage

Check vk_queue_selector.h and test/main.cpp for details.

VqsQueueRequirements requirements[] = {
    {VK_QUEUE_GRAPHICS_BIT, 1.0f, surface}, // "surface" is a VkSurfaceKHR, indicating a present queue is needed
    {VK_QUEUE_TRANSFER_BIT, 0.8f, nullptr},
    {VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT, 1.0f, nullptr}
};

VqsQueryCreateInfo createInfo = {};
createInfo.physicalDevice = physicalDevice;
createInfo.queueRequirementCount = std::size(requirements);
createInfo.pQueueRequirements = requirements;

// Specify vulkan functions if necessary
VqsVulkanFunctions functions = {};
functions.vkGetPhysicalDeviceQueueFamilyProperties = vkGetPhysicalDeviceQueueFamilyProperties;
functions.vkGetPhysicalDeviceSurfaceSupportKHR = vkGetPhysicalDeviceSurfaceSupportKHR;
ccreateInfo.pVulkanFunctions = &functions;

VqsQuery query;
vqsCreateQuery(&createInfo, &query); // Create a VqsQuery object, return VK_SUCCESS if success

vqsPerformQuery(query); // Perform the query, return VK_SUCCESS if the requirements can be met

// Get queue selections, the returned structures are defined as the following:
// typedef struct VqsQueueSelection {
//     uint32_t queueFamilyIndex, queueIndex;
//     uint32_t presentQueueFamilyIndex, presentQueueIndex;
// } VqsQueueSelection;
std::vector<VqsQueueSelection> selections;
selections.resize(std::size(requirements));
vqsGetQueueSelections(query, selections.data());

// Get an array of VkDeviceQueueCreateInfo
uint32_t queueCreateInfoCount, queuePriorityCount;
vqsEnumerateDeviceQueueCreateInfos(query, &queueCreateInfoCount, nullptr, &queuePriorityCount, nullptr);
std::vector<VkDeviceQueueCreateInfo> queueCreateInfos(queueCreateInfoCount);
std::vector<float> queuePriorities(queuePriorityCount);
vqsEnumerateDeviceQueueCreateInfos(query, &queueCreateInfoCount, queueCreateInfos.data(), &queuePriorityCount, queuePriorities.data());

// Destroy the object
vqsDestroyQuery(query);

Strategy