连续运行两个Dispatch()
调用时,如:
m_computeCommandList->Dispatch(111, 1, 1);
m_computeCommandList->Dispatch(555, 1, 1);
是否保证第二个Dispatch()
将在GPU上的第一个Dispatch()
之后运行?或者,它们可以同时在GPU上运行吗?
只是为了澄清,在这两个Dispatch()
调用之间没有更多的c++代码。
与其他图形API一样,当您在CPU端执行命令调用时,它会导致将这些命令放入命令队列。它保证命令将按照队列的顺序处理,先进先出.
然而,在GPU上,一切都变得大量并行和并发。我们无法知道实际执行将被安排在哪个处理单元上,或者哪个Dispatch
中的哪些线程将提前完成。通常情况下,如果调用之间没有资源(缓冲区,纹理)共享,并且我们只需要同步帧的末尾,则这不是问题。
如果存在资源共享,则可能存在一些内存冲突("write-read", "write-write")或"read-write"。这里我们需要使用资源屏障来组织对这些资源的访问。使用不同的屏障选项可以实现不同Dispatch
调用的连续执行。
例如,从D3D12_RESOURCE_STATE_UNORDERED_ACCESS转换到D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE将等待所有前面的图形和计算着色器执行完成,并阻止所有后续的图形和计算着色器执行。
DirectX 12中增强的屏障允许您对资源和执行同步进行微调控制。