Vulkan:`vkFlushMappedMemoryRanges` 线程层错误?
Vulkan: `vkFlushMappedMemoryRanges` threading layer error?
如果整个 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。)
如果整个 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。)