如何解决Vulkan:UniformBuffer和StoreBuffer的同步
UniformBuffers和StoreBuffers在cpu端使用memcpy
更新。这些描述符类型的同步如何工作?使用memcpy是否意味着应用程序在继续下一条语句之前等待memcpy将数据上传到GPU?如果是这样,这是否意味着同步这些类型的缓冲区不需要障碍?
解决方法
同步对于任何内存资源都以相同的方式工作:某些罕见的例外情况是,如果您更改了内存,则需要依赖于内存来确保这些更改的可见性。同步系统不在乎是否用作UBO或其他任何形式。它关心源操作(主机)和目标操作(从某些着色器阶段读取)的性质。
对于host-to-device memory operations,您需要执行一种称为“域操作”的同步形式。幸运的是,vkQueueSubmit
会自动对在vkQueueSubmit
调用之前可见的所有主机写入执行域操作。因此,如果您将内容写入GPU可见的内存,然后调用vkQueueSubmit
(在同一线程中或通过CPU端线程间通信),那么该Submit调用中的任何命令(或以后的命令)都将看到这些值你写的。
假设您已使它们可见。对主机一致性存储器的写入始终对GPU可见,但是必须通过调用vkFlushMappedMemoryRanges
使对非一致性存储器的写入可见。
如果要与读取内存的GPU进程异步写入内存,则需要使用一个事件。您写入内存,使其在需要时可见,然后设置事件。从其中读取的GPU命令将使用VK_ACCESS_HOST_WRITE_BIT
作为源访问,并将VK_PIPELINE_STAGE_HOST_BIT
作为源阶段来等待事件。目的地访问权限和阶段取决于您计划从中读取内容的方式。
Vulkan对memcpy
一无所知。不管您如何修改内存;它只是在乎您是否遵守其规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。