DX12引入了管道的新功能,称为“捆绑”。似乎可以优化命令列表,并将其发送到最终管道。 Vulkan发明了一些不同的管道:图形管道和计算管道。图形流水线看起来与原始流水线相同,计算流水线用作图像内存的访问器。

我的CG知识很基础,无法确认认知是正确的。有人可以为它提供一些解释-它们之间管道的主要区别吗?

参考文献:


https://msdn.microsoft.com/zh -cn / library / mt617309
https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#pipelines


#1 楼

D3D12具有4种不同的命令列表:直接,捆绑,计算和复制。

Vulkan具有相似的概念,但是它们以不同的方式发生。命令缓冲区是从命令池中分配的。命令池直接与队列族相关联。从池分配的命令缓冲区只能提交给为其构建池的队列系列。

队列系列指定队列可以执行的操作类型:图形,计算或内存复制操作。 D3D12的命令队列具有类似的概念,但是D3D12的命令列表API可以指定列表类型。 Vulkan的信息是从池旨在用于的队列系列中获取的。

D3D12“捆绑”命令列表类型在表面上似乎与Vulkan辅助命令缓冲区相似。但是,它们是完全不同的。

原理上的区别是:捆绑包从其执行的直接命令列表中继承所有状态,但绑定的PSO本身除外。这包括资源描述符绑定。

Vulkan辅助命令缓冲区不从其主命令缓冲区执行环境继承任何状态,除了在renderpass实例(和查询)的子通道中执行的辅助CB之外。而且那些仅继承当前子通过状态(和查询)。

,这意味着与D3D捆绑包相比,您对它们执行不同的操作。

捆绑包有时用于修改描述符表和渲染内容,假设它们在其中执行的直接命令列表将建立这些表。因此,包有点像轻量级的OpenGL显示列表,只是没有那些做的所有坏事。因此,使用捆绑软件的目的是只构建一次并保留它们。它们应该是小东西。

Vulkan辅助CB对于线程构建用于单个渲染通道实例的命令至关重要。这是因为只能在主CB中创建渲染通道实例,因此为了最佳利用线程,需要有一种方法来创建旨在在不同线程的同一子通道中执行的命令。这是辅助CB的主要用例之一。因此,目的是您可能会在每个框架上构建辅助CB(尽管您可以根据需要重用它们)。

最后,捆绑包和辅助CB旨在解决单独的问题。捆绑包通常取决于执行环境,而辅助CB则更独立。

同时,Vulkan辅助CB可以做捆绑不能做的事情:它们可以在仅计算/复制队列上执行。由于Vulkan在命令缓冲区的主要/辅助级别和可发送CB的队列之间进行了区分,因此在Vulkan中可能具有在计算或仅复制队列上执行的辅助命令缓冲区。

Direct3D 12无法使用捆绑软件做到这一点。 ExecuteBundle函数只能在直接命令列表上调用。因此,仅复制的命令列表无法执行捆绑软件。

已获准,因为Vulkan不会在二级CB之间继承除子传递状态以外的任何内容,并且计算/复制操作不使用渲染传递,因此没有将这样的命令放在辅助CB中而不是主要CB中并不会带来什么好处。


D3D12在计算管道和图形管道之间具有与Vulkan相同的分隔。但是,在发出命令时,D3D12只有一个管道绑定点,您可以将任何种类的管道绑定到该点。相比之下,Vulkan具有用于计算和图形管线的单独绑定点。当然,Vulkan没有它们不同的描述符绑定点,因此这两个管道可能会相互干扰。但是,如果仔细设计它们的资源使用情况,则可以在不干扰图形管道需求的情况下调用调度操作。

因此,总的来说,这里的管道体系结构没有真正的区别。

#2 楼

与流水线的主要区别在于DirectX12专注于多线程或根据对象的呈现状态尽可能高效地使用多核。

对于Vulkan来说,它们将将线程管理成不同类型的管道,计算和图形化。

如MSDN参考中所述,DirectX12正在利用PSO(管道状态对象)。通过事先准备流水线的命令,以这种方式进行优化。看来,DirectX12使用PSO来创建呈现状态的对象,以便更有效地更好地管理硬件状态的变化。

希望有帮助!

评论


$ \ begingroup $
您的意思是,DX12只有一个流水线,但是它经过了优化,包括具有多线程和多核的PSO进程。 Vulkan有2个管道,驻留在不同的线程上,每个线程都有自己的命令管理,但是只有2个线程?
$ \ endgroup $
–naive231
16-10-5在3:11

$ \ begingroup $
Vulkan是否正在使用线程系统? DX12是完全多线程的吗?
$ \ endgroup $
–PaulHK
16年11月1日在4:03

$ \ begingroup $
不确定DX12是否使用一个管道,可能值得查看DX12的文档以了解详细信息。
$ \ endgroup $
– JDavila
16年11月1日在19:48

$ \ begingroup $
@PaulHK,根据DX12的文章,情况就是这样。看起来,就像VUlkan也在使用多个线程一样:khronos.org/registry/vulkan/specs/1.0/xhtml/…
$ \ endgroup $
– JDavila
16年11月1日在19:52