Создание экземпляра Vulkan

This commit is contained in:
parent 35cdc26f56
commit 8887ee67fd
3 changed files with 92 additions and 2 deletions

24
include/vk.h Normal file
View File

@ -0,0 +1,24 @@
#ifndef VK_H
#define VK_H
#include <vulkan/vulkan.h>
#include <GLFW/glfw3.h>
class Vulkan
{
public:
void init(); // инициализация
void destroy(); // завершение работы
private:
VkInstance instance; // Экземпляр Vulkan
// Структура для хранения флагов
struct
{
const bool VALIDATION = 1; // Использование слоев проверки
} states;
void createInstance(); //
};
#endif // VK_H

View File

@ -1,9 +1,10 @@
#include <vulkan/vulkan.h> #include "vk.h"
#include <GLFW/glfw3.h>
#include <iostream> #include <iostream>
void vkInit();
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
// Инициализация GLFW // Инициализация GLFW
@ -12,6 +13,9 @@ int main(int argc, char* argv[]) {
// Проверка доступности Vulkan // Проверка доступности Vulkan
if (glfwVulkanSupported()) if (glfwVulkanSupported())
{ {
// объект класса-обертки Vulkan API
Vulkan vulkan;
// Отключим создание контекста // Отключим создание контекста
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
// Отключим возможность изменения размеров окна // Отключим возможность изменения размеров окна
@ -19,6 +23,9 @@ int main(int argc, char* argv[]) {
// Создание окна // Создание окна
GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr); GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);
// Инициализация Vulkan API
vulkan.init();
// Жизненный цикл // Жизненный цикл
while(!glfwWindowShouldClose(window)) { while(!glfwWindowShouldClose(window)) {
// Обработка событий // Обработка событий
@ -27,6 +34,9 @@ int main(int argc, char* argv[]) {
// Уничтожение окна // Уничтожение окна
glfwDestroyWindow(window); glfwDestroyWindow(window);
// Завершение работы с Vulkan
vulkan.destroy();
} }
else else
std::cout << "There is no Vulkan Supported\n"; std::cout << "There is no Vulkan Supported\n";
@ -36,3 +46,8 @@ int main(int argc, char* argv[]) {
return 0; return 0;
} }

51
src/vk.cpp Normal file
View File

@ -0,0 +1,51 @@
#include "vk.h"
#include <iostream>
#include <vector>
#include <stdexcept>
void Vulkan::init()
{
createInstance();
}
void Vulkan::destroy()
{
vkDestroyInstance(instance, nullptr);
}
void Vulkan::createInstance()
{
// Структура с данными о приложении
VkApplicationInfo appInfo{};
appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
appInfo.pApplicationName = "Vulkan Notes";
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;
// Расширения для glfw
uint32_t glfwExtensionCount = 0;
const char** glfwExtensions;
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
// Инициализируем вектор расширений тем, что требуется для glfw
std::vector<const char*> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
// Подключение других расширений
// extensions.push_back(ИМЯ_РАСШИРЕНИЯ);
// Запишем данные об используемых расширениях в структуру
createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
createInfo.ppEnabledExtensionNames = extensions.data();
VkResult result = vkCreateInstance(&createInfo, nullptr, &instance);
if (result != VK_SUCCESS) {
throw std::runtime_error("Instance create error");
}
}