以下是我的工作:
我的第一个图形和第一个当前队列系列都是0,而我的传输系列是索引1,这是它们的外观:
float queuePriorities[] = { 1.0f };
VkDeviceQueueCreateInfo devideQueueInfos[3];
devideQueueInfos[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
devideQueueInfos[0].pNext = null;
devideQueueInfos[0].flags = 0;
devideQueueInfos[0].queueFamilyIndex = device.FirstGraphicsQueueFamily(); //This is always 0
devideQueueInfos[0].queueCount = 1;
devideQueueInfos[0].pQueuePriorities = queuePriorities;
devideQueueInfos[1].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
devideQueueInfos[1].pNext = null;
devideQueueInfos[1].flags = 0;
devideQueueInfos[1].queueFamilyIndex = device.FirstPresentQueueFamily(); //This is always 0
devideQueueInfos[1].queueCount = 1;
devideQueueInfos[1].pQueuePriorities = queuePriorities;
devideQueueInfos[2].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
devideQueueInfos[2].pNext = null;
devideQueueInfos[2].flags = 0;
devideQueueInfos[2].queueFamilyIndex = device.FirstTransferQueueFamily(); //This is always 1
devideQueueInfos[2].queueCount = 1;
devideQueueInfos[2].pQueuePriorities = queuePriorities;
deviceInfo.queueCreateInfoCount = 3;
deviceInfo.pQueueCreateInfos = devideQueueInfos;
VkResult result = vkCreateDevice(deviceHandle, &deviceInfo, null, logicalDeviceHandle);
问题是,vkCreateDevice返回VK_ERROR_INITIALIZATION_FAILED。如果我将queueCreateInfoCount设置为2并忽略传输队列,则该函数返回成功。但是如果我没有使用传输队列选项创建设备,那么当我尝试使用传输系列时,我的vkGetDeviceQueue会崩溃。
答案 0 :(得分:3)
devideQueueInfos[1].queueFamilyIndex = device.FirstPresentQueueFamily(); //This is always 0
devideQueueInfos[0].queueFamilyIndex = device.FirstGraphicsQueueFamily(); //This is always 0
不允许多次将相同的队列索引传递给vkCreateDevice
。
具有当前支持的队列始终具有图形支持。类似地,具有图形支持的队列总是具有计算和传输支持。
您需要做的是确定是否存在仅具有 传输支持的队列,并仅在该情况下将其指定为传输队列。否则,您还需要使用图形队列进行传输。您仍然可以拥有一个专用的传输队列,它只是一个图形队列的情况,因为该设备没有暴露任何专门的传输功能,或者出于任何原因不要求它明显暴露于图形功能。
因此,如果您想要一个队列进行传输,一个队列用于图形,并且设备没有专用传输队列,则需要在create struct中请求两个图形队列,而不是一个图形队列两次。通过演示,我不明白为什么要划分它们。没有“演示”队列类型。它始终是一个具有表示支持的图形队列,因此在create struct中引用它是没有意义的。
编辑:正如Nicol所指出的那样,无法保证 是一个专用的传输队列,甚至不是一个图形队列。因此,请始终确保在您的设置代码中涵盖所有潜在的基础。