Vulkan API — урок 9. Выбор физического устройства

После инициализации библиотеки Vulkan при помощи VkInstance, нам нужно найти и выбрать видеокарту, которая поддерживает нужный нам функционал. Вообще мы можем выбрать сколько угодно видеокарт и нагрузить их все, но в обозримом будущем до этого дело не дойдет.

Добавим функцию pickPhysicalDevice и вызовем её в функции initVulkan.

void initVulkan() {
    createInstance();
    setupDebugCallback();
    pickPhysicalDevice();
}

void pickPhysicalDevice() {

}

Выбранная видеокарта будет храниться в VkPhysicalDevice, который мы добавим в качестве нового члена класса. Этот объект будет косвенным образом удален при удалении VkInstance, на не нужно беспокоиться об этом и оборачивать в наш VDeleter.

VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;

Получение списка видеокарт аналогично расширениям, для начала находим количество карт:

uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);

Не забываем сделать проверку, вдруг в системе нет карт с поддержкой Vulkan’a:

if (deviceCount == 0) {
    throw std::runtime_error("failed to find GPUs with Vulkan support!");
}

Ну а далее создаем массив содержащий полный список VkPhysicalDevice:

std::vector<VkPhysicalDevice> devices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());

Теперь оценим каждое из устройств и проверим каждое из них на операции, что мы хотим выполнять, т.к. не все видеокарты одинаковы. Для всего этого создадим новую функцию:

bool isDeviceSuitable(VkPhysicalDevice device) {
    return true;
}

И добавим проверку с учетом результата этого метода:

for (const auto& device : devices) {
    if (isDeviceSuitable(device)) {
        physicalDevice = device;
        break;
    }
}

if (physicalDevice == VK_NULL_HANDLE) {
    throw std::runtime_error("failed to find a suitable GPU!");
}

В следующем уроке будем заполнять функцию isDeviceSuitable и в будущем будем наращивать список требований к устройству.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *