Если весь 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
несколько раз с одним диапазоном очистки вместо массива я не получаю сообщение об ошибке. Сброс нескольких поддиапазонов одного и того же буфера не является допустимым вариантом использования?
Это ложное сообщение об ошибке от слоя. Один вызов функции может безопасно ссылаться на один и тот же объект vulkan несколько раз. Более новые версии слоя проверки потока не сообщают об этом ложном конфликте. (Этот слой переименован в VK_LAYER_GOOGLE_threading в последних версиях.)
Других решений пока нет …