0

OpenGL の PBO について読んだところ、競合状態に関する質問がありました。

次の例を見てみましょう。2 つの PBO があり、それらのピクセル データを順番にテクスチャ オブジェクトに転送したいと考えています。そのため、1 つの PBO の非同期ピクセル転送を開始すると、ピクセル データがバックグラウンドで転送されている間に、すぐに CPU で別の処理を実行できます。次に、2 番目の PBO でいくつかのピクセル操作を行います。それが完了したら、ピクセルを 2 番目の PBO からテクスチャ オブジェクトに転送します。しかし、最初の PBO の転送がまだ完了していない場合はどうなるでしょうか? この最初の例のようです: http://www.songho.ca/opengl/gl_pbo.html

index = (index + 1) % 2;
nextIndex = (index + 1) % 2;

glBindTexture(GL_TEXTURE_2D, textureId);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[index]);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);

glTextSubImage2D() はすぐに戻り、最初の PBO のデータが GPU に転送されている間に 2 番目の PBO の作業を開始できます。最初の転送が完了する前に glTexSubImage() (2 番目の PBO のピクセル データを転送する必要があります) に到達した場合はどうなりますか? CPU ストール サイクルが発生しますか?

4

1 に答える 1

3

OpenGLは同期ポイントを導入し、変更されたOpenGLオブジェクトを使用する以前の呼び出しによってスケジュールされた操作にそれ以上の非同期操作が影響しないことを確認します。

最初の転送が完了する前にglTexSubImage()(2番目のPBOのピクセルデータを転送する必要があります)に達した場合はどうなりますか?

予期しないことは何もありません。glTexSubImageの呼び出し後にスケジュールされたすべての呼び出しは、変更されたデータを利用します。変更されていないデータを使用する前にスケジュールされたすべての呼び出し。OpenGL仕様はこれを義務付けています。

CPUのストールサイクルが発生しますか?

それはそうかもしれないし、そうでないかもしれない。OpenGLはこれを指定していません。

于 2013-03-03T22:08:07.900 に答える