2016-08-09 25 views
2

vkMapMemory状态:如何同步`vkMapMemory`?

vkMapMemory不检查设备内存是否是当前使用返回主机访问指针之前。应用程序必须保证写入该范围的任何先前提交的命令在主机读取或写入该范围之前完成,并且在主机写入该区域之前从该范围读取的任何先前提交的命令已完成

它链接到this site,这似乎还不存在。我想知道如何同步这个?

基本上我需要担心两件事情

  • 只有1线程访问相同范围的同时
  • GPU的当前没有尝试读取范围

的只有真正的方式,我看到与此同步与线程安全列表。每当你想写入/读取该缓冲区时,都必须添加当前正在读取或写入该线程安全列表的内存范围。

这意味着,当您想要访问该缓冲区时,您需要锁定该列表并搜索您尝试访问的范围。

是你如何同步vkMapMemory还是有其他方法可以做到这一点吗?

回答

3

gpu尝试访问映射内存的唯一时间是访问该内存的命令缓冲区已被提交。该内存将被使用,直到关联的vkFence已被发信号。

一个完全通用的解决方案是跟踪每个内存访问的GPU,并围绕每个CPU映射的内存访问与开始/结束对,将等待适当的围栏和调用冲洗/无效根据需要。这是很多状态跟踪和大量潜在的阻塞调用。

但是,对于持久性网格/纹理数据,您只需将内存写入到分段缓冲区,然后复制到设备本地非主机可见缓冲区。你不应该经常需要这样一个单一的围栏来跟踪它的副本是否在飞行中就足够了。或者对于仅需要存储单个帧的数据(每个对象转换),您可以使用环形缓冲区。回读GPU遮挡测试或计算结果,您可以使用环形缓冲区。

我希望你能看到新兴的模式。只需使用几个映射的环形缓冲区,并且非常清楚它们何时被gpu使用,然后您只需在每个环形缓冲区中保留一小块vkFence + offset + size以确保不会发生数据危险。