2016-10-04 3 views
3

OpenGLを使用してアプリケーションを作成して画面に表示する方法を検討してきましたが、GPUにデータをコピーするのが遅いという問題があります。OpenGLでGPUにデータを送信するタイミング

私は現在、OpenGL SuperBible 7th Editionを読んで、様々なチュートリアルをオンラインで読んでいます。データが実際にGPUに送信されたときには、私は推測していません。

  1. glBufferStorage/glCreateVertexArraysを呼び出したときにGPUのRAMに領域が割り当てられていますか?または、このスペースはアプリケーションのメモリに割り当てられ、後でコピーされますか?
  2. ポインタは​​からGPUメモリへのポインタを返しますか、それとも後で上書きされるアプリケーションメモリに割り当てられた領域へのポインタですか?
  3. 私のアプリケーションメモリにデータが保存され、GPUにコピーされたと仮定すると、実際にデータがコピーされるのはいつですか? glCrawArraysに電話をかけたら?

答えて

7

1:glCreateVertexArrays 1:glCreateVertexArraysはバッファオブジェクトやGPUメモリとは関係がありませんので、あまり関係ありません。

残りについては、OpenGLが実際のGPUメモリを割り当てることを決定するときは、OpenGL実装までです。実際の割り当てを望む限り延期することができます。

データがいつOpenGLにアップロードされるのかをお尋ねする場合は、OpenGL will always be finished with any pointer you pass it when that function call returns。実装では、呼び出し自体内のGPUアクセス可能なメモリにデータをコピーするか、CPUメモリを割り当ててデータをコピーし、後で使用するために実際のGPUストレージへの転送をスケジュールします。

実際には、バッファにコピーすることはすぐには起こらないと考えてください。これは、通常、DMAは特定のメモリ位置合わせを必要とするため、渡すポインタにはその位置合わせがない可能性があります。

通常、あなたは気にしないでください。実装がその仕事をするようにしてください。

2:上記と同様に、実装では、メモリをマップするときに必要な処理を実行できます。 GPUでアクセス可能なメモリへの真のポインタを与えるかもしれません。または、メモリのマップを解除するときに、CPUメモリのブロックを割り当ててDMAを割り当てることもできます。

唯一の例外はpersistent mappingです。その機能は、OpenGLがバッファが常駐する実際のGPUアクセス可能なメモリへの実際のポインタを与えるを必要とします。これは、メモリへの書き込み/読み出しが完了したときに実装を伝えることは決してないからです。

これは、永続マッピングを使用できるようにするためにOpenGLでバッファストレージを不変に割り当てる必要がある理由の一部です。

3:実装が必要と感じるたびにコピーされます。

OpenGLの実装はブラックボックスです。彼らがしていることは、彼らにとっては多かれ少なかれです。仕様が唯一必要とするのは、their behavior act "as if" it were doing things the way the specification saysです。このように、データがコピーされたときはいつでも、データがコピーされます。

描画呼び出しを行う場合、この描画コマンドが依存するバッファDMAがその時点で完了している必要はありません。 GPUが実際にの前に実行されると、それらのDMAが描画コマンドを実行するだけです。この実装は、DMAが完了するまでglDraw*コールをブロックすることで可能です。しかし、内部GPU同期メカニズムを使用して、描画コマンドをissuedとDMA操作の完了に結びつけることもできます。

アップロードが実際に完了したことを保証する唯一のことは、GPUにバッファにアクセスしてCPUをそのコマンドと同期させる機能を呼び出すことです。アップロード後に同期するだけでは何も保証されません。アップロード自体は観測可能な動作ではないため、同期しても効果はありません。

もう一度そうかもしれません。それがポイントです。 を知ることはできません。

関連する問題