2011-12-30 9 views
2

OpenGLビューを含むプログラムで作業しています(Ogre3Dを使用)。このプログラムは、独自のUIを開くことができるサードパーティのプラグイン(すなわち、VST)をホストしています。いくつかのプラグインはUI用にOpenGLも使用しており、(他の非OpenGLプラグインのUIではクラッシュしないでください)を開くとすぐにOgre Render Systemでがプログラムをクラッシュさせます。サードパーティのプラグインでもOpenGLを使用している場合のOpenGLの問題

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000 
Crashed Thread: 0 Dispatch queue: com.apple.main-thread 

Thread 0 Crashed: com.apple.main-thread 
0 GLEngine    gleRunVertexSubmitImmediate + 722 
1 GLEngine    gleLLVMArrayFunc + 60 
2 GLEngine    gleSetVertexArrayFunc + 116 
3 GLEngine    gleDrawArraysOrElements_ExecCore + 1514 
4 GLEngine    glDrawElements_Exec + 834 
5 libGL.dylib   glDrawElements + 52 
6 RenderSystem_GL.dylib Ogre::GLRenderSystem::_Render(...)... 
... 
22 Ogre Ogre::Root::renderOneFrame() + 30 
23 com.mycompany.myapp MyOgreWidget::paint() 
... 

(apparently a third-party thread from the plug-in) 
Thread 10: Dipatch queue: com.apple.opengl.glvmDoWork 
0 libSystem.B.dylib   mach_msg_trap + 10 
1 libSystem.B.dylib   mach_msg + 68 
2 libCoreVMClient.dylib  cvmsServ_BuildModularFunction + 195 
3 libCoreVMClient.dylib  CVMSBuildModularFunction + 98 
4 libGLProgrammability.dylib glvm_deferred_build_modular(voi*) + 254 
5 libSystem.B.dylib   _dispatch_queue_drain + 249 
6 libSystem.B.dylib   _dispatch_queue_invoke + 50 
7 libSystem.B.dylib   _dispatch_worker_thread2 + 249 
8 libSystem.B.dylib   _pthread_wqthread + 390 
9 libSystem.B.dylib   start_wqthread + 30 

私はOgre3DやプラグインのUIのいずれかで、OpenGLのコンテキストが適切に管理されていなかったことを疑われ、コールバックをレンダリングするプラグインにアクセスすることはできません。

Ogre3D 1.7.1および1.7.3でテストしました。私のUIツールキットはQt(バージョン4.6.3と4.7.4)です。 MacOSXとWindowsと同じ問題。

この問題がないOpenGLビューの他のプログラムは、まったく同じプラグインであっても、私はそのような状況をどのように処理するのだろうかと思います。

これをどのように処理するか考えてください。

ありがとうございました。ではごきげんよう。

+0

私はプラグインを別のプロセスに橋渡しできますが、それは痛いでしょう。 – moala

答えて

0

これをどのように処理するか考えてください。

私は右のあなた自身(= Ogre3Dの)OpenGLの仕事を終えた後QGLWidget::doneCurrentへの呼び出しを追加し、独自のOpenGLの作業を行う前にQGLWidget::makeCurrentにしてください。

+0

QGLWidgetを使用している場合、私はOgreビューをレンダリングするとすぐにクラッシュします。とにかく、QGLWidget :: paintGLについて "docはこの関数が呼び出されたときにすでに完了しているので、makeCurrent()を呼び出す必要はありません"と述べています。しかし、doneCurrent()は明らかにpaintGL()呼び出し元のglDraw()で呼び出されていません。 – moala

+0

仮想ボイドglDraw(){QGLWidget :: glDraw();を再実装しました。 doneCurrent(); }また、同じ時刻に読み込み可能なスタックなしでクラッシュしました。 – moala

+0

とにかくOgre3Dは通常、独自のOpenGLコンテキストを正しく処理します。 – moala

関連する問題