воскресенье, 15 мая 2022 г.

Как выбрать обертку над Vulkan

 Написать качественную обертку над Vulkan совсем не просто, а учитывая количество расширений, особенностей драйверов и железа, то с первого раза это просто невозможно. Поэтому становится выбор либо потратить несколько лет на подробное изучение Vulkan и написание качественной обертки, которой сможет пользоваться кто-то незнакомый с Vulkan, либо найти уже готовую обертку. И тут оказывается, что не зная Vulkan найти хороший проект также нереально.

среда, 11 мая 2022 г.

Нужен ли рендер граф? Часть 1

 Еще в 2018-ом я написал свой FrameGraph, который был моей первой попыткой упростить работу с Vulkan, за полгода активной разработки синхронизации и многопоточность были полностью переделаны 3 раза. В последней версии FG стал достаточно гибким, чтобы автоматически расставлять синхронизации внутри очереди, а с небольшими подсказками от пользователя мог расставлять синхронизации между очередями. Это отлично работает для прототипирования, но нужно ли для больших проектов?

пятница, 25 марта 2022 г.

Мини блог

Ради эксперимента завел канал в телеграм для обзоров статей, конференций и тд.
Тематика та же: C++, графика, vulkan.

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

понедельник, 21 февраля 2022 г.

Как делается поддержка множества конфигураций железа

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

В Metal было несколько подходов, сначала был feature set, а потом его заменили на GPU family с Common/iOS/Mac семействами. Common задает общие фичи для всех конфигураций железа. Часть параметров также требуется запрашивать в рантайме. Сейчас свежее железо типа M1 и A14 имеет почти идентичные характеристики, что сильно упрощает разработку.

В Vulkan огромное количество фич и разнообразные лимиты, даже есть сайт, где можно посмотреть все конфиги: gpuinfo, также добавили слой device_simulation_layer, который частично эмулирует другие девайсы и упрощает тестирование.

воскресенье, 20 февраля 2022 г.

Особенности рендер пассов

 Рендер пассы в Vulkan в основном нужны для оптимизации тайлового рендера в мобильных GPU (tile based deferred renderer), для этого в них используются сабпассы.

понедельник, 7 февраля 2022 г.

В чем проблема Vulkan on top of Metal

 MoltenVk и некоторые другие проекты предоставляют возможность использовать Vulkan API поверх Apple Metal API, но внутри они содержат много неэффективного кода.

суббота, 5 февраля 2022 г.

Volume render, часть 4. Облака

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

Нужно было сделать объемные облака для симулятора, то есть будет возможность подлетать к ним вплотную, смотреть на них с земли и из космоса, что сильно усложняет задачу.

среда, 26 января 2022 г.

Vulkan device simulation layer

 Не все знаю и умеют правильно использовать этот слой для тестирования движка на разных конфигах железа.

Главное - этот слой всего лишь меняет информацию, возвращаемую драйвером, на новую, определенную в json. Таким образом слой валидации сможет обнаружить ошибки в использовании констант и в работе с некогерентной памятью.

Детальное описание можно прочитать здесь.

Оптимизация очереди тасков

 Пришло время оптимизировать очередь тасков для job/task system.

В идеале алгоритм выглядит так:

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