Чтобы передать свои статические данные в графический процессор, я думаю о том, чтобы иметь один промежуточный объект VkMemory (приблизительный размер 64 МБ) и использовать его как вращающуюся очередь. Однако у меня есть несколько потоков, создающих контент (например: рендеринг глифов, загрузка файлов, процедурный), и я бы хотел, чтобы они могли загружать свои данные полностью сами (т.е. писать плюс отправлять команды передачи Vulkan) .
Я намерен постоянно отображать всю промежуточную VkMemory (если это глупо, скажите так) по крайней мере во время загрузки (но, возможно, дольше, если я хочу передавать данные).
Для достижения вышеуказанного, как только данные потока будут полностью записаны / сброшены до промежуточной стадии, я бы хотел, чтобы он мог немедленно отправлять команды передачи графического процессора.
Однако это означает, что графический процессор будет читать из одной части VkMemory, в то время как другие потоки могут писать / сбрасывать в нее.
AFAIK мне также нужно будет использовать барьеры памяти изображений для перехода от VK_IMAGE_LAYOUT_PREINITIALIZED к VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.
Я не смог найти ничего в спецификации, в котором прямо говорилось бы, что это законно или незаконно, только нужно позаботиться о синхронизации. Однако я не нашел достаточно подробностей, чтобы быть уверенным так или иначе.
ПРИМЕЧАНИЕ. Промежуточная очередь должна гарантировать завершение передачи перед перезаписью чего-либо - я намерен сохранить дополнительную очередь VkFences для этого.
Вопросы:
- Это нормально?
- Нужно ли выравнивать каждый отдельный объект по границе страницы? Или что-то другое.
- Правильно ли я предполагаю, что барьер памяти изображений (см. Выше) не потребует от устройства записи в промежуточную память.