Цикл, в котором мы будем выводить пустой экран, состоит из нескольких этапов:
• Запрос на следующий кадр цепочки обмена
• Ожидание обработки запроса
• Отправка соответствующего буфера команд
• Ожидание очереди команд
• Вывод изображения на экран
Второй пункт является ключевым для этого раздела, т.к. ожидание на обработку запроса выполняется посредством объекта ограждения.
Ограждение
Ограждение может быть использовано для проверки выполнения очереди команд. Для нас оно интересно не столько из-за вопросов производительности, сколько из-за того, что этот объект необходим для запроса к цепочке обмена.
Значением поля flags можно инициализировать начальное состояние как активное или неактивное. За обнуление состояния или ожидание переключения в активное отвечаю следующие функции:
Поскольку у нас нет ни фиксированного времени ожидания, ни семафоров, на заполним параметры timeout и semaphore значениями UINT64_MAX и VK_NULL_HANDLE соответственно.
Следующий оставленный "на потом" пункт - отправка буферов команд в очередь:
Как видно из структуры, у нас есть целый ряд опций, которые можно использовать для эффективного управления выводом прямо на GPU: отправленный на обработку буфер может как ожидать на сигналы извне, так и сам сигнализировать о завершении (посредством семафоров).
Если вы читаете это сообщение - поздравляю. Большая половина формальностей завершена и написанного кода достаточно для вывода пустого экрана средствами Vulkan API. Тем не менее, для вывода треугольника нам понадобится еще кое-какая часть внутренней инфраструктуры, такой как буферы данных, шейдеры и конвейер.