2017-09-04 6 views
-1

Je rencontre des problèmes lors de la création d'une application de base Vulkan: Lorsque j'essaie de créer une instance, elle échoue dès que j'essaye de charger des extensions via ppEnableExtensionNames. Si ppEnableExtensionNames est NULL, la création de l'instance réussit (tout à fait piquant cependant, puisque je ne peux pas créer une surface de cette façon).Vulkan - la création de l'instance échoue lors du chargement des extensions

J'ai vérifié deux fois avec différents tutoriels et je n'ai trouvé aucune erreur. J'ai installé le SDK et vérifié le vulkan-1.dll, ainsi que la démo de cube avec succès. De plus, j'ai énuméré les extensions disponibles et toutes les extensions que j'ai essayé de charger ont été listées, donc mon appareil devrait les supporter.

Hérite mon code, se casse à vkCreateInstance aussi longtemps que ppEnableExtensionNames != NULL. EDIT: Même si j'ai résolu ce problème pendant ce temps, j'ai changé le code à ce qui a causé les problèmes réels, au cas où quelqu'un ferait la même erreur stupide.

#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

Cette chose m'est exactement arrivée. Ça m'a pris un peu pour comprendre ce qui se passait. – Zebrafish

Répondre

1

Puisque le vecteur est que dans la fonction loadExtensions() dans la portée, et il est seulement donné comme un pointeur vers la struct instanceInfo, le pointeur devient invalide, quand - retour dans la fonction WinMain - le vecteur est hors champ. Il suffit donc de rendre le vecteur global ou de le stocker ailleurs, jusqu'à ce que l'instance soit créée.