实现API以等待d3d10命令完成

时间:2016-07-29 23:37:40

标签: graphics directx directx-11 direct3d 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 ) )
  {
  }

我应该在开始和结束之间放一些虚拟命令吗?因为我想将此功能公开为名为waitforgraphiscompletion

的公共API

这里应该是一个虚拟命令?

1 个答案:

答案 0 :(得分:2)

如果您尝试在OpenGL中同步执行CPU和GPU,则可以使用glFenceSync后跟glClientWaitSync。 Direct 10中的等价物是ID3D10Asynchronous::EndID3D10Asynchronous::GetData(注意,在DX11中,接口略有不同)。这些让您知道GPU何时完成将命令缓冲区处理到特定点。这使您可以了解资源上的先前读/写操作何时完成,并且CPU可以安全地访问资源而无需额外同步。

您不需要在while循环中放置任何命令。命令缓冲区最终将处理您的查询,并将返回S_OK(或您可能想要处理的错误消息)。然而,这有点浪费,因为CPU只会等待GPU,所以如果可能的话,你应该在循环中做一些额外的有用工作。

注意,如果你使用D3D10_ASYNC_GETDATA_DONOTFLUSH作为GetData的最终参数(而不是'0'),则不会出现上述情况 - 无法保证命令缓冲区会自动“ “开始,你可能会陷入无限循环(因此不是推荐用法)。