2014-10-02 73 views
0

我遇到了一個問題,在多線程中OpenGL調用有時會導致段錯誤,我無法弄清楚我做錯了什麼。我沒有在線程之間共享上下文或其他內容。多線程OpenGL中的Segfault?

invalid CoreGraphics connection 
Segmentation fault: 11 

實際CGL結果代碼是

kCGLBadConnection - Invalid connection to Core Graphics. 

https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/cgl_opengl/Reference/reference.html#//apple_ref/doc/uid/TP40001186-CH3g-BBCDCEBD

最終用途的情況下在這裏是使與libuv異步圖像(在CPU上進行一些處理,然後將數據上傳到GPU對於渲染),但我已經做了一個簡單的測試用例,它複製了這個問題。

https://github.com/mikemorris/headless-gl-multithreaded

回答

0

看來,崩潰的原因是多個線程同時嘗試在CGLChoosePixelFormat(或GLX中的XOpenDisplay/glXChooseVisual)中打開顯示連接。在主線程中打開單個連接,然後在實例化新線程(每個線程創建自己的上下文)時使用此連接似乎可以解決此問題。

0

你需要在調用glReadPixels時綁定到線程有效的OpenGL上下文。 View::resize的CGL變體在最後解開了OpenGL上下文,因此在沒有激活OpenGL上下文的情況下調用glReadPixels。我認爲這可能是你問題原因的一部分。

+0

糟糕,忘記了簡化示例中的make_active/make_inactive包裝,已更新並仍然殘缺。想知道我是否需要類似於XInitThreads的東西? – 2014-10-02 19:47:24