glewInit()在创建osmesa(屏幕外台面)上下文后崩溃(segfault)

时间:2014-05-04 00:54:48

标签: c++ opengl glew mesa

我正在尝试在远程计算群集上运行opengl应用程序。我正在使用osmesa,因为我打算执行屏幕外软件渲染(没有x11转发等)。我想使用glew(使生活处理着色器和其他扩展相关的调用更容易),我似乎已经建立并链接了mesa和glew罚款。

当我调用mesa-create-context时,glewinit会给出OPENGL版本不可用的输出,这可能意味着尚未创建上下文。当我调用glGetString(GL_EXTENSIONS)时,我没有得到任何输出,这证实了这一点。这也表明glew本身工作正常。 (其他glew命令,如glew版本等也可以工作)。

现在当我(如下所示)添加mesa-make-context-current函数时,glewinit崩溃了一个段错误。现在运行glGetString(GL_EXTENSIONS)给我一个扩展列表(这意味着上下文创建成功!)

我花了好几个小时试图解决这个问题,尝试修补但没有任何作用。非常感谢任何帮助。也许你们中的一些人之前经历过类似的事情?再次感谢!

int Height = 1; int Width = 1;
OSMesaContext ctx; void *buffer; 
ctx = OSMesaCreateContext( OSMESA_RGBA, NULL );
buffer = malloc( Width * Height * 4 * sizeof(GLfloat) );

if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) {
printf("OSMesaMakeCurrent failed!\n");
return 0;
 }
-- glewinit() crashes after this.

添加,osmesa和glew实际上最初没有编译。因为glew在它的最后一行中取消定义GLAPI,并且因为osmesa不会再次包含gl.h,所以GLAPI仍未定义并在osmesa.h中导致错误(119)。我通过向GLAPI添加一个extern来解决这个问题,但不确定这是否相关。

1 个答案:

答案 0 :(得分:0)

在glew.c中查看glewInit的源代码如果glewContextInit成功则返回GLEW_OK,GLEW_OK定义为0,因此在Linux系统上它总是调用glxewContextInit调用glX函数,在OSMesa的情况下可能不会准备启用。这将导致段错误(如我所见),并且似乎glewInit函数无法处理此情况,遗憾的是无需修补C源并重新编译库。

如果其他人已经解决了这个问题我会感兴趣,我已经看到了glew.c源码的一些修补版本,可以解决这个问题。目前尚不清楚GLEW社区是否有任何能源合并该用例的变更。