From 23b8cbd8b7180b0cd2d609a7b3f289fbc6a5cfbb Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Sun, 6 Feb 2022 17:22:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=8B=D0=B1=D0=BE=D1=80=20=D1=84=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 2 ++ src/vk.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/include/vk.h b/include/vk.h index d8d3881..5f9ad47 100644 --- a/include/vk.h +++ b/include/vk.h @@ -11,6 +11,7 @@ class Vulkan void destroy(); // завершение работы private: VkInstance instance; // Экземпляр Vulkan + VkPhysicalDevice physicalDevice; // Физическое устройство // Структура для хранения флагов struct { @@ -19,6 +20,7 @@ class Vulkan void createInstance(); // Создание экземпяра Vulkan + void selectPhysicalDevice(); // Выбор физического устройства }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index 1b75ad7..a173b77 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -7,7 +7,8 @@ // инициализация void Vulkan::init() { - createInstance(); // Создание экземпяра Vulkan + createInstance(); // Создание экземпяра + selectPhysicalDevice(); // Выбор физического устройства } // завершение работы @@ -115,4 +116,50 @@ void Vulkan::createInstance() { // Отправим исключение в случае ошибок создания экземпляра throw std::runtime_error("Instance create error"); } -} \ No newline at end of file +} + +// Выбор физического устройства на основании требований +VkPhysicalDevice selectPhysicalDeviceByProperties(std::vector & devices) +{ + VkPhysicalDeviceProperties properties; // Параметры конкретного устройства + VkPhysicalDeviceFeatures features; // Функции конкретного устройства + for (const auto& device : devices) + { + // Получаем данные + vkGetPhysicalDeviceProperties(device, &properties); + vkGetPhysicalDeviceFeatures(device, &features); + + // Производим оценку + if (features.geometryShader) + return device; + } + + return nullptr; +} + +// Выбор физического устройства +void Vulkan::selectPhysicalDevice() +{ + // Узнаем количество доступных устройств + uint32_t deviceCount = 0; + vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); + + // Проверка на отсутствие физических устройств + if (deviceCount == 0) + { + throw std::runtime_error("Unable to find physical devices"); + } + + // Создадим вектор нужного размера и заполним его данными + std::vector devices(deviceCount); + vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data()); + + // Выбор физического устройства на основании требований + physicalDevice = selectPhysicalDeviceByProperties(devices); + + // Если не удалось выбрать подходящее требованием устройство - выдадим исключение + if (!physicalDevice) + { + throw std::runtime_error("failed to find a suitable GPU!"); + } +}