【问题标题】:What could cause vkCreateDevice() to fail without giving a reason for failure?什么会导致 vkCreateDevice() 在没有给出失败原因的情况下失败?
【发布时间】:2017-10-29 21:35:29
【问题描述】:

我正在通过 vulkan 食谱学习 vulkan,但现在我发现自己陷入了僵局:

如果我尝试在我发送到vkCreateDeviceVkDeviceCreateInfo 结构的扩展列表中传递扩展名,即VK_KHR_SURFACE_EXTENSION_NAMEVK_KHR_WIN32_SURFACE_EXTENSION_NAME,则函数将失败且没有任何错误(它不会返回VK_SUCCESS)

我已经检查过了,我知道我的显卡支持我试图通过的所有扩展。我尝试读取验证层的输出,但它们似乎没有发现失败的原因(我启用了VK_LAYER_LUNARG_api_dump 和标准验证层)。

我创建逻辑设备的函数如下所示-

bool create_logical_device(VkPhysicalDevice &physDev, VkDevice &device,
                           std::vector<char const *> &desExts,
                           std::vector<queueInfo> &qInfos,
                           VkPhysicalDeviceFeatures &physDevFtrs) 
{
  std::vector<VkDeviceQueueCreateInfo> qCreateInfo;
  std::vector<VkExtensionProperties> physDevExtProps;

  if (!get_avl_phys_dev_exts(physDev, physDevExtProps))
    return false;

  for (auto &ext : desExts) 
  {
    if (!is_ext_available(physDevExtProps, ext))
      return false;
  }

  for (auto &i : qInfos) 
  {
    qCreateInfo.push_back(
        {VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 
            nullptr, 
            0, 
            i.FamilyIndex,
            (uint32_t)i.Priorities.size(),
            i.Priorities.size() > 0 ? i.Priorities.data() : nullptr
        });
  }

  VkDeviceCreateInfo devCreateInfo = 
  {
      VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
      nullptr,
      0,
      (uint32_t)qCreateInfo.size(),
      qCreateInfo.size() > 0 ? qCreateInfo.data() : nullptr,
      0,
      nullptr,
      (uint32_t)desExts.size(),
      desExts.size() > 0 ? desExts.data() : nullptr,
      &physDevFtrs

  };



#ifdef ENABLE_VALIDATION
  devCreateInfo.enabledLayerCount = (uint32_t)valLayers.size();
  devCreateInfo.ppEnabledLayerNames = valLayers.data();
#endif

  if (vkCreateDevice(physDev, &devCreateInfo, nullptr, &device) != VK_SUCCESS) 
  {
    std::cout << "Could not create logical device!" << std::endl;
    return false;
  }

  std::cout << "Succesfully created logical device" << std::endl;

  return true;
}

valLayers 是全局范围内的常量向量。

windows和linux都会出现这个故障,所以只能是我这边的问题。通过调试器运行代码并没有向我透露任何信息。我可能做错了什么?

【问题讨论】:

  • 如果它不返回 VK_SUCCESS 它会返回什么?
  • 您确定您提供了有效的扩展名吗? VK_KHR_SURFACE_EXTENSION_NAME 是实例扩展,因此不应在设备创建期间提供。
  • 我认为这一定是发生了什么......我会检查的。
  • @Ekzuzy,这解决了问题,谢谢。将您的评论变成答案,以便我接受。

标签: c++ vulkan


【解决方案1】:

您确定您提供了有效的扩展名吗? VK_KHR_SURFACE_EXTENSION_NAME 是实例扩展,因此不应在设备创建期间提供。

感谢您使用/阅读/学习Vulkan Cookbook ;-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多