2013-01-11 59 views
1

我用的OpenCL/OpenGL的互操作工作,並已經能夠成功地得到它的工作在OSX:glXGetCurrentDisplay()分段錯誤(Linux)的

props[0] = CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE; 
props[1] = (cl_context_properties) CGLGetShareGroup(CGLGetCurrentContext()); 

然而,使用X通訊員時:

props[0] = CL_GL_CONTEXT_KHR; 
props[1] = (cl_context_properties) glXGetCurrentContext(); 
props[2] = CL_GLX_DISPLAY_KHR; 
props[3] = (cl_context_properties) glXGetCurrentDisplay(); 
props[4] = CL_CONTEXT_PLATFORM; 
props[5] = (cl_context_properties) pID; 

OpenGL的初始化代碼:

glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 

screenWidth = glutGet(GLUT_SCREEN_WIDTH); 
screenHeight = glutGet(GLUT_SCREEN_HEIGHT); 

glutInitWindowPosition((screenWidth - width)/2 , (screenHeight - height)/2); 
glutInitWindowSize(width, height); 
glutCreateWindow(appName.c_str()); 

glClearColor (0.0, 0.0, 0.0, 0.0); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

glEnable(GL_COLOR_MATERIAL); 

glShadeModel(GL_SMOOTH); 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

glutDisplayFunc(render_s); 
glutIdleFunc(render_s); 
glutReshapeFunc(resize_s); 
glutKeyboardFunc(keyPress_s); 
glutKeyboardUpFunc(keyRelease_s); 
glutMouseFunc(mousePress_s); 
glutMotionFunc(mouseDrag_s); 
glutPassiveMotionFunc(mouseMove_s); 

初始化代碼越來越上下文之前調用。

glXGetCurrentContext()沒有段錯誤,但是glXGetCurrentDisplay()做了。

剔除互操作,甚至稱glutInit()

附註:後爲什麼會glXGetCurrentDisplay()賽格故障有沒有辦法在OpenGL下明確選擇平臺/設備?

+0

關於你的PS:OpenGL是完全平臺不可知的。它依賴於系統特定的API來爲其創建上下文。在Windows上,這是* WGL *在X11上是* GLX *,在MacOS X上是* CGL *。 – datenwolf

+0

對不起,遲到了,我去了另一個國家哈哈。 謝謝,這有助於很多^^ – Yuuta

回答

5

故障甚至稱glutInit後()

glutInit不會創建OpenGL上下文,所以glXGetCurrentDisplay將失敗。您需要撥打glutCreateWindow才能真正創建上下文。

+0

其實,我正在創建窗口。 有沒有其他原因會導致失敗? – Yuuta

+0

@Yuuta:窗口創建完畢後,你調用glXGetCurrentContext _after_?無論如何,glXGetCurrentContext不應該導致段錯誤。您是否嘗試在調試器中運行您的程序並提取堆棧跟蹤? – datenwolf

+0

再次感謝您的幫助! (我將更新代碼以顯示OpenGL初始化函數) 我沒有Linux機器,但我的代碼在Linux和OSX中完全一樣,除了上面列出的屬性和相應的頭文件。 所以我認爲我的函數調用的順序是合適的,因爲interop在OSX上工作。 至於stacktrace,我有四條線 ?? () 3調用glXGetCurrentDisplay的跟蹤線 對不起,我無法準確提供堆棧跟蹤。 – Yuuta

1

我只是面對同樣的問題。我發現的是你需要初始化glx擴展。我正在使用glew,因此我需要在上下文創建後調用glewInit()才能使glXGetCurrentDisplay()正常工作。

檢查您的標題。如果您包含GL/glxew.h,則需要以某種方式初始化函數指針。如果你包括GL/glx.h它應該可以正常工作。