Итак, из 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, то есть то, что я подозреваю, они назвали бы «почти нулевой копией».