При создании VkInstance, VkResult равен VK_ERROR_INITIALIZATION_FAILED
Решил попробывать воспользоватся вулканом, но столкнулся с такой ошибкой. Вроде повторил все как в документации но когда я создаю VkInstance то его возвращаемое значение равно -3 (т.е. VK_ERROR_INITIALIZATION_FAILED). Функционал вулкана реализовываю отдельно от инициализации окна GLFW. Также в консоль выводится ошибка vkCreateInstance 'pInstance' not valid (VUID-vkCreateInstance-pInstance-parameter)
vulkanApp.h
#ifndef VULKANAPP_H
#define VULKANAPP_H
#include <vulkan/vulkan_core.h>
class VulkanApp{
public:
void initVulkan();
void cleanup();
private:
VkInstance instance{};
void createInstance();
};
#endif
vulkanApp.cpp
#include "vulkanApp.h"
#include "GLFW/glfw3.h"
#include <iostream>
#include <stdexcept>
#include <vector>
#include <vulkan/vulkan_core.h>
void VulkanApp::initVulkan(){
createInstance();
}
void VulkanApp::cleanup(){
vkDestroyInstance(instance, nullptr);
}
void VulkanApp::createInstance(){
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;
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions;
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
std::vector<const char*> requiredExtensions;
for (uint32_t i = 0; i < glfwExtensionCount; i++) {
requiredExtensions.emplace_back(glfwExtensions[i]);
}
requiredExtensions.emplace_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME);
createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
createInfo.enabledExtensionCount = static_cast<uint32_t>(requiredExtensions.size());
createInfo.ppEnabledExtensionNames = requiredExtensions.data();
createInfo.enabledLayerCount = 0;
VkResult res = vkCreateInstance(&createInfo, nullptr, &instance);
if (res != VK_SUCCESS) {
throw std::runtime_error("ERROR: VkInstance couldn't created. VkResult: " + res);
}
}
app.h
#ifndef APP_H
#define APP_H
#include <GLFW/glfw3.h>
#include "vulkanApp.h"
class App{
public:
void run();
private:
void initWindow();
void mainLoop();
void cleanup();
GLFWwindow* window;
VulkanApp* vkApp;
const uint32_t WIDTH = 800;
const uint32_t HEIGHT = 600;
};
#endif
Ответы (1 шт):
Автор решения: Quantum
→ Ссылка
Не забывайте создавать экземпляр класса!
Было:
VulkanApp* vkApp;
Стало:
VulkanApp* vkApp = new VulkanApp();