假定一个单线程应用程序。如果您两次致电ExecuteCommandLists
( A 和 B )。在从 B 启动任何命令之前,是否保证 A 能够在GPU上执行其所有命令?我在文档中可以找到的最接近的内容是,但这似乎并不能真正保证 A 在 B 开始之前完成:
应用程序可以将命令列表从多个线程提交到任何命令队列。运行时将按照提交顺序执行序列化这些请求的工作。
作为一个比较点,我知道在Vulkan中没有明确保证这是不:
vkQueueSubmit是一个队列提交命令,每个批处理都由pSubmits的一个元素定义为VkSubmitInfo结构的一个实例。批处理按照它们在pSubmit中出现的顺序开始执行,但可能会无序完成。
但是,我不确定DX12是否以相同的方式工作。
命令列表从第一个数组元素开始按顺序执行
但是,在这种情况下,他谈论的是使用两个命令列表( C 和 D )一次调用ExecuteCommandLists
。这些操作与两个单独的呼叫相同吗?我的同事认为,这仍然只能保证按顺序启动它们,而不能保证 C 在 D 开始之前完成。
我缺少的地方还有更清晰的文档吗?
答案 0 :(得分:1)
我在Direct X论坛中问了同样的问题,这是Microsoft工程师Jesse Natalie的回答:
两次调用ExecuteCommandLists可确保第一个工作负载 (A)在第二个工作负载(B)之前完成。呼唤 带有两个命令列表的ExecuteCommandLists允许驱动程序合并 这两个命令列表,以便第二个命令列表(D)可以开始 在第一个(C)的所有工作完成之前执行工作。
具体来说,允许应用程序插入围栏信号或 在A和B之间等待,驱动程序对此没有可见性,因此 驾驶员必须确保A中的所有内容都已完成 围栏操作。一次致电就没有这样的机会。 API,因此驱动程序可以优化该方案。
答案 1 :(得分:0)
最后,ID3D12CommandQueue 是一个先进先出队列,用于存储提交给 GPU 的命令列表的正确顺序。只有当一个命令列表在 GPU 上执行完毕后,驱动程序才会提交队列中的下一个命令列表。
https://docs.microsoft.com/en-us/windows/win32/direct3d12/porting-from-direct3d-11-to-direct3d-12
我最初的回答是否定的,但后来意识到添加多个命令列表提交只会弄乱我的上传缓冲区的顺序。