У меня есть вычислительный шейдер, который создает буфер вершин и рисует косвенную структуру, которая затем используется для рисования некоторой геометрии.
Вычисляющий шейдер вызывается не для каждого кадра, а один раз для 5-10 кадров.Фактически, у меня есть дублированные вершины и я рисую косвенные буферы, поэтому, пока я рендерил геометрию с использованием VB1 и DI1, вычислительный шейдер может записывать в VB2 и DI2 и затем менять их местами, поэтому вызовы вычислений и рисования могут быть независимыми.У меня также есть 2 семейства очередей: все и только для вычислений.
Итак, я могу придумать 3 способа сделать это:
- Использовать только одну очередь для всего с
VK_SHARING_MODE_EXCLUSIVE
буферы - Используйте очередь только для вычислений для вычислительного шейдера и все для рисования с буферами
VK_SHARING_MODE_EXCLUSIVE
и передачи владения между очередями - Используйте очередь только для вычислений для вычислительного шейдера и выполняйте-все для рисования с помощью
VK_SHARING_MODE_CONCURRENT
буферов
Я хотел бы услышать ваши советы о том, какой вариант использовать и каковы их плюсы / минусы.У меня есть некоторые предположения по этому поводу, и я хочу знать, прав я или нет:
- Я думаю, что использование отдельного семейства, выделенного для вычислительных операций, может улучшить производительность
- Я думаю, что передача права собственностиЭто тяжелая операция, и ее стоит делать только один раз (например, при загрузке ресурса в память GPU), но не каждые 5-10 кадров
- Поэтому я думаю, что 3-й вариант будет лучшим выбором для меня