实施 API 以等待 d3d10 命令完成
Implement API to wait for d3d10 commands to finish
我正在实现一些功能,这需要我实现 API 以等待 d3d10 完成 rendering.Basically 我正在尝试实现对共享纹理的同步访问,以便我可以更新纹理在 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 ) )
{
}
我应该在开始和结束之间放置一些虚拟命令吗?因为我想将此功能公开为 public API 名为 waitforgraphiscompletion
的东西
这里应该是什么虚拟命令?
如果您尝试在 OpenGL 中同步执行 CPU 和 GPU,您可以使用 glFenceSync to followed by a glClientWaitSync。 Direct 10 中的等效项是 ID3D10Asynchronous::End
和 ID3D10Asynchronous::GetData
(请注意,在 DX11 中,接口略有不同)。这些让您知道 GPU 何时完成对特定点的命令缓冲区的处理。这使您可以知道先前对资源的 read/write 操作何时完成,并且 CPU 可以安全地访问该资源而无需额外的同步。
您不需要在 while 循环中放置任何命令。命令缓冲区最终将处理您的查询,并将 return S_OK (或您可能想要处理的错误消息)。然而,这有点浪费,因为 CPU 只会自旋等待 GPU,所以如果可能的话,你应该在循环中做一些额外有用的工作。
请注意,如果您使用 D3D10_ASYNC_GETDATA_DONOTFLUSH
作为 GetData
的最终参数(而不是“0”),则上述情况不会发生 - 无法保证命令缓冲区会'automatically' 开始,你可能会陷入无限循环(因此不推荐使用)。
我正在实现一些功能,这需要我实现 API 以等待 d3d10 完成 rendering.Basically 我正在尝试实现对共享纹理的同步访问,以便我可以更新纹理在 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 ) )
{
}
我应该在开始和结束之间放置一些虚拟命令吗?因为我想将此功能公开为 public API 名为 waitforgraphiscompletion
的东西这里应该是什么虚拟命令?
如果您尝试在 OpenGL 中同步执行 CPU 和 GPU,您可以使用 glFenceSync to followed by a glClientWaitSync。 Direct 10 中的等效项是 ID3D10Asynchronous::End
和 ID3D10Asynchronous::GetData
(请注意,在 DX11 中,接口略有不同)。这些让您知道 GPU 何时完成对特定点的命令缓冲区的处理。这使您可以知道先前对资源的 read/write 操作何时完成,并且 CPU 可以安全地访问该资源而无需额外的同步。
您不需要在 while 循环中放置任何命令。命令缓冲区最终将处理您的查询,并将 return S_OK (或您可能想要处理的错误消息)。然而,这有点浪费,因为 CPU 只会自旋等待 GPU,所以如果可能的话,你应该在循环中做一些额外有用的工作。
请注意,如果您使用 D3D10_ASYNC_GETDATA_DONOTFLUSH
作为 GetData
的最终参数(而不是“0”),则上述情况不会发生 - 无法保证命令缓冲区会'automatically' 开始,你可能会陷入无限循环(因此不推荐使用)。