Vulkan - 加载扩展程序

时间:2017-09-04 04:51:18

标签: c++ 3d vulkan

我在创建基本的Vulkan应用程序时遇到了一些问题:当我尝试通过ppEnableExtensionNames加载任何扩展时,尝试创建实例时失败。如果ppEnableExtensionNamesNULL,则实例创建成功(尽管如此,因为我无法创建表面)。

我用不同的教程仔细检查了,并且找不到任何错误。我安装了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;

    }

1 个答案:

答案 0 :(得分:1)

由于向量仅在范围内的loadExtensions()函数内,并且它仅作为指向instanceInfo结构的指针给出,因此指针变为无效,当返回WinMain函数时,向量超出范围。因此,只需将矢量设为全局或将其存储在其他位置,直到创建实例。