2017-09-28 9 views
0

私はLinuxでjoglとOpenGLを使ってJavaのグラフィカルアプリケーションを開発しています。私のアプリケーションには30以上のシェーダが含まれており、ほとんどの場合、正常に動作します。しかし、週に約1回、ドライバ(amdgpu pro)のエラー(SIGSEGV)があります。OpenGL 4.3 APIとglsl言語は安全ですか?

OpenGLの安全な言語です:アプリケーションプログラムによってエラーから保護されているか、アプリケーションの不正な操作によってドライバのメモリが損傷する可能性があります(他人のメモリまたはデータ競争に書き込む)。不正なドライバ(amdgpu pro)またはアプリケーション自体のエラーで、エラーの原因(SIGSEGV)を調べるにはどうすればよいですか? (glGetErrorは、各アプリケーションステップですべてがうまくいくことを示しています)。

+3

OpenGLは言語ではありません。ドライバの実装は、バグを含むことができる単なるプログラムです。 APIを不適切または非標準で使用すると、クラッシュが発生する可能性があります。 –

+0

明白なエラーがなく、問題がないことをglGetErrorが示している場合、どのアプリケーションアクションがドライバクラッシュ(SIGSEGV)につながる可能性がありますか?このような間違ったアプリケーションの動作を自動的に検出するデバッグツールはありますか? –

答えて

4

一般に、OpenGL APIを使用しているときにプログラムをクラッシュさせる方法はたくさんあります。バギードライバーはあなたが完全に避けることができない残念な現実であり、創造的な方法でAPIを誤用すると、エラーではなくクラッシュする可能性があります。実際、私は個人的には、おそらく "安全"と思われるWebGLを使用していても、コンピュータを複数のプラットフォームや異なるGPUベンダーで完全にハングアップ(反応しない)させてしまいました。

唯一可能な答えは「いいえ、OpenGLは安全ではありません」です。

OpenGLをデバッグするためのいくつかのヒント:

  • は(それが利用できない場合を除き)代わりにKHR_debugを使用し、glGetErrorを使用しないでください。

  • GL_CONTEXT_FLAG_DEBUG_BITでデバッグコンテキストを作成します。

  • テスト中は、バグの少ないOpenGL実装を使用してください。私の経験では、メサの実装は非常に安定しています。

+1

真剣に、強く、 'glGetError'呼び出しをすべて取り除いて' KHR_debug'を優先することを強く考えてください。 'KHR_debug'は' glGetError'と同じ情報を与え、もし設定されていれば、エラーが発生したときにブレークポイントを設定することができます。 'glGetError'は呼び出される前のエラーを意味します。 – tamato

3

OpenGL 4.3は安全ですか?絶対違う。あなたはプログラムをクラッシュさせることができる多くのことがあります。たとえば、バッファの境界を越えて読み込まれるレンダリング操作があるとします。 4.3にはそれを行う方法がたくさんあります。

実際、実行時間が長すぎるシェーダを書き込むだけでGPUのエラーが発生する可能性があります。

理論上は、初期化されていないバッファから読み取るだけで、他のアプリケーションで作成されたGPUメモリを読み取ることができます。

特定のクラッシュがドライバのバグによって引き起こされたのか、ユーザエラーによって引き起こされたのかを簡単に特定する方法はありません。あなたは実際にそれをデバッグし、OpenGL仕様を理解して確実に知っておく必要があります。

関連する問題