【问题标题】:glXGetCurrentDisplay() Segmentation Fault (Linux)glXGetCurrentDisplay() 分段错误 (Linux)
【发布时间】:2013-11-12 22:17:22
【问题描述】:

我正在使用 OpenCL/OpenGL 互操作,并且已经能够让它在 OSX 上成功运行:

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() seg 错误

附:有没有办法在OpenGL下明确选择平台/设备?

【问题讨论】:

  • 关于您的 PS:OpenGL 完全与平台无关。它依赖于系统特定的 API 来为其创建上下文。在 Windows 上这是 WGL 在 X11 上是 GLX 而在 MacOS X 上是 CGL
  • 抱歉回复晚了,我要去别的国家了哈哈。谢谢,很有帮助^^

标签: c++ opengl interop segmentation-fault opencl


【解决方案1】:

即使在调用 glutInit() 之后也会出错

glutInit 不会创建 OpenGL 上下文,因此 glXGetCurrentDisplay 将失败。您需要调用 glutCreateWindow 来实际创建上下文。

【讨论】:

  • 其实我正在创建窗口。还有什么其他原因会失败吗?
  • @Yuuta:你在创建窗口之后调用glXGetCurrentContext吗?无论如何, glXGetCurrentContext 不应该导致段错误。您是否尝试在调试器中运行程序并提取堆栈跟踪?
  • 再次感谢您的帮助! (我将更新代码以显示 OpenGL 初始化函数)我没有 Linux 机器,但我的代码在 Linux 和 OSX 中完全相同,除了上面列出的属性和相应的头文件。所以我认为我的函数调用的顺序是正确的,因为互操作在 OSX 上工作。至于堆栈跟踪,我有四行?? () 调用 glXGetCurrentDisplay 的 3 行跟踪 抱歉,我无法准确提供堆栈跟踪。
【解决方案2】:

我只是面临同样的问题。我发现你需要初始化 glx 扩展。我正在为此使用 glew,因此我需要在创建上下文后调用 glewInit() 以使 glXGetCurrentDisplay() 正常工作。

检查您的标题。如果包含GL/glxew.h,则需要以某种方式初始化函数指针。如果你包含GL/glx.h它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2016-11-10
    • 2017-10-05
    相关资源
    最近更新 更多