Graphics 实现API以等待d3d10命令完成

Graphics 实现API以等待d3d10命令完成,graphics,directx,directx-11,direct3d,directx-10,Graphics,Directx,Directx 11,Direct3d,Directx 10,我正在实现一些功能,这需要我实现一个API来等待d3d10完成渲染。基本上,我正在尝试实现对共享纹理的同步访问,以便在d3d10成功呈现给backbuffer后更新纹理。通过调用这个黑盒api,我认为这是可以实现的,我认为它将类似于glfinish()。我已经读到,我们可以使用ID3D10Query查询来实现同步访问 D3D10_QUERY_DESC queryDesc; ... // Fill out queryDesc structure ID3D10Query * pQue

我正在实现一些功能,这需要我实现一个API来等待d3d10完成渲染。基本上,我正在尝试实现对共享纹理的同步访问,以便在d3d10成功呈现给backbuffer后更新纹理。通过调用这个黑盒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 ) )
  {
  }
我应该在开始和结束之间放置一些虚拟命令吗?因为我想将此功能公开为公共API,所以将其命名为waitforgraphiscompletion


这里的伪命令应该是什么?

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

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


注意,如果您使用
D3D10\u ASYNC\u GETDATA\u DONOTFLUSH
作为
GETDATA
的最终参数(而不是“0”),则情况并非如此-无法保证命令缓冲区将“自动”启动,并且您可能最终进入无限循环(因此,不推荐使用此用法).

谢谢这对我来说意义重大。我有一两个问题。glfinish与glFenceSync后跟glClientWaitSync有何不同?关于D3D10,这仅仅意味着我只需要在ID3D10Query上调用end(这意味着没有begin),它将等待所有命令在创建ID3D10Query的设备上执行?glFinish将等待所有OpenGL操作完成,包括写入帧缓冲区。glClientWaitSync不保证,它只保证在glFenceSync之前发出的任何GL命令都已完成。如果要同步对特定纹理的访问,通常不需要这样做,因为您应该知道何时从自己的渲染代码读取/写入纹理。