2016-03-14 81 views
1

我正在使用顶点和像素着色器来执行基本操作,如顶点着色器中的矩阵乘法和使用像素着色器的纹理采样。我在下面的语句中想知道最后一条语句是否等待直到顶点和像素着色器操作被执行。ID3D11DeviceContext :: DrawIndexed方法是否等待顶点和像素着色器操作完成?

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? 
+0

你的问题既有趣又太宽泛。你有证据表明这种情况是并行发生的,而不是按顺序发生的?哪些视频芯片和驱动程序?这对你的项目有什么影响? –

+0

我在我的项目中没有任何问题,但是试图确保在DrawIndexed()调用返回后,所有像素操作都在GPU中执行的着色器中执行。换句话说,GPU是否有与CPU主机交互的方式来完成它。 (在文档中找不到关于此的任何信息)。试图断言在这个调用返回并且场景使用IDXGISwapChain :: Present方法呈现之后,每个像素的所有像素操作总是完成。 –

回答

2

在D3D,工作在其提交的顺序GPU上执行,但通常不与CPU同步。例如,在您的代码中,在CPU返回DrawIndexed时,GPU很可能还没有开始渲染。通常数以万计的命令一次“在飞行中”。在D3D11中,你通常不需要关心这种行为,事实上,在API中引入竞争条件是非常困难的。例如,当您致电Present时,GPU将自动刷新所有渲染,等待影响交换链的所有调用完成,并将正确的图像呈现给窗口。

总之 - 不,D3D在从Draw调用返回之前不会等待顶点/像素着色器操作完成,但通常您可以忽略此事实。

+0

当然,在Direct3D 12中,同步是明确的,因此应用程序编码人员必须插入栅栏并检查其状态,以确保销毁参考资源的安全性。 –

+0

感谢您的详细解释,它有帮助。 –