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); +}