Bha*_*uja 5 directx graphics direct3d directx-11 directx-10
我正在实现一些功能,需要我实现一个 API 来等待 d3d10 完成渲染。基本上我正在尝试实现对共享纹理的同步访问,这样我就可以在 d3d10 成功呈现给后台缓冲区后更新纹理。通过调用这个黑盒 api,我认为这可以实现,我认为它类似于 glfinish()。我读过我们可以使用 ID3D10Query 查询来实现同步访问。
D3D10_QUERY_DESC queryDesc;
... // Fill out queryDesc structure
ID3D10Query * pQuery;
pDevice->CreateQuery( &queryDesc, &pQuery );
pQuery->Begin();
... // Issue graphis commands, do whatever
pQuery->End();
UINT64 queryData; // This data type is different depending on the query type
while( S_OK != pQuery->GetData( &queryData, sizeof( UINT64 ), 0 ) )
{
}
Run Code Online (Sandbox Code Playgroud)
我应该在开始和结束之间放置一些虚拟命令吗?因为我想将此功能公开为名为 waitforgraphiscompletion 的公共 API
这里的虚拟命令应该是什么?
如果您尝试在 OpenGL 中同步执行 CPU 和 GPU,您可以使用glFenceSync,然后使用glClientWaitSync。Direct 10 中的等效项是ID3D10Asynchronous::End、 和ID3D10Asynchronous::GetData(请注意,在 DX11 中,接口略有不同)。这些让您知道 GPU 何时完成将命令缓冲区处理到特定点。这使您可以知道先前对资源的读/写操作何时完成,并且 CPU 可以安全地访问该资源,而无需额外的同步。
您不需要在 while 循环中放置任何命令。命令缓冲区最终将处理您的查询,并返回 S_OK(或您可能想要处理的错误消息)。然而,这有点浪费,因为 CPU 只会旋转等待 GPU,所以如果可能的话,您应该在循环中做一些额外的有用工作。
请注意,如果您用作D3D10_ASYNC_GETDATA_DONOTFLUSH最终参数GetData(而不是“0”),则不会出现上述情况 - 不能保证命令缓冲区会“自动”启动,并且您可能会陷入无限循环(因此,这不是推荐的用法)。