Выбор физического устройства
This commit is contained in:
parent
afe5860125
commit
23b8cbd8b7
|
@ -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
|
51
src/vk.cpp
51
src/vk.cpp
|
@ -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!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue