ID3D11DeviceContext::DrawIndexed 方法是否等待顶点和像素着色器操作完成?

Does ID3D11DeviceContext::DrawIndexed method wait for vertex and pixel shader opertions to be completed?

我正在使用顶点和像素着色器执行基本操作,例如顶点着色器中的矩阵乘法和使用像素着色器的纹理采样。我想知道在下面的语句中,最后一个语句是否等到执行顶点和像素着色器操作。

deviceContext->VSSetShader(VS, NULL, 0);
deviceContext->PSSetShader(PS, NULL, 0);
deviceContext->PSSetSamplers(0, 1, &Sampler);
deviceContext->DrawIndexed(IndexCount, 0, 0); // Does it wait for pixel operations to be performed on all pixels?

在 D3D 中,工作按提交顺序在 GPU 上执行,但通常与 CPU 不同步。例如,在您的代码中,到 CPU 上的 DrawIndexed returns 时,GPU 很可能甚至还没有开始渲染。通常一次 "in flight" 会有数以万计的命令。不过在 D3D11 中,您通常不需要关心这种行为,事实上,在 API 中引入竞争条件是有意为之的。例如,当您调用 Present 时,GPU 将自动刷新所有渲染,等待影响交换链的所有调用完成,并将正确的图像呈现给 window.

总结 - 不,D3D 在从 Draw 调用返回之前不会等待 vertex/pixel 着色器操作完成,但通常您可以忽略这一事实。