Suslik
> я тож думал о том, чтобы хранить при создании все ресурсы в некотором дефолтном
> состоянии и переводить их в нужный лейаут, грубо говоря, on demand.
У меня они переводятся в дефолтное состояние только в конце командного буфера.
Тут еще можно оптимизировать если накапливать статистику о первом и последнем лейауте и менять дефолтный в зависимости от этого.
Либо когда все командные буферы одного батча сформированы можно между ними вставить команд буфер, который сделает синхронизации между ними.
Но все это займет время, а прирост производительности минимальный.
> не вижу контроля, как определяется, в какой мип и леер происходит рендеринг.
Там можно передать ImageViewDesc, либо будет дефолтный view.
> такой код нереально ни поддерживать, ни расширять.
это ведь студенты писали)
> как бы ты организовал rendering loop для такой системы?
Если нужна прям максимальная производительность, то сделал бы один общий pipeline layout для всех шейдеров и обновлял только то, что необходимо.
Так как pipeline layout не меняется, то все descriptor set и push constants не будут сбрасываться при смене пайплайнов.
Но вообще сложно что-то предполагать, нужны тесты с замером производительности.
Где-то может быть проще иметь минимум дескрипторов и просто хранить все данные в одном UB + несколько текстур.
А где-то лучше будет работать вариант когда забиндены все сеты в разные индексы, а обновляются только пуш константы.
Suslik
> у тебя есть картинки с их frame graph? интересно посмотреть, как он выглядит.
Тут есть С++ код их кадра и простой граф, более сложный не потянул graphviz
https://github.com/azhirnov/vkTraceConverter/tree/dev/examples
Запилил пример как сделать простой дебагер шейдеров.
https://github.com/azhirnov/FrameGraph/tree/dev/samples/glsl_debugger
Можно повесить хуки на любые операторы, сейчас записывается только результат операторов = += -= и тд. Даже для шейдера из шейдертоя понадобилось максимум 0.5Мб, а я то в начале 1Гб выделил))
Suslik
> ни про менеджмент памяти.
Тут общие рекомендации по управлению памятью и немного про другие оптимизации.
https://gpuopen.com/presentation-porting-engine-to-vulkan-dx12/
Рендер Dota2 (source engine 2) выглядит более технологично, чем дум.
http://media.steampowered.com/apps/valve/2016/Dan_Ginsburg_Source… f_Lessons.pdf
/A\
> Рендер Dota2 (source engine 2) выглядит более технологично, чем дум.
серьезно ?
0r@ngE
> серьезно ?
Но они используют кучу secondary command buffers, update descriptor set with template и тд, в думе этого нет.
И эта презентация 2016 года.
/A\
> update descriptor set with template
не нашел этого в их доке
0r@ngE
> не нашел этого в их доке
Я пару месяцев назад с рендер доком смотрел.
Хотя update descritpor set with template вообще не сложно добавить)
Но вот как они кэшируют команд буферы и не ошибаются с синхронизациями намного интереснее.
Вот написал бы статейку, с примерами, цены б тебе не было.
0r@ngE
> Вот написал бы статейку, с примерами, цены б тебе не было.
О чем?
Те кто пишут на вулкане и так во многом разберутся.
А в том что посложнее надо самому разобрать все нюансы прежде чем статью писать.
/A\
> VulkanLoader - моя версия загрузчика функций вулкана, из плюсов:
https://github.com/zeux/volk
фреймграф не очень понятно какую проблему решает - минимизации числа барьеров? вроде как что в вулкане что в дх12 они про странное железо амд, а у остальных вендоров большая часть затычечная кроме случаев rt->tex и им подобных. у дайса вроде фреймграф был про экономию памяти на всякие firenforget рендер таргетах которые живут только внутри кадра? но могу что-то путать
kas
Я сначала использовал volk, уже не помню из-за чего решил написать свой, но это заняло пару часов и теперь меньше зависимостей.
Фреймграф нужен чтоб размещать барьеры максимально эффективно.
Оптимизация по памяти на вулкане еще проще, так как можно биндить разные рендер таргеты на одну и ту же память, просто нельзя одновременно ее использовать. В однопоточной версии я уже начал делать такую оптимизацию, но потом перешел на многопоточность и придется заново все продумывать, но загатовка под это есть, там в состояниях есть флаги invalidate before, clear before, invalidate after. Еще для мобилок можно использовать transient attachment чтоб память выделялась только в кэше.
Была идея использовать фреймграф для автоматизации сборки рендерпассов, но тогда нужно делать несколько вариантов шейдеров и желательно это автоматизировать.
/A\
> Фреймграф нужен чтоб размещать барьеры максимально эффективно.
я к тому - есть какаято инфа о немеряном оверхеде барьеров? просто проблема памяти реальная, а эта - выглядит немного искуственной
/A\
> уже не помню из-за чего решил написать свой
Это NIH синдром, это нормально. Хотя я сам юзаю Volk и очень доволен. Тем более что Арсений вполне отзывчив и легко идет навстречу.
Тема в архиве.