Создание логического устройства

This commit is contained in:
parent f53f481f78
commit 4e2c94a600
2 changed files with 36 additions and 0 deletions

View File

@ -14,6 +14,8 @@ class Vulkan
private: private:
VkInstance instance; // Экземпляр Vulkan VkInstance instance; // Экземпляр Vulkan
PhysicalDevice physicalDevice; // Физическое устройство PhysicalDevice physicalDevice; // Физическое устройство
VkDevice logicalDevice; // логическое устройство
VkQueue graphicalQueue; // очередь для работы с графикой
// Структура для хранения флагов // Структура для хранения флагов
struct struct
{ {
@ -23,6 +25,7 @@ class Vulkan
void createInstance(); // Создание экземпяра Vulkan void createInstance(); // Создание экземпяра Vulkan
void selectPhysicalDevice(); // Выбор физического устройства void selectPhysicalDevice(); // Выбор физического устройства
void createLogicalDevice(); // Создание логического устройства
}; };
#endif // VK_H #endif // VK_H

View File

@ -9,11 +9,13 @@ void Vulkan::init()
{ {
createInstance(); // Создание экземпяра createInstance(); // Создание экземпяра
selectPhysicalDevice(); // Выбор физического устройства selectPhysicalDevice(); // Выбор физического устройства
createLogicalDevice(); // Создание физического устройства
} }
// завершение работы // завершение работы
void Vulkan::destroy() void Vulkan::destroy()
{ {
vkDestroyDevice(logicalDevice, nullptr); // Уничтожение логического устройства
vkDestroyInstance(instance, nullptr); // Уничтожение экземпляра Vulkan vkDestroyInstance(instance, nullptr); // Уничтожение экземпляра Vulkan
} }
@ -173,3 +175,34 @@ void Vulkan::selectPhysicalDevice()
throw std::runtime_error("failed to find a suitable GPU!"); 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);
}