2016-10-03 749 views
1

我从Vulkan开始,我遵循Youtube上的Niko Kauppi教程。Vulkan错误vkCreateDevice:VK_ERROR_EXTENSION_NOT_PRESENT

我创建与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)); 
    

通话_gpu_count = 1和_gpu_properties似乎很好地认识到我的NVIDIA GPU(这是不是至今)

  • device_create_info

    VkDeviceCreateInfo _createDeviceInfo; 
    
    _createDeviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; 
    _createDeviceInfo.queueCreateInfoCount = 1; 
    VkDeviceQueueCreateInfo _queueInfo = _CreateDeviceQueueInfo(); 
    _createDeviceInfo.pQueueCreateInfos = &_queueInfo; 
    
  • 我不理解错误的含义: “A请求的延长不被支持” 根据Khronos的'doc。当你提供的扩展之一[enabledExtensionCountppEnabledExtensionNames]矢量不会被司机(由vkEnumerateDeviceExtensionProperties()如查询)的支持返回

    感谢您的帮助

    +2

    您是否设置了'_createDeviceInfo'的'enabledExtensionCount'和/或'ppEnabledExtensionNames'成员?这就是要求的扩展所在的位置 –

    +0

    @ratchetfreak没有我所做的所有_createDeviceInfo在第二个代码引用 – elpha01

    回答

    1

    VK_ERROR_EXTENSION_NOT_PRESENT

    扩展也可能具有依赖性,因此VK_ERROR_EXTENSION_NOT_PRESENT也会在列表中扩展名的扩展依赖项也在那里丢失时返回。

    如果你不想要设备扩展,确保enabledExtensionCountVkDeviceCreateInfo0(而不是例如一些未初始化的值)。

    我认为2.是_CreateDeviceInfo()的整个机构,这将确认“未初始化值”的怀疑。

    通常虽然你想要一个交换链扩展那里能够直接渲染到屏幕。

    +0

    你好,我试图添加ppEnabledExtensionsNames,并且我得到另一个错误,我不知道问题是否具有相同的原点或不。它是异常0xC0000005访问冲突,如在Realease中的Debug中,它位于0x0000000000000014处的0x0000000069C492D8(nvoglv64.dll)中,它发生在vkCreateDevice中。谢谢 – elpha01

    +0

    ['enabledExtensionCount','ppEnabledExtensionNames']是一个穷人的向量。提供适当的'enabledExtensionCount',否则你可能会强制Vulkan命令读出界限。 – krOoze

    1

    首先,确保你的VkDeviceCreateInfo是零填充的,否则它可能会携带垃圾到你的VkCreateDevice()的电话。

    添加以下只是声明你VkDeviceCreateInfo后线:

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

    某些扩展是绝对必要的,因为swapchain之一。

    要获取可用的扩展做到这一点:

    // 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)); 
    

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

    +0

    请不要在生产中这样做。您应该只激活您实际需要的扩展程序,并且不要盲目激活扩展程序,因为它们在平台上可用。扩展程序可能会严重降低程序的速度,但除非您的代码正在积极使用它们,否则您将不会收到任何回应。因此,正确的方法是保留应用程序的必需和可选扩展列表,并针对'vkEnumerateDeviceExtensionProperties'检查相应的扩展。 – ComicSansMS