2010-02-01 51 views
4

我的應用程序有兩個線程:A和B.A是主線程,B是我的視頻線程。 視頻線程有一個OpenGL函數可以正常工作的初始化OpenGL上下文。但是,當我從線程A調用OpenGL函數時,函數失敗,出現1282錯誤(GL_INVALID_OPERATION) 是否可以從我的主線程(A)調用OpenGL函數?從另一個線程調用OpenGL函數

+0

我不知道你爲什麼想這麼做。請詳細說明。 – batbrat 2010-02-01 13:54:41

回答

10
  1. 除非您正在做慢速內容的實際背景渲染,否則這可能不會帶來性能增量。

  2. 在Windows上,打開的gl上下文是每個線程。確保在嘗試調用打開的gl函數之前,從您的工作線程調用wglMakeCurrent。

  3. Open GL不是線程安全的。如果您嘗試在多個線程上創建相同的上下文,它不會阻止您。它會爆炸。

+0

我有同樣的問題,glGenTexture(),因爲它是從一個不同的線程調用,未能創建一個紋理ID。現在增加了一些防守檢查。 但我注意到,雖然是glGetError()*似乎*工作;然而,它沒有明確*錯誤,並且我陷入了無限循環;而(glGetError()){...}永遠不會結束。 – 2016-10-18 09:54:25

3

GL是線程安全的,因此,你不能從2個不同的線程調用GL功能。你將不得不用互斥體來保護每個gl部分,這會消除你期望的性能提升,加上互斥鎖的開銷以及可能需要的上下文切換。