DirectX 12 - 命令列表问题

DirectX 12 - Command list questions

正在尝试理解命令列表。 好吧,命令列表记录了我的渲染命令,还绑定了资源,比如说一个带有顶点数据的缓冲区。

m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);

这里记录顶点缓冲区的绑定。此时缓冲区发生了什么?如果我在记录后更改此顶点缓冲区的内容会发生什么?如果我在调用执行命令列表后更改此顶点缓冲区的内容并且 gpu 尚未完成,会发生什么情况?

我猜 ExecuteCommandList 是一个异步函数调用,对吗?它是一次执行所有绑定(数据传输到 gpu),还是一个一个地执行命令甚至所有绑定?命令列表是由驱动程序执行的,还是全部发送给gpu?

好吧,因为缺乏好的例子,我还有很多问题。如果你能回答其中的几个问题,我会很高兴。

对于 DirectX 12,同步完全由应用程序负责。您必须插入并检查栅栏,以确保 GPU 在修改缓冲区之前已完成处理。对于动态缓冲区,您需要自己进行 double/triple/n 缓冲。

当您调用 ExecuteCommandList 时,只是将其排队到 GPU。 GPU真正拾起然后完成它需要一些时间。

一定要检查DirectX Graphics Samples GitHub项目。那里的示例和 Mini Engine 演示是查找示例用法的好地方。

这种设计使 DirectX 12 非常强大,因为它使应用程序可以直接控制 Direct3D 11 运行时 'magic' 中的许多内容。也就是说,生成的 API 比 更难实际使用,除非您已经是一名足够优秀的图形工程师,可以编写 Direct3D 11 运行时。使用 Direct3D 11 API 仍然是项目的不错选择。