首页 > 解决方案 > VKLayer_device_simulation.dll 的 vkCreateInstance 访问冲突

问题描述

我是 vulkan 的新手。
当我调用vkCreateInstance()时,它崩溃了,但我不知道是什么问题。
vkenumerateExtensionProperties返回 0 扩展计数,并且只找到 VKLayer_LUNARG_api_dump,这很奇怪。
核心代码如下,无关代码被删除。

Instance_Vulkan

#pragma once

#ifndef INSTANCE_VULKAN_HPP
#define INSTANCE_VULKAN_HPP

#include <vulkan/vulkan.h>
#include <vector>
#include <string>
#include <exception>
#include <iostream>

using namespace std;
namespace LB
{
    class Instance_Vulkan
    {
    public:
        bool isCreated = false;
        VkInstance instance;
        VkInstanceCreateInfo createInfo;
        std::vector<const char*> extensions;
        std::vector<const char*> layers;
        Instance_Vulkan()
        {
            createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
        createInfo.flags = 0;
        createInfo.pNext = NULL;
        createInfo.pApplicationInfo = NULL;
        createInfo.enabledLayerCount = 0;
        createInfo.ppEnabledLayerNames = NULL;
        createInfo.enabledExtensionCount = 0;
        createInfo.ppEnabledExtensionNames = NULL;
    }


    VkResult creat(const VkAllocationCallbacks* pAllocator=NULL)
    {
        if (isCreated)
            return VK_SUCCESS;
        else
        {
            VkResult result;
            createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
            if(createInfo.enabledExtensionCount)
                createInfo.ppEnabledExtensionNames = extensions.data();
            createInfo.enabledLayerCount = static_cast<uint32_t>(layers.size());
            if(createInfo.enabledLayerCount)
                createInfo.ppEnabledLayerNames = layers.data();
            if((result = vkCreateInstance(&createInfo, nullptr, &instance))!=VK_SUCCESS)
                cout << "Error: fail to create Vulkan Instance ! " << endl;

            if (result == VK_SUCCESS) 
                isCreated = true;
            return result;
        }
    }

    void destroy()
    {
        if (isCreated)
            vkDestroyInstance(instance,nullptr);
        isCreated = false;
    }

};


}
#endif // !INSTANCE_VULKAN_HPP

下面的代码调用上面的类

#pragma once

#ifndef APPLICATION_HPP
#define APPLICATION_HPP
#include<vulkan/vulkan.h>
#include <iostream>
#include <stdexcept>
#include <cstdlib>
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>


#include "Item.hpp"
#include"Window.hpp"
#include "Instance_Vulkan.hpp"

using namespace std;

namespace LB
{
    class Application
    {
    public:
        bool shouldClose = false;
        virtual void mainLoop()
        {
        }
        void init()
        {
            glfwInit();
            glfwWindowHint(GLFW_CLIENT_API,GLFW_NO_API);
            glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
            initVulkan();
        }
        void initVulkan()
        {   
    // set the application info
        VkApplicationInfo appInfo = {};
        appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
        appInfo.pApplicationName = "Hellp 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;
        appInfo.pNext = NULL;
    // set papplicatoinInfo
        instance.createInfo.pApplicationInfo = &appInfo;

        if (instance.creat()!= VK_SUCCESS)
            throw std::runtime_error("Error: fail to create vulkan instance ");



    }
    void cleanUp()
    {
        glfwTerminate();
        instance.destroy();
    }
    int run(int argc=0,char* argv[]=0)
    {
        init();
        try {
            for (;!shouldClose;)
                mainLoop();
        }
        catch (const std::exception e)
        {
            std::cerr << e.what() << std::endl;
            return EXIT_FAILURE;
        }
        cleanUp();
        return EXIT_SUCCESS;
    }
private:
    Instance_Vulkan instance;
};
}
#endif

有主要功能

#include "pch.h"
#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>
#include "Application.hpp"
#include <iostream>
#include <cstdlib>

using namespace LB;
using namespace std;

int main()
{
    Application app;
        return app.run();

}

当我运行代码时,它会崩溃 “结果图像”
我的环境:

标签: vulkan

解决方案


推荐阅读