Vulkan API — урок 14. Поиск Presentation очереди

Сразу хочу извиниться, за то что не смог перевести это слово, а точнее подобрать правильный перевод. «Presentation» в данном контексте стоит понимать как «представление», «показ». Но эти слова будут не очень красиво и литературно смотреться, так что уж извиняйте, стараюсь больше передать смысл.

Ну а само создание Presentation будет разбито на два коротких урока – поиск и создание соответствующей очереди.

Запрос на поддержку показа

Хотя реализация Vulkan’a поддерживает интеграцию оконной системы, это еще не значит, что каждое устройство поддерживает это. Поэтому при помощи метода isDeviceSuitable нам необходимо убедиться, что устройство сможет показывать (представлять) изображение на созданной нами поверхности. Поскольку представление является функцией определенной очереди, то проблема по сути в поиске необходимого семейства, поддерживающего показ.

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

struct QueueFamilyIndices {
    int graphicsFamily = -1;
    int presentFamily = -1;

    bool isComplete() {
        return graphicsFamily >= 0 && presentFamily >= 0;
    }
};

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

VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);

Как не сложно догадаться, добавляем его в том же цикле, что и  VK_QUEUE_GRAPHICS_BIT, и если находим подходящее семейство – присваиваем соответствующий индекс presentFamily:

if (queueFamily.queueCount > 0 && presentSupport) {
    indices.presentFamily = i;
}

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

Main Admin

2 Comments

  1. Здравствуйте. На данном этапе у меня происходит ошибка. Как я понял, функция vkGetPhysicalDeviceSurfaceSupportKHR не может найти поддерживаемое устройство, хотя видеокарта поддерживает vulkan. Что можно сделать в данной ситуации ?

    • Кроме того, что видеокарта долждна поддерживать Вулкан, так еще и драйвера должны быть установлены поддерживающие его. К примеру у меня есть нетбук с АМд А-5000 на борту, на винду есть более-менее свежий драйвер с поддержкой Вулкана, на Юникс-подобные системы драйвера нет. Так что связка операционка+драйвер+видеокарта должны поддерживать (так же как и с любым другим API).

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

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