无法使用传输队列支持创建VkDevice

时间:2018-03-19 15:31:46

标签: c++ vulkan

以下是我的工作:

  1. 我使用vkEnumeratePhysicalDevices并获得一个VkPhysicalDevice
  2. 我使用vkGetPhysicalDeviceQueueFamilyProperties来查询设备的队列系列,以查看哪些队列支持图形和/或传输操作。
  3. 我使用vkGetPhysicalDeviceSurfaceSupportKHR获取队列的当前支持。
  4. 我通过我收集的队列信息循环,找到第一个合适的图形队列,第一个当前队列和第一个专用传输队列(第一个具有VK_QUEUE_TRANSFER_BIT标志,但不是VK_QUEUE_GRAPHICS_BIT标志)
  5. 我使用vkCreateDevice创建一个VkDevice,其数组为3个VkDeviceQueueCreateInfo对象,作为VkDeviceCreateInfo结构中的pQueueCreateInfos成员
  6. 我的第一个图形和第一个当前队列系列都是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);
    
  7. 问题是,vkCreateDevice返回VK_ERROR_INITIALIZATION_FAILED。如果我将queueCreateInfoCount设置为2并忽略传输队列,则该函数返回成功。但是如果我没有使用传输队列选项创建设备,那么当我尝试使用传输系列时,我的vkGetDeviceQueue会崩溃。

1 个答案:

答案 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所指出的那样,无法保证 是一个专用的传输队列,甚至不是一个图形队列。因此,请始终确保在您的设置代码中涵盖所有潜在的基础。