Лучшая практика для единого буфера в Вулкане - PullRequest
0 голосов
/ 28 мая 2018

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

(Предположим, что мой GPU является дискретным без разделяемой памяти между CPU и GPU)

Теперь мои вопросы:

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

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

1 Ответ

0 голосов
/ 28 мая 2018

Я удивлен, что у вас есть устройство без кучи HOST_VISIBLE, в котором могут быть расположены единообразные буферы. Использование ЦП для записи в тот же буфер, из которого считывает графический процессор, часто является наилучшим путем, и я подумал, что все современные графические процессоры поддерживаютсячто.

Но если вам действительно нужна копия host-> device, то вы хотите убедиться, что копии начнутся достаточно рано, чтобы они были готовы к тому времени, когда графический конвейер будет готов их использовать, ииспользуйте очередь передачи только для копирования.Это будет перекрывать копию с другими более ранними работами, поэтому графический конвейер никогда не будет бездействовать, ожидая его.Для этого:

  1. Запишите униформу для кадра в буфер хоста.
  2. Отправьте буфер команд с командами копирования host-> device в очередь передачи и поместитеVkSemaphore in VkSubmitInfo::pSignalSemaphores.
  3. Завершите любую оставшуюся работу для буферов команд рендеринга кадров и отправьте их в графическую очередь с более ранним семафором в списке VkSubmitInfo::pWaitSemaphores.К сожалению, поскольку некоторые из форм, вероятно, необходимы в вершинном шейдере, *pWaitDstStageMask должно быть VK_PIPELINE_STAGE_VERTEX_SHADER_BIT.

Если вы ограничены графическим процессором, надеюсь, что передача для кадра N +1 происходит, когда графический конвейер все еще работает с кадром N. Вам может понадобиться такой инструмент, как GPUView или Radeon Graphics Profiler, чтобы проверить, правильно ли это происходит.

...