Vulkan错误vkCreateDevice:VK_ERROR_EXTENSION_NOT_PRESENT

时间:2016-10-03 10:27:39

标签: vulkan

我从Vulkan开始,我在Youtube上关注Niko Kauppi的教程。

使用vkCreateDevice创建设备时出错,返回VK_ERROR_EXTENSION_NOT_PRESENT

这是我的代码的一部分:

  1. 对vkCreateDevice的调用

    _gpu_count = 0;
    vkEnumeratePhysicalDevices(instance, &_gpu_count, nullptr);
    std::vector<VkPhysicalDevice> gpu_list(_gpu_count);
    vkEnumeratePhysicalDevices(instance, &_gpu_count, gpu_list.data());
    _gpu = gpu_list[0];
    
    vkGetPhysicalDeviceProperties(_gpu, &_gpu_properties);
    
    VkDeviceCreateInfo device_create_info = _CreateDeviceInfo();
    
    vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));
    
  2. _gpu_count = 1和_gpu_properties似乎很清楚我的nvidia gpu(这是不是最新的)

    1. device_create_info

      VkDeviceCreateInfo _createDeviceInfo;
      
      _createDeviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
      _createDeviceInfo.queueCreateInfoCount = 1;
      VkDeviceQueueCreateInfo _queueInfo = _CreateDeviceQueueInfo();
      _createDeviceInfo.pQueueCreateInfos = &_queueInfo;
      
    2. 根据Khronos的文档,我不明白错误的含义:“不支持请求的扩展名。”

      感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果驱动程序不支持您提供的[VK_ERROR_EXTENSION_NOT_PRESENTenabledExtensionCount]向量中的某个扩展程序(由ppEnabledExtensionNames查询),则会返回

vkEnumerateDeviceExtensionProperties()。< / p>

扩展也可以有依赖项,因此当列表中的扩展名的扩展依赖项也缺失时,也会返回VK_ERROR_EXTENSION_NOT_PRESENT

如果您不想要设备扩展程序,请确保enabledExtensionCount的{​​{1}}为VkDeviceCreateInfo(而不是某些未初始化的值)。

我假设2.是0的整个主体,它将确认&#34;未初始化的值&#34;怀疑。

通常你会想要一个交换链扩展,以便能够直接渲染到屏幕。

答案 1 :(得分:1)

首先,请确保您的VkDeviceCreateInfo已填零,否则可能会在您的VkCreateDevice()来电中携带垃圾。

在声明VkDeviceCreateInfo后添加以下行:

memset ( &_createDeviceInfo, 0, sizeof(VkDeviceCreateInfo)  );

一些扩展是绝对必要的,如交换链一样。

要检索可用的扩展程序,请执行以下操作:

// Available extensions and layers names
const char* const* _ppExtensionNames = NULL;    
// get extension names
uint32 _extensionCount = 0;
vkEnumerateDeviceExtensionProperties( _gpu, NULL, &_extensionCount, NULL);
std::vector<const char *> extNames;
std::vector<VkExtensionProperties> extProps(_extensionCount);
vkEnumerateDeviceExtensionProperties(_gpu, NULL, &_extensionCount, extProps.data());
for (uint32_t i = 0; i < _extensionCount; i++) {
    extNames.push_back(extProps[i].extensionName);
}
 _ppExtensionNames = extNames.data();

_ppExtensionNames中拥有所有扩展名后,将其传递给deviceCreateInfo结构:

 VkDeviceCreateInfo  device_create_info ...
    [...]
    device_create_info.enabledExtensionCount = _extensionCount;
    device_create_info.ppEnabledExtensionNames = _ppExtensionNames;
    [...]
vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));

我希望它有所帮助。 请仔细检查上面的代码,因为我正在写它。