Выбор физического устройства

This commit is contained in:
parent afe5860125
commit 23b8cbd8b7
2 changed files with 51 additions and 2 deletions

View File

@ -11,6 +11,7 @@ class Vulkan
void destroy(); // завершение работы void destroy(); // завершение работы
private: private:
VkInstance instance; // Экземпляр Vulkan VkInstance instance; // Экземпляр Vulkan
VkPhysicalDevice physicalDevice; // Физическое устройство
// Структура для хранения флагов // Структура для хранения флагов
struct struct
{ {
@ -19,6 +20,7 @@ class Vulkan
void createInstance(); // Создание экземпяра Vulkan void createInstance(); // Создание экземпяра Vulkan
void selectPhysicalDevice(); // Выбор физического устройства
}; };
#endif // VK_H #endif // VK_H

View File

@ -7,7 +7,8 @@
// инициализация // инициализация
void Vulkan::init() void Vulkan::init()
{ {
createInstance(); // Создание экземпяра Vulkan createInstance(); // Создание экземпяра
selectPhysicalDevice(); // Выбор физического устройства
} }
// завершение работы // завершение работы
@ -115,4 +116,50 @@ void Vulkan::createInstance()
{ // Отправим исключение в случае ошибок создания экземпляра { // Отправим исключение в случае ошибок создания экземпляра
throw std::runtime_error("Instance create error"); throw std::runtime_error("Instance create error");
} }
} }
// Выбор физического устройства на основании требований
VkPhysicalDevice selectPhysicalDeviceByProperties(std::vector<VkPhysicalDevice> & 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<VkPhysicalDevice> devices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
// Выбор физического устройства на основании требований
physicalDevice = selectPhysicalDeviceByProperties(devices);
// Если не удалось выбрать подходящее требованием устройство - выдадим исключение
if (!physicalDevice)
{
throw std::runtime_error("failed to find a suitable GPU!");
}
}