CG & C++ blog
57 subscribers
13 photos
2 files
129 links
Краткий обзор публикаций, презентаций, докладов по графике и C++
Download Telegram
(playlist) Arm Mali GPU Training Series
В видео собрано много полезного для разработки под Mali GPU.
От расчета тепловыделения и особенностей разных поколений ГП до рекомендаций по оптимизации контента.
#tbdr #mali
Authoring Efficient Shaders for Optimal Mobile Performance
1..8 - описание дебагера и профайлера под Mali GPU и офлайн профайлера шейдеров.
9..16 - как разработчики игр используют тулзы от ARM для оптимизации.
17..19 - детали Valhall архитектуры
20.. - пример оптимизации шейдера
#mali #gpu_opt
Advanced Shading Techniques with Pixel Local Storage
Примеры использования внутренней памяти тайла (tile/pixel local storage).
Поддерживается на OpenGLES с Mali GPU, а так же на Metal с Apple GPU.
На Adreno используется другое расширение, только для сложного блендинга.
Поддержка TLS/PLS на Vulkan добавленна только в новых версиях API и только в новых девайсах из-за невозможности обновления графических драйверов.
#cg #gl #vk #OIT #mali
Memory limits with Vulkan on Mali GPUs
Пишут, что память для хранения вершин ограничена в 180Мб, превышение приводит к ошибке, даже если API используется корректно.
Это связано с тайловым рендером, когда вершины сначала трансформируются, потом выгружаются в память и используются частями для каждого тайла. Чем больше вершин, тем больше нагрузка на шину памяти и больше тепловыделение.
Размер памяти никак не зависит от формата вершин, так как хранится только позиция и дополнительная информация, это умещается в 64 байта на вершину.
Лимит относится к смартфонам 2019 года и скорее всего будет постепенно повышаться.

По этой причине техники типа Nanite не будут так эффективно работать на тайловой архитектуре (TBDR), это относится и к теселляции и к меш шейдерам. Обойти ограничения можно только генерацией примитивов внутри тайла, но пока такие техники не появились, остаются старые техники типа relief mapping.
#vk #mali
ARM Valhalla 5gen
Самое интересное это Deferred Vertex Shading.

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

С DVS тайлер может выбирать какой треугольник сразу отправить на рисование, а какой сохранить в список (в глобальной памяти) для отложеной растеризации.
Маленькие треугольники рисуются сразу, а большие откладываются, так как требуется задействовать много тайлов, что также нагружает память.

Это еще один шаг в сторону меш шейдеров, которые из-за тайловой архитектуры не дают преимущества в производительности.
#mali
Deferred Vertex Shading. Как это может быть реализовано.

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

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

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

Получается расчет позиции для DVS треугольников происходит дважды, что может быть затратно если есть вершинная анимация.
#mali
Hidden Surface Removal in Immortalis-G925: The Fragment Prepass
(webarchive)

На этапе потайловой растеризации добавили еще один проход, который ищет единственный видимый пиксель, а остальные исключает.
Поиск прерывается, если встречается несовместимое состояние или шейдер, например прозрачность или discard.
В чем-то это повторяет идею Visibility Buffer, где для непрозрачной геометрии вызывается только один фрагментный шейдер на пиксель.

Как было до этого.

Early ZS. После растеризации треугольника он делится на квадраты 2х2 пикселя и Z-координата каждого квадрата сравнивается с буфером глубины.
Forward Pixel Kill. Параллельно с выполнением фрагментного шейдера идет растеризация новых треугольников, если новый треугольник перекрывает текущий, то выполнение фрагментного шейдера прерывается. Не работает для слишком маленьких треугольников.
Late ZS. В случае, если фрагментный шейдер меняет Z или stencil значения, то тест происходит после выполнения шейдера.
#mali