2016-04-11 44 views
0
創建多線程上下文

我不知道很好的openGL,但我有一個是在主UI線程創建了一個背景:如何在OpenGL

eglGetDisplay(EGL_DEFAULT_DISPLAY); 
eglCreateWindowSurface(..) 
eglCreateContext(..) 
eglMakeCurrent(...) 

,但現在我想也做一些圖形操作(主要是爲了創建紋理,並稍後發送這些紋理以在主UI線程中繪製)在後臺線程中。但我不知道如何在第二個線程中初始化第二個上下文(或者如何在第二個線程中使用第一個上下文):(也許我必須在第二個線程中使用eglCreatePbufferSurface?我不知道...

感謝由您的幫助

回答

0

上下文是單線程的只有:OpenGL是一種高模態API,以便允許多個線程同時使用相同的背景下將是痛苦的 - 如果線程1調用glBindTexture那麼它是如何知道!它不會被線程2打斷,在進入下一個語句之前調用另一個glBindTexture

但是,eglCreateContext的第三個參數被定義爲:

share_context

指定與要0​​共享數據的另一EGL渲染上下文,通過對應於 上下文客戶端API定義。數據還與share_context共享數據的所有其他上下文共享。 EGL_NO_CONTEXT表示不會共享 發生。

(在規範中的一個警告警告,質地0不可共享,如果你一貫只使用glGenTextures作爲ID的結果的話,也不用擔心它)

所以你的背景上下文需要提名原始作爲共享上下文。然後它擁有自己的上下文。它可以繼續完成創建紋理的昂貴工作。完成後,它生成的紋理名稱可以交給主線程,並且應該在其上下文中可用。

唯一要注意的是主線程上的命令隊列和背景上的命令隊列之間的潛在同步問題。可能最後在背景中調用glFinish以確保所有工作都已完成,將紋理ID傳遞到前景,然後在該上下文中調用glFlush以刷新未提交的命令隊列。

+0

ooh謝謝tommy,所以據我所知在::線程2我需要創建另一個與:: Thread1共享的上下文嗎?但如何使用eglCreateWindowSurface或eglCreatePbufferSurface在後臺線程中創建上下文? – loki

+0

你需要表面嗎?如果沒有,那麼我的假設(警告:沒有檢查)是,你可以不 - 執行紋理上傳,交給他們,從不對繪圖命令有任何興趣。否則,我認爲'eglCreatePbufferSurface'因爲它們用於不帶關聯窗口的離屏繪製。對於僅用於處理和上傳資源的上下文,這是您大概想要的。 – Tommy