Я удивлен, что у вас есть устройство без кучи HOST_VISIBLE, в котором могут быть расположены единообразные буферы. Использование ЦП для записи в тот же буфер, из которого считывает графический процессор, часто является наилучшим путем, и я подумал, что все современные графические процессоры поддерживаютсячто.
Но если вам действительно нужна копия host-> device, то вы хотите убедиться, что копии начнутся достаточно рано, чтобы они были готовы к тому времени, когда графический конвейер будет готов их использовать, ииспользуйте очередь передачи только для копирования.Это будет перекрывать копию с другими более ранними работами, поэтому графический конвейер никогда не будет бездействовать, ожидая его.Для этого:
- Запишите униформу для кадра в буфер хоста.
- Отправьте буфер команд с командами копирования host-> device в очередь передачи и поместите
VkSemaphore
in VkSubmitInfo::pSignalSemaphores
. - Завершите любую оставшуюся работу для буферов команд рендеринга кадров и отправьте их в графическую очередь с более ранним семафором в списке
VkSubmitInfo::pWaitSemaphores
.К сожалению, поскольку некоторые из форм, вероятно, необходимы в вершинном шейдере, *pWaitDstStageMask
должно быть VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
.
Если вы ограничены графическим процессором, надеюсь, что передача для кадра N +1 происходит, когда графический конвейер все еще работает с кадром N. Вам может понадобиться такой инструмент, как GPUView или Radeon Graphics Profiler, чтобы проверить, правильно ли это происходит.