Проблема с OpenGL, когда сторонние плагины также используют OpenGL - PullRequest
2 голосов
/ 30 декабря 2011

Я работаю над программой, содержащей представление OpenGL (используя Ogre3D); эта программа содержит сторонние плагины (а именно VST), которые могут открывать свой собственный пользовательский интерфейс. Некоторые плагины также используют OpenGL для своего пользовательского интерфейса и делают сбой программы в системе визуализации Ogre, как только этот специфичный для плагина пользовательский интерфейс OpenGL открывается (без сбоев с другими плагинами не-opengl 'UI).

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

Я подозревал, что контекст OpenGL не был должным образом управляем в Ogre3D или в пользовательском интерфейсе плагина, но получить доступ к обратным вызовам рендеринга плагинов невозможно.

Я тестировал с Ogre3D 1.7.1 и 1.7.3. Мой инструментарий пользовательского интерфейса - Qt (версии 4.6.3 и 4.7.4). Те же проблемы с MacOSX и Windows.

Я знаю другие программы с представлениями OpenGL, у которых нет этой проблемы, даже с точно такими же плагинами, интересно, как они справляются с такими ситуациями.

Есть идеи, как с этим справиться?

Спасибо за любую помощь. Всего наилучшего.

1 Ответ

0 голосов
/ 31 декабря 2011

Есть идеи, как с этим справиться?

Я бы добавил вызов к QGLWidget::doneCurrent сразу после окончания своей собственной (= Ogre3D) работы OpenGL и сделал бы QGLWidget::makeCurrentперед выполнением собственной работы с OpenGL.

...