From 4e2c94a600556526c4cfac01219aa4d0645ad27d Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 8 Feb 2022 13:17:33 +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=D0=BB=D0=BE=D0=B3=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 3 +++ src/vk.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/vk.h b/include/vk.h index 6de6cb7..a0304a6 100644 --- a/include/vk.h +++ b/include/vk.h @@ -14,6 +14,8 @@ class Vulkan private: VkInstance instance; // Экземпляр Vulkan PhysicalDevice physicalDevice; // Физическое устройство + VkDevice logicalDevice; // логическое устройство + VkQueue graphicalQueue; // очередь для работы с графикой // Структура для хранения флагов struct { @@ -23,6 +25,7 @@ class Vulkan void createInstance(); // Создание экземпяра Vulkan void selectPhysicalDevice(); // Выбор физического устройства + void createLogicalDevice(); // Создание логического устройства }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 90ec1b8..1b72a22 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -9,11 +9,13 @@ void Vulkan::init() { createInstance(); // Создание экземпяра selectPhysicalDevice(); // Выбор физического устройства + createLogicalDevice(); // Создание физического устройства } // завершение работы void Vulkan::destroy() { + vkDestroyDevice(logicalDevice, nullptr); // Уничтожение логического устройства vkDestroyInstance(instance, nullptr); // Уничтожение экземпляра Vulkan } @@ -173,3 +175,34 @@ void Vulkan::selectPhysicalDevice() throw std::runtime_error("failed to find a suitable GPU!"); } } + +void Vulkan::createLogicalDevice() +{ + // Приоритеты очередей + float priority[1] = {1}; + // Данные о необходимых очередях + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = physicalDevice.pickQueueFamily(VK_QUEUE_GRAPHICS_BIT); + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = priority; + + // Данные о создаваемом логическом устройстве + VkDeviceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + createInfo.pQueueCreateInfos = &queueCreateInfo; + createInfo.queueCreateInfoCount = 1; + createInfo.enabledExtensionCount = 0; + createInfo.enabledLayerCount = 0; + createInfo.pEnabledFeatures = nullptr;//&physicalDevice.features; + + // Создание логического устройства + if (vkCreateDevice(physicalDevice.device, &createInfo, nullptr, &logicalDevice) != VK_SUCCESS) + { + // Отправим исключение в случае ошибок создания лог. устройства + throw std::runtime_error("failed to create logical device!"); + } + + // Получим дескриптор очереди логического устройства + vkGetDeviceQueue(logicalDevice, queueCreateInfo.queueFamilyIndex, 0, &graphicalQueue); +}