Vulkan: ошибка потока потока `vkFlushMappedMemoryRanges`?

Если сопоставляется весь vkDeviceMemory (через vkMapMemory) и он не был выделен с помощью VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vkFlushMappedMemoryRanges необходимо выполнить после внесения любых изменений в буфер, чтобы устройство могло видеть записи (согласно документации).

Я изменяю только небольшие участки большого буфера и, таким образом, хочу очистить только затронутые области. Итак, я создаю несколько структур VkMappedMemoryRange с разными полями offset и size, но указывающими на одно и то же vkDeviceMemory. Все это работает так, как я ожидаю. Однако, если я включаю VK_LAYER_LUNARG_threading, я получаю сообщение об ошибке:

THREADING ERROR : object of type VkDeviceMemory is recursively used in thread 24812

Если вместо этого я просто вызову vkFlushMappedMemoryRanges несколько раз только с одним диапазоном сброса вместо массива, я не получу ошибку. Является ли очистка нескольких поддиапазонов одного и того же буфера недопустимым вариантом использования?


person MuertoExcobito    schedule 03.03.2016    source источник
comment
Вы используете несколько потоков?   -  person Nicol Bolas    schedule 04.03.2016
comment
@NicolBolas В приложении есть несколько потоков, но только один поток когда-либо вызывает методы Vulkan.   -  person MuertoExcobito    schedule 04.03.2016


Ответы (1)


Это ложный отчет об ошибке от слоя. Один вызов функции может безопасно ссылаться на один и тот же объект vulkan несколько раз. Более новые версии слоя проверки потока не сообщают об этом ложном конфликте. (В последних версиях этот слой переименован в VK_LAYER_GOOGLE_threading.)

person Mike Stroyan    schedule 14.03.2016