Vulkan API — урок 10. Минимальные проверки видеокарты

Для оценки устройства запросим несколько детали. Базовые параметры устройства, на подобии его имени, типа и поддерживаемой версии Vulkan’a можно получить используя vkGetPhysicalDeviceProperties.

VkPhysicalDeviceProperties deviceProperties;
vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);

Проверка опциональных фичь, на подобии компресии текстур, 64 bit floats и рендеринга нескольких окон (используется в VR), запрашивается через vkGetPhysicalDeviceFeatures:

VkPhysicalDeviceFeatures deviceFeatures;
vkGetPhysicalDeviceFeatures(physicalDevice, &deviceFeatures);

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

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

bool isDeviceSuitable(VkPhysicalDevice device) {
    VkPhysicalDeviceProperties deviceProperties;
    VkPhysicalDeviceFeatures deviceFeatures;
    vkGetPhysicalDeviceProperties(device, &deviceProperties);
    vkGetPhysicalDeviceFeatures(device, &deviceFeatures);

    return deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU &&
           deviceFeatures.geometryShader;
}

В данном случае мы выбираем первую попавшуюся карту, которая подходи под условие. Но в принципе можно устроить некоторую проверку, какая из видеокарт более подходящая для того или иного действия, предлагаю простейший пример определения наилучшей видеокарты в системе:

#include <map>





...

void pickPhysicalDevice() {
    ...

    // Use an ordered map to automatically sort candidates by increasing score
    std::map<int, VkPhysicalDevice> candidates;

    for (const auto& device : devices) {
        int score = rateDeviceSuitability(device);
        candidates[score] = device;
    }

    // Check if the best candidate is suitable at all
    if (candidates.begin()->first > 0) {
        physicalDevice = candidates.begin()->second;
    } else {
        throw std::runtime_error("failed to find a suitable GPU!");
    }
}

int rateDeviceSuitability(VkPhysicalDevice device) {
    ...

    int score = 0;

    // Discrete GPUs have a significant performance advantage
    if (deviceProperties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) {
        score += 1000;
    }

    // Maximum possible size of textures affects graphics quality
    score += deviceProperties.limits.maxImageDimension2D;

    // Application can't function without geometry shaders
    if (!deviceFeatures.geometryShader) {
        return 0;
    }

    return score;
}

 

 

 

В нем мы в простейшем виде подсчитываем очки производительности, но всегда можно добавить любые дополнительные проверки и условия добавления очков, решайте сами что в лично Вашей программе имеет наибольшее значение. Данный пример не обязательно добавлять в общий код базовых уроков, он тут будет неуместен.

Далее мы рассмотрим Семейства очередей.

Main Admin

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

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