微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vulkan:UniformBuffer和StoreBuffer的同步

如何解决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 举报,一经查实,本站将立刻删除。