2017-09-04 61 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函數 - 所述載體是超出範圍。因此,只需將矢量全局化或將其存儲在其他位置,直到創建實例。