Можно ли читать BC текстуры сразу в память имеджа на UMA архитектурах, минуя копирование через vkCmdCopyBufferToImage?
v1c
Нельзя. В Metal вроде есть вариант вызвать OptimizeForGPUAccess, точное название не помню, и прям в памяти произойдет перестановка блоков.
Суть в том, что при копировании каждый вендор переставляет байты как захочет, вплость до группировки 4x R каналов, потом 4x G каналов и тд. Со сжатыми текстурами чуть проще так как там целые блоки, но они могут переехать далеко по памяти.
v1c
> Можно ли читать BC текстуры сразу в память имеджа на UMA архитектурах, минуя копирование через vkCmdCopyBufferToImage?
Ну можно миновать стейджинг буфер если поддерживается Host image copy:
https://registry.khronos.org/vulkan/specs/latest/man/html/vkCopyM… ImageEXT.html
/A\
Т. е. BC форматы в памяти GPU не хранятся в том же порядке как и на диске? Как это понимать "переехать далеко по памяти"?
HolyDel
Нет, тут всё равно копирование идёт.
Ребят у меня есть одна идея но так как я нуб в этом - нужна помощь с реализацией, я готов заплатить, проект вроде простой но в тоже время и сложный. Если кому интересно openxr vulkan напишите в личку
Сейчас проверил на integrated Intel UHD 6xx - можно загрузить текстуру как обычно, потом замапить память загруженной текстуры и записать образ на диск. При следующей загрузке ищем, есть ли GPU образ текстуры на диске - если да, то просто создаём пустую текстуру с нужным форматом и размерами и делаем fread() с диска прямо в память текстуры, сверху добавляем layout transition чтобы слои валидации не ругались. Работает :)
v1c
> Нет, тут всё равно копирование идёт.
Description
This extension allows applications to copy data between host memory and images on the host processor, without staging the data through a GPU-accessible buffer. This removes the need to allocate and manage the buffer and its associated memory. On some architectures it may also eliminate an extra copy operation. This extension additionally allows applications to copy data between images on the host.
Получаешь мемори маппед указатель на свой файл, через VkImportMemoryHostPointerInfoEXT создаешь VkMemory на этом указателе, далее копируешь из этой мемори в имэдж. Все. Ровно одно копирование.
НО! оно будет свизлить на ЦПУ, что может сожрать весь профит. Самое лучшее, если у тебя уже лежит картинка на диске пресвизленная для конкернтной железки (optimalTilingLayoutUUID)
v1c
> Работает :)
Кстати, так можно увидеть как именно засвизлилась текстура ))
Татарин
Если решишь все же пилить сам то вот очень простые и полезные примеры: https://github.com/KhronosGroup/OpenXR-Tutorials
В PTLAS надо сначала построить ускоряющую структуру через vkCmdBuildPartitionedAccelerationStructuresNV, дождаться завершения на ГПУ и только потом можно использовать ее в дескриптор сете, иначе падает в драйвере. Выглядит не очень удобно, раньше можно было пустую структуру забиндить как заглушку.
Не знаю будит ли такое в Вулкане.
Но в апреле 2025 для directx 12 нейрошейдеры сделают.
https://3dnews.ru/1119691/revolyutsiya-v-programmirovanii-grafiki… -uge-v-aprele
В новых драйверах (572.64.0) NV отключили VK_NV_partitioned_acceleration_structure и VK_NV_cluster_acceleration_structure на Turing.
На gpuinfo последняя рабочая версия 572.16.0.0.
/A\
Типа оно и не работало там и ошибочно репортило, что поддерживается, или они специально заблочили на старых картах, чтобы говенную пятую серию покупали?
HolyDel
Все работало, я запускал демки.
/A\
> Все работало, я запускал демки.
Раз не хотел покупать AMD, теперь будешь запускать когда это разрешит куртка.