2013-12-21 13 views
5

面白いことに、今まで私はOpenGLコンテキストが失われたことはありませんでした(すべてのバッファリソースが抹消されています)。私は現在、OpenGL 4.2をSDL 1.2とGLEWを介してWin7 64で使用しています。また、起動中のみフルスクリーンに切り替える機能を持たないアプリケーションもウィンドウズされています。OpenGL文脈紛失

私の開発マシンのコンテキストでは、サイズが変わっても決して失われないようですが、他のマシンでは私のアプリケーションはOpenGLのコンテキストを失うことがあります。 (私はメモリの多くのアプリケーションの他の部分で使用されている)メモリの制約のため、私のglバッファの内容(VBOs、FBOs、テクスチャなど)をシステムメモリにバックアップしない、これは奇妙な問題ではない文脈が決して拭かれなかったので、私は過去に私のことを知りました。

グーグルでは、どのような状況でOpenGLのコンテキストが失われるのか(GPUのメモリバッファがすべて消去される)を知ることは難しく、フルスクリーンとウィンドウの切り替えは別です。

私のDX時代には、多くの理由でコンテキストが失われる可能性があり、システムメモリのバックアップからバッファをリロードしたときに通知されます。私は、OpenGL(またはSDLのような管理ライブラリ)が私のためにこのバッファのリロードを処理するという前提の下にあった(そして、おそらくその仮定では間違っていた)。これは決して部分的に真実なのでしょうか?

私が持っている問題の1つは、サイズ変更時にコンテキストが失われてしまうことです。GPUメモリを大量に使用していて、すべてをリロードしなければならないうちにアプリケーションが一時停止する可能性があります。

これはデバイスに依存するものか、ドライバに依存しますか?それは、デバイス、ドライバ、およびSDLのバージョンのいくつかの組み合わせですか?このような文脈の喪失をどのように検出して、私がそれに反応できるか?

すべてのglバッファのコンテンツのシステムメモリの内容を保持して、コンテキストが失われたときに再ロードできるようにするのが標準的な方法ですか?それとも、標準的な練習ではない文脈の喪失はまれですか?

+1

OpenGLコンテキストが失われているプログラムのコードを、ある時点で確認する必要があります。 – Vallentin

答えて

3

SDL-1.2を使用しています。 SDL-1.2では、ウィンドウのサイズが変更されたときにOpenGLコンテキストが再作成される(つまり、適切にシャットダウンして再初期化される)可能性があります。これはSDLの既知の制限であり、SDL-2で取り上げられています。

したがって、SDL-2を使用するか、GLFWなどのOpenGL用に特別に調整された別のフレームワークを使用してください。

これは標準的な慣行ではないほどまれなコンテキスト損失ですか?

OpenGLコンテキストは「失われていません」。それらは割り当てが解除されており、それがSDL-1.2が特定の条件で行っていることです。

3

OpenGLのコンテキストリセット(ロス)は、通常、バックグラウンドで完全に透過的に処理されます。 OpenGL(堅牢なコンテキスト)に非常に新しい拡張機能を使用していない限り、OpenGLでコンテキストリセットが発生したときを知る方法がないため、文字通り失われたコンテキストを処理するためにアプリケーションメモリにGLリソースを保持しません状態。ドライバーは通常これをすべて行いますが、2.6 - "Graphics Reset Recovery"に記載されているように、通知を受け取り、コンテキストリセットに関連する動作を定義することができます。

OpenGLのコンテキストが失われていることは、D3Dのコンテキストが失われていることとは非常に異なることに注意してください。 GLでは、いくつかの致命的なエラーが発生したため(シェーダの長時間またはメモリアクセス違反など)、通常のGLよりも厳しいセキュリティ/信頼性の制約があるWebGLなどで最も有用です。D3Dでは、Alt + Tabキーまたはウィンドウモードからフルスクリーンモードに切り替えるだけでコンテキストを失うことがあります。いずれにしても、これはSDL問題であり、GLのコンテキストリセットの概念にはまったく関連していないと私は考えています。

+2

実際にはSDL-1.2の問題です。 SDL-1.2はサイズ変更にうまく対応せず、一部のコードパスは実際に完全再初期化を実行します。そのため、OpenGLではなく、SDL-2を使用してください。 – datenwolf