Теоретизираю какой бы идеальный рендер граф я бы написал.
четверг, 14 июля 2022 г.
воскресенье, 15 мая 2022 г.
Как выбрать обертку над Vulkan
Написать качественную обертку над Vulkan совсем не просто, а учитывая количество расширений, особенностей драйверов и железа, то с первого раза это просто невозможно. Поэтому становится выбор либо потратить несколько лет на подробное изучение Vulkan и написание качественной обертки, которой сможет пользоваться кто-то незнакомый с Vulkan, либо найти уже готовую обертку. И тут оказывается, что не зная Vulkan найти хороший проект также нереально.
среда, 11 мая 2022 г.
Нужен ли рендер граф? Часть 1
Еще в 2018-ом я написал свой FrameGraph, который был моей первой попыткой упростить работу с Vulkan, за полгода активной разработки синхронизации и многопоточность были полностью переделаны 3 раза. В последней версии FG стал достаточно гибким, чтобы автоматически расставлять синхронизации внутри очереди, а с небольшими подсказками от пользователя мог расставлять синхронизации между очередями. Это отлично работает для прототипирования, но нужно ли для больших проектов?
понедельник, 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, но внутри они содержат много неэффективного кода.
пятница, 4 февраля 2022 г.
среда, 26 января 2022 г.
Vulkan device simulation layer
Не все знаю и умеют правильно использовать этот слой для тестирования движка на разных конфигах железа.
Главное - этот слой всего лишь меняет информацию, возвращаемую драйвером, на новую, определенную в json. Таким образом слой валидации сможет обнаружить ошибки в использовании констант и в работе с некогерентной памятью.
Детальное описание можно прочитать здесь.
понедельник, 6 июля 2020 г.
Профилирование шейдеров
воскресенье, 18 августа 2019 г.
Краткий обзор вулкан рендера в X4
Недавно вышел X4 Foundation, где только вулкан рендер. И реализация рендера оставляет желать лучшего.Даже рендердок не может долго дебажить, где-то портится память и все перестает работать. vktrace тоже не работает.
Выдает всего 30фпс в 4к даже в пустом космосе...
Недостатки:
- general layout для depth buffer
- барьер включают абсолютно все этапы (src = ALL_COMMANDS, dst = ALL_COMMANDS) и они даже не сгруппированы, то есть может подряд идти 2 таких барьера
- а еще у всех барьеров стоит флаг DEPENDENCY_BY_REGION, что не имеет смысла
- шейдеры с дебажной инфой и плохо оптимизированны
- очень много дескриптор сетов
- SSAO в полном разрешении, причем нужен только для кабины, где все статично, можно было запечь АО и сэкономить 3мс.
Краткий обзор вулкан рендера в UE4
vkAcquireNextImage вызывается в отдельном потоке и принимает fence, его ожидание происходит в потоке рендера, похоже это такой способ сделать двойную/тройную буферизацию.
- многопоточногого рендера нету.
- постоянно вызывается vkCmdResetQueryPool, хотя в пул записывается время, которое сбрасывать не требуется, а на трансфер очереди такое не будет работать.
- постоянно копируется время из пула в host-visible память, но я не знаю насколько это плохо, я бы все же сделал отложенное копирование.
- дескриптор сеты сбрасываются каждый кадр, что тратит время цпу и очень плохо для мобилок.
- очень много дескриптор пулов, что не рекомендуется делать, (366 пулов в демке с частицами)
- 5 сабмитов на кадр, причем все в конце кадра, это не очень хорошо, так как сабмиты тяжелые.
- для каждого сабмита создается фенс, который потом нигде не используется.
- много подряд идущих барьеров, неплохо было бы их сгруппировать.
- симуляция частиц идет в фрагментном шейдере, вот это интересно.
- пустой рендер пасс для очистки текстуры, как было в doom.
- есть dynamic offset для буферов, но смысла в них нет, так как дескриптор сет не переиспользуется.
Граф синхронизаций.
Сконвертированный из трейса код кадра.
Почему на мобилках не рекомендуют сбрасывать дескриптор пулы: pdf
понедельник, 29 апреля 2019 г.
Производительность некоторых операций на Vulkan
Исходники тестов тут: GenMipmaps, ClearImage
Теория тут: Framebuffer compression, Delta color compression
понедельник, 4 марта 2019 г.
Разбор движка в Doom (2016)
суббота, 2 февраля 2019 г.
Фичи и баги в Vulkan
5. Глючный андроид.
Никак не мог понять почему не создается инстанс на андроиде, выдает ошибку что слой валидации не поддерживается, но я не указал вообще ни одного слоя. Зато после перезагрузки телефона все запустилось.
понедельник, 14 января 2019 г.
Отладка шейдеров
среда, 9 января 2019 г.
FrameGraph. v0.6
четверг, 30 августа 2018 г.
FrameGraph. часть 2
Дополнительно дебагер обнаруживает возможные проблемы в при растановке барьеров, например ставятся подряд два барьера только на запись, это значит, что первый результат записи теряется, что скорее всего ошибка.