实现 API 以等待 d3d10 命令完成

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

这里的虚拟命令应该是什么?

Mue*_*ito 2

如果您尝试在 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”),则不会出现上述情况 - 不能保证命令缓冲区会“自动”启动,并且您可能会陷入无限循环(因此,这不是推荐的用法)。