如果映射了整个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
,我就不会收到错误。刷新同一缓冲区的多个子范围不是一个有效的用例吗?
答案 0 :(得分:2)
这是来自图层的错误报告。单个函数调用可以安全地多次引用相同的vulkan对象。较新版本的线程检查图层不会报告该虚假冲突。 (在最近的版本中,该图层被重命名为VK_LAYER_GOOGLE_threading。)