创建呈现队列

现在,我们可以修改逻辑设备的创建过程,创建呈现队列,并将队列句柄保存在成员变量中:

VkQueue presentQueue;

我们需要多个VkDeviceQueueCreateInfo结构体来创建所有使用的队列族。一个优雅的处理方式是使用STL的集合创建每一个不同的队列族:

#include <set>

        ...

    QueueFamilyIndices indices = findQueueFamilies(physicalDevice);

    std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
    std::set<int> uniqueQueueFamilies = {indices.graphicsFamily, indices.presentFamily};

    float queuePriority = 1.0f;
    for (int queueFamily : uniqueQueueFamilies) {
        VkDeviceQueueCreateInfo queueCreateInfo = {};
        queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
        queueCreateInfo.queueFamilyIndex = queueFamily;
        queueCreateInfo.queueCount = 1;
        queueCreateInfo.pQueuePriorities = &queuePriority;
        queueCreateInfos.push_back(queueCreateInfo);
    }

修改VkDeviceCreateInfo结构体的pQueueCreateInfos:

createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
createInfo.pQueueCreateInfos = queueCreateInfos.data();

对于同一个队列族,我们只需要传递它的索引一次。最后,调用vkGetDeviceQueue函数获取队列句柄:

vkGetDeviceQueue(device, indices.presentFamily, 0, &presentQueue);

对于队列族相同的情况,我们获取的队列句柄也极有可能相同。在下一章节,我们将介绍交换链,以及如何使用它将图像显示到窗口表面上。

本章节代码:

C++:

https://vulkan-tutorial.com/code/05_window_surface.cpp