Как записать в образ непосредственно процессором при загрузке его в Vulkan? - PullRequest
0 голосов
/ 15 января 2019

В Direct3D12 вы можете использовать «ID3D12Resource :: WriteToSubresource» для включения оптимизации нулевого копирования для адаптеров UMA.

Что является эквивалентом "ID3D12Resource :: WriteToSubresource" в Vulkan?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Итак, из ID3D12Resource::WriteToSubresource документа, который я прочитал, он выполняет одну копию с разбросанным маркететезом сверху.

Vulkan - это явный API, который действительно позволяет вам сделать одну копию в UMA (или в любом другом). Это даже позволяет вам делать настоящее нулевое копирование, если вы придерживаетесь линейного тайлинга.

UMA может выглядеть так: https://vulkan.gpuinfo.org/displayreport.php?id=4919#memorytypes То есть имеет только одну кучу, и тип памяти - DEVICE_LOCAL и HOST_VISIBLE.

Итак, если вы создаете линейно-мозаичное изображение \ буфер в Vulkan, vkMapMemory его память и затем выводите свои данные непосредственно в этот сопоставленный указатель, то у вас есть (реальная) нулевая копия.

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

Теперь есть оптимальные мозаичные изображения. Оптимальное разбиение на листы непрозрачно в Vulkan (пока) и зависит от реализации, поэтому вы даже не знаете схему адресации без некоторого реверс-инжиниринга. Вообще говоря, вы хотите использовать оптимальные мозаичные изображения, потому что предположительно доступ к ним имеет лучшие характеристики производительности (по крайней мере, в обычных ситуациях).

Вот тут и приходит одна копия. Вы берете свое линейно мозаичное изображение (или буфер) и vkCmdCopy* его в оптимально мозаичное изображение. Эта копия выполняется Device \ GPU со всеми его прибамбасами, потенциально быстрее, чем CPU, то есть то, что я подозреваю, они назвали бы «почти нулевой копией».

0 голосов
/ 15 января 2019

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

У Вулкана нет способа сделать это. Вы можете писать напрямую в резервное хранилище для линейных изображений (в общем макете), но не для плиточных. Для этого вы должны использовать правильную команду передачи, даже на архитектурах UMA. Это означает создание буфера команд и отправку в очередь с возможностью передачи, так как Vulkan не имеет таких немедленных команд копирования.

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

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

...