创建呈现队列
现在,我们可以修改逻辑设备的创建过程,创建呈现队列,并将队列句柄保存在成员变量中:
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++: