2017-09-04 64 views
-1

创建基本Vulkan应用程序时遇到了一些问题:试图创建实例时失败,只要我尝试通过ppEnableExtensionNames加载任何扩展。如果ppEnableExtensionNamesNULL,则实例创建成功(尽管如此,我不能创建曲面)。加载扩展时,Vulkan - 实例创建失败

我重复检查了不同的教程,无法找到任何错误。我安装了SDK并检查了vulkan-1.dll,并成功运行了多维数据集演示。此外,我列举了通过可用的扩展和所有我试图加载的扩展列出,所以我的设备应该基本上支持他们。

继承人我的代码,打破vkCreateInstance只要ppEnableExtensionNames != NULL。 编辑:虽然我同时解决了这个问题,但我改变了代码,导致了实际问题,以防有人犯同样的愚蠢错误。

#define VK_USE_PLATFORM_WIN32_KHR 


    //STD 
    #include <Windows.h> 
    #include <iostream> 
    #include <string> 
    #include <vector> 

    //NON-STD Libraries 
    #include "vulkan\vulkan.h" 



    //================== 
    //Window Reference 
    //================== 
    WNDCLASSEX window; 
    MSG msg; 
    HWND hwnd;   
    HDC hdc;    



    //=================== 
    //SETUP VULKAN 
    //=================== 

    //Global VK Variables 
    VkInstance instance; 
    VkPhysicalDevice physDevice;   
    VkApplicationInfo appInfo = {}; 
    VkInstanceCreateInfo instanceInfo = {}; 


    void loadExtensions{ 

std::vector<const char *> enabledExtensions; 
     enabledExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); 
     enabledExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 

     instanceInfo.enabledExtensionCount = enabledExtensions.size(); 
     instanceInfo.ppEnabledExtensionNames = &enabledExtensions[0]; 

} 


    //================== 
    //WinMain, Entry Point 
    //================== 
    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) { 


     appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; 
     appInfo.pNext = NULL; 
     appInfo.pApplicationName = "Monody"; 
     appInfo.applicationVersion = VK_MAKE_VERSION(0, 0, 0); 
     appInfo.pEngineName = "Monody Engine"; 
     appInfo.engineVersion = VK_MAKE_VERSION(0, 0, 0); 
     appInfo.apiVersion = VK_API_VERSION_1_0; 

     instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 
     instanceInfo.pNext = NULL; 
     instanceInfo.flags = 0; 
     instanceInfo.pApplicationInfo = &appInfo; 
     instanceInfo.enabledLayerCount = 0; 
     instanceInfo.ppEnabledLayerNames = NULL; 
     instanceInfo.enabledExtensionCount = 0; 
     instanceInfo.ppEnabledExtensionNames = NULL; 


    loadExtensions(); 


     //Create Instance 
     VkResult error = vkCreateInstance(&instanceInfo, nullptr, &instance); 




     return 0; 

    } 
+0

这确切的事情发生在我身上。花了我一些时间来弄清楚到底发生了什么。 – Zebrafish

回答

1

由于矢量是仅在范围内的loadExtensions()函数,并且仅给出作为一个指针instanceInfo结构,指针将变为无效,当 - 回WinMain函数 - 所述载体是超出范围。因此,只需将矢量全局化或将其存储在其他位置,直到创建实例。