2016-07-29 7 views
4

d3d10がレンダリングを終了するのを待つAPIを実装する必要がある機能を実装しています。 d3d10の後のテクスチャはバックバッファにうまく提示できます。このブラックボックスAPIを呼び出すことで、これは達成できると思うし、glfinish()のようなものになると思う。私は同期アクセスを実装するためにID3D10Queryクエリを使うことができると読んだ。d3d10コマンドが完了するのを待つAPIを実装する

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という名前のものを

ここではダミーコマンドにする必要がありますか?

答えて

2

実行CPUとGPUをOpenGLで同期しようとする場合は、glFenceSyncの後にglClientWaitSyncを続けます。 Direct 10の等価物はID3D10Asynchronous::EndID3D10Asynchronous::GetDataです(DX11ではインターフェイスが少し異なります)。これらは、GPUがコマンドバッファの特定のポイントの処理を終了したときに通知します。これにより、リソースに対する以前の読み取り/書き込み操作がいつ完了したかを知ることができ、CPUは追加同期なしでリソースに安全にアクセスできます。

whileループにコマンドを入力する必要はありません。コマンドバッファは最終的にクエリを処理し、S_OK(または処理したいエラーメッセージ)を返します。しかし、これはCPUがGPUを待っているだけなので、多少無駄です。可能であれば、ループ内で余分な作業をする必要があります。

D3D10_ASYNC_GETDATA_DONOTFLUSHを最後のパラメータとしてGetData( '0'ではなく)に使用した場合、上記の場合は該当しません。コマンドバッファが自動的に開始される保証はありません。無限ループに終わってしまいます(推奨されていません)。

+0

これは私にとって完璧な意味合いです。私はそれについて1つまたは2つの質問があります。 glFishSyncとglClientWaitSyncの違いは何ですか? D3D10に関しては、ID3D10Queryの終了を呼び出す必要があるだけです(つまり、開始を意味しません)、ID3D10Queryが作成されたデバイスですべてのコマンドが実行されるのを待ちますか? –

+0

glFinishは、フレームバッファへの書き込みを含む、すべてのOpenGL操作が完了するのを待ちます。 glClientWaitSyncはそれを保証せず、glFenceSyncが完了する前に発行されたGLコマンドのみを保証します。これは通常、特定のテクスチャへのアクセスを同期しようとする場合には必要ありません。なぜなら、自分自身のレンダリングコードから読み書きされるタイミングを知る必要があるからです。 – MuertoExcobito

+0

うーん、ありがとう –

関連する問題