From 8887ee67fd8df99aa01266129f0bb8b3cf9c031b Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Fri, 4 Feb 2022 13:18:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=8D=D0=BA=D0=B7=D0=B5=D0=BC=D0=BF=D0=BB=D1=8F=D1=80?= =?UTF-8?q?=D0=B0=20Vulkan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 24 ++++++++++++++++++++++++ src/main.cpp | 19 +++++++++++++++++-- src/vk.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 include/vk.h create mode 100644 src/vk.cpp diff --git a/include/vk.h b/include/vk.h new file mode 100644 index 0000000..4b15484 --- /dev/null +++ b/include/vk.h @@ -0,0 +1,24 @@ +#ifndef VK_H +#define VK_H + +#include +#include + +class Vulkan +{ + public: + void init(); // инициализация + void destroy(); // завершение работы + private: + VkInstance instance; // Экземпляр Vulkan + // Структура для хранения флагов + struct + { + const bool VALIDATION = 1; // Использование слоев проверки + } states; + + + void createInstance(); // +}; + +#endif // VK_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index d341ba4..07e7fc1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,10 @@ -#include +#include "vk.h" -#include #include +void vkInit(); + int main(int argc, char* argv[]) { // Инициализация GLFW @@ -12,6 +13,9 @@ int main(int argc, char* argv[]) { // Проверка доступности Vulkan if (glfwVulkanSupported()) { + // объект класса-обертки Vulkan API + Vulkan vulkan; + // Отключим создание контекста 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); + // Инициализация Vulkan API + vulkan.init(); + // Жизненный цикл while(!glfwWindowShouldClose(window)) { // Обработка событий @@ -27,6 +34,9 @@ int main(int argc, char* argv[]) { // Уничтожение окна glfwDestroyWindow(window); + + // Завершение работы с Vulkan + vulkan.destroy(); } else std::cout << "There is no Vulkan Supported\n"; @@ -36,3 +46,8 @@ int main(int argc, char* argv[]) { return 0; } + + + + + diff --git a/src/vk.cpp b/src/vk.cpp new file mode 100644 index 0000000..d212dc2 --- /dev/null +++ b/src/vk.cpp @@ -0,0 +1,51 @@ +#include "vk.h" + +#include +#include +#include + +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 extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); + + // Подключение других расширений + // extensions.push_back(ИМЯ_РАСШИРЕНИЯ); + + // Запишем данные об используемых расширениях в структуру + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + + VkResult result = vkCreateInstance(&createInfo, nullptr, &instance); + if (result != VK_SUCCESS) { + throw std::runtime_error("Instance create error"); + } +} \ No newline at end of file