首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D3D12资源屏障可以用于计算引擎和3D引擎之间的同步吗?

D3D12资源屏障可以用于计算引擎和3D引擎之间的同步吗?
EN

Computer Graphics用户
提问于 2019-12-02 16:13:15
回答 1查看 756关注 0票数 3

同步(异步)计算引擎和3d引擎(又名3D引擎)之间的资源访问的最佳方法是什么?直接引擎)在D3D 12?

我在MSDN上找到了关于多引擎同步的段落,但不是很详细。

当然,您可以使用栅栏来实现同步,但是这样就可以拆分两个引擎的命令列表,因为栅栏只在队列上运行。

根据文档,3d引擎和计算引擎共享相同的资源状态(只有复制引擎有自己的资源状态)。因此,如果您使用异步计算引擎向资源写入,然后使用3d引擎从资源中读取,那么是否有一种通过资源屏障实现同步的方法?

如果使用计算引擎提交资源屏障,我怀疑它是否有效,因为如果资源状态出错,3d引擎可能不会自动等待。如果使用3d引擎进行资源转换,也会出现相同的问题(当计算引擎仍在写入资源时,资源状态可能会发生更改)。

你必须使用分裂壁垒吗?您可以使用带有D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY标志的计算引擎和带有D3D12_RESOURCE_BARRIER_FLAG_END_ONLY标志的3d引擎。不幸的是,文档并没有说明是否可以跨引擎使用拆分障碍。如果直接引擎在计算引擎执行开始屏障之前执行结束屏障,会发生什么情况?

EN

回答 1

Computer Graphics用户

回答已采纳

发布于 2019-12-02 18:28:21

我的理解是,资源障碍与同步完全无关。它们是关于内存排序的,这是一个相关但独立的问题。基本上,同步就是确保A发生在B之前。内存排序就是确保如果A发生了X,某人如何看到A发生的人也总是看到X,没有人会看到X,除非先看到A发生。

在Direct3D术语中,资源障碍是确保如果着色器A写入纹理X,则在着色器A之后运行的着色器B实际上可以看到着色器A写入纹理X的结果。另一方面,栅栏是关于确保着色器A在着色器B之前运行。

Direct3D资源障碍仅仅是说明您将以何种方式使用资源。您不能仅仅依靠一个资源屏障来自动为您执行必要的同步。你们所连接的部分似乎是一致的(强调我的):

  • 虽然在所有Compute和3D队列之间共享资源状态,但不允许在不同队列上同时写入资源。这里的“同时”意味着不同步,注意不同步的执行在某些硬件上是不可能的。适用下列规则。
    • 一次只有一个队列可以写入资源。
    • 多个队列可以从资源中读取,只要它们不读取写入器正在修改的字节(同时写入的字节会产生未定义的结果)。
    • 在另一个队列可以读取写入的字节或进行任何写入访问之前,必须在写入后使用栅栏进行同步。
票数 3
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/9391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档