难以创建一个vulkan实例

时间:2017-05-22 19:44:05

标签: c++ vulkan

我开始重建游戏引擎我开始为openGL编写,这次图形框架是基于Vulkan的,但由于访问冲突,我无法创建我的第一个Vkinstance。我遵循vulkan-tutorial.com教程,实例部分。我宣布了一个

Vkinstance instance;

然后我打电话给

vkCreateInstance(&createInfo, nullptr, &instance)

我的程序因引用访问冲突而中断。

我试过将实例设为指针并设置它

instance = new Vkinstance();

但这并没有解决问题。我仍然有访问冲突。这是上升的因为iv在Vkinstance创建的教程中看到并且未初始化,然后在下一行将strait发送到vkCreateInstance。那我为什么会收到这个错误?

另外:instance是属于类vkCreateInstance的私有变量。

编辑:

这是一个更完整的代码段,您可以测试

#define VK_USE_PLATFORM_WIN32_KHR
#include <vulkan/vulkan.h>

int main(int argc, char* argv[]) {
    VkInstance instance;

    VkApplicationInfo appInfo = {};
    appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
    appInfo.pApplicationName = "Hello Triangle";
    appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
    appInfo.pEngineName = "No Engine";
    appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
    appInfo.apiVersion = VK_API_VERSION_1_0;

    VkInstanceCreateInfo createInfo = {};
    createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
    createInfo.pApplicationInfo = &appInfo;
    unsigned int extensionCount = 0;
    const char* extensionNames[] = {
        VK_KHR_SURFACE_EXTENSION_NAME,
        VK_KHR_WIN32_SURFACE_EXTENSION_NAME
    };
    vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
    createInfo.enabledExtensionCount = extensionCount;
    createInfo.ppEnabledExtensionNames = extensionNames;
    createInfo.enabledLayerCount = 0;

    if (vkCreateInstance(&createInfo, nullptr, &instance) != VK_SUCCESS) {
        throw std::runtime_error("failed to create instance!");
    }

它打破了&amp;实例的vkCreateInstance(&amp; createInfo,nullptr,&amp; instance):访问冲突读取位置0xCCCCCCCC

1 个答案:

答案 0 :(得分:2)

您的实例扩展名列表固定为两个条目:

const char* extensionNames[] = {
    VK_KHR_SURFACE_EXTENSION_NAME,
    VK_KHR_WIN32_SURFACE_EXTENSION_NAME
};

但您阅读并将所有可用扩展的总数传递给创建信息:

vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);

createInfo.enabledExtensionCount = extensionCount;
createInfo.ppEnabledExtensionNames = extensionNames;

extensionCount很可能大于2,这就是实例创建失败的原因(因为它需要多于两个扩展名)。

因此,要么像查询扩展计数一样查询并传递所有可用的扩展名(如果你真的想要启用所有扩展名),要么将createInfo.enabledExtensionCount设置为预定义扩展名列表数组的大小。