在 DX12 中,多个 ExecuteCommandLists 调用提供什么排序保证?

Loc*_*yer 7 directx-12

假设一个单线程应用程序。如果您调用ExecuteCommandLists两次(AB)。在启动B的任何命令之前, A是否能保证在 GPU 上执行其所有命令?我在文档中可以找到的最接近的内容是这个,但它似乎并不能真正保证A在B开始之前完成:

应用程序可以从多个线程向任何命令队列提交命令列表。运行时将执行按提交顺序序列化这些请求的工作。

作为比较,我知道Vulkan 中显然无法保证这一点:

vkQueueSubmit 是一个队列提交命令,每个批次由 pSubmits 的一个元素定义为 VkSubmitInfo 结构的实例。批次按照它们在 pSubmits 中出现的顺序开始执行,但可能会乱序完成。

不过,我不确定 DX12 是否也能以同样的方式工作。

弗兰克卢纳的书说:

命令列表从第一个数组元素开始按顺序执行

然而,在这种情况下,他谈论的是使用ExecuteCommandLists两个命令列表(CD)调用一次。这些操作与两个单独的呼叫相同吗?我的同事认为这仍然只能保证它们按顺序启动,而不能保证C在D开始之前完成。

我缺少的地方有更清晰的文档吗?

Loc*_*yer 7

我在 Direct X 论坛上问了同样的问题,这是 Microsoft 工程师 Jesse Natalie 的回答:

调用 ExecuteCommandLists 两次可保证第一个工作负载 (A) 在第二个工作负载 (B) 之前完成。使用两个命令列表调用 ExecuteCommandLists 允许驱动程序合并两个命令列表,以便第二个命令列表 (D) 可以在第一个命令列表 (C) 的所有工作完成之前开始执行工作。

具体来说,允许应用程序在 A 和 B 之间插入栅栏信号或等待,而驱动程序对此没有可见性,因此驱动程序必须确保 A 中的所有内容在栅栏操作之前都已完成。在对 API 的单次调用中没有这样的机会,因此驱动程序可以优化该场景。

来源: http ://forums.directxtech.com/index.php?topic=5975.0