2016-09-01 8 views
0

glClientWaitSync関数を使用して誤解しています。 OpenGLの4.5::私はうまくOpenGLのウィキを理解していればフェンシングとの同期

glDraw(...); 
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); 
glDraw(...); 
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); 
glDeleteSync(sync); 

、我々は2例

最初のケースを持っている:

は、私はそのような何かを使用してい認めるこの場合、glClientWaitSync後、我々は、 wikiに書いてあるので最初のドローだけが実行されていることを確認してください:

OpenGL 4.5では、このフラッシュは特別に行われます。初めて特定の同期オブジェクトで待機していて、同期オブジェクトを作成したのと同じコンテキストで待機している場合は、同期オブジェクトの直後に発行したかのように動作します。そのため、同期オブジェクトの作成後に他のOpenGLコマンドを発行した場合、それらはフラッシュされません。

2番目のケース:OpenGL 4.4またはそれ以下:この関数はglFlush関数と "グローバルに"同じ動作をするため、両方の描画が実行されていると確信していますか? こうすれば、すべてのコマンドバッファがフラッシュされた場合に、OpenGL 4.4でラウンドロビン方式で永続マッピングをどのように実際に使用するのですか?

答えて

1

"Flush"は「完了」を意味しません。これは単に「GPUによって最終的に実行され、それ以上のOpenGLコールは必要ありません」という意味です。

4.4の動作は、glClientWaitSyncコマンドまですべてをフラッシュします。 4.5の振る舞いは、glFenceSyncまでの呼び出しをすべてフラッシュします。

しかし、タイムアウトまたはerroringなしglClientWaitSync戻った場合の両方のケースでは、あなたがGPUの状態を知って唯一のことは、glFenceSyncコールの前にすべてのコマンドが完了していることです。

すべてのコマンドバッファがフラッシュされた場合、OpenGL 4.4でラウンドロビン方式で永続マッピングをどのように使用すればよいですか?

フェンスシンクをフラッシュしたい場合は、4.4で行う必要があります。つまり、フェンスを作成した直後にglFlushが表示されますが、glClientWaitSyncを使用するとフラッシュされません。これにより、4.5の動作の効果が得られます。

+0

私がよく理解していれば、4.4の方法でフラッシュすると、フェンスが完了する前にすべてのコマンドが確実に終了し、後に続くコマンドが開始されます。 4.5の方法では、後のものは必須ではありません。 –

関連する問題