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 仍然是项目的不错选择。
正在尝试理解命令列表。 好吧,命令列表记录了我的渲染命令,还绑定了资源,比如说一个带有顶点数据的缓冲区。
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 仍然是项目的不错选择。