同步(异步)计算引擎和3d引擎(又名3D引擎)之间的资源访问的最佳方法是什么?直接引擎)在D3D 12?
我在MSDN上找到了关于多引擎同步的这段落,但不是很详细。
当然,您可以使用栅栏来实现同步,但是这样就可以拆分两个引擎的命令列表,因为栅栏只在队列上运行。
根据文档,3d引擎和计算引擎共享相同的资源状态(只有复制引擎有自己的资源状态)。因此,如果您使用异步计算引擎向资源写入,然后使用3d引擎从资源中读取,那么是否有一种通过资源屏障实现同步的方法?
如果使用计算引擎提交资源屏障,我怀疑它是否有效,因为如果资源状态出错,3d引擎可能不会自动等待。如果使用3d引擎进行资源转换,也会出现相同的问题(当计算引擎仍在写入资源时,资源状态可能会发生更改)。
你必须使用分裂壁垒吗?您可以使用带有D3D12_RESOURCE_BARRIER_FLAG_BEGIN_ONLY标志的计算引擎和带有D3D12_RESOURCE_BARRIER_FLAG_END_ONLY标志的3d引擎。不幸的是,文档并没有说明是否可以跨引擎使用拆分障碍。如果直接引擎在计算引擎执行开始屏障之前执行结束屏障,会发生什么情况?
发布于 2019-12-02 18:28:21
我的理解是,资源障碍与同步完全无关。它们是关于内存排序的,这是一个相关但独立的问题。基本上,同步就是确保A发生在B之前。内存排序就是确保如果A发生了X,某人如何看到A发生的人也总是看到X,没有人会看到X,除非先看到A发生。
在Direct3D术语中,资源障碍是确保如果着色器A写入纹理X,则在着色器A之后运行的着色器B实际上可以看到着色器A写入纹理X的结果。另一方面,栅栏是关于确保着色器A在着色器B之前运行。
Direct3D资源障碍仅仅是说明您将以何种方式使用资源。您不能仅仅依靠一个资源屏障来自动为您执行必要的同步。你们所连接的部分似乎是一致的(强调我的):
https://computergraphics.stackexchange.com/questions/9391
复制相似问题