1

我最近从 Windows 迁移到 Linux(Debian,64 位)并试图启动并运行 GPGPU 开发环境,所以我正在测试一个在 Windows 下工作的程序。

编译和链接都很好,但是当我运行程序时,我得到了一些奇怪的错误。我正在使用 glew 和 freeglut。

第一个片段:仅 OpenGL

i = 1;
info = PROGRAM_NAME;
glutInitContextVersion(4,2);
glutInit(&i, &info);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(W_SIZEX, W_SIZEY);
glutInitWindowPosition(W_POSX, W_POSY);
glutCreateWindow(info);
glClearColor(1.0,1.0,1.0,0);
/**/
printf("Before glewInit: %i\n", glGetError());
/**/    
printf("glewInit returns: %i\n", glewInit());
/**/
printf("After glewInit: %i\n", glGetError());
/**/

我从中得到以下输出:

Before glewInit: 0
glewInit returns: 0
After glewInit: 1280

这是一个无效的枚举错误。我不知道是什么原因造成的,但我怀疑它可能与我得到的下一个错误有关,稍后在程序执行中。

第二个片段:OpenCL-OpenGL 互操作

/* BUFFERS */
(*BFR).C[0] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, 0);
(*BFR).C[1] = clCreateBuffer(*CTX, CL_MEM_READ_WRITE, SD, 0, &i);
dcl(i);

glGenBuffers(2, (*BFR).G);

glBindBuffer(GL_ARRAY_BUFFER, (*BFR).G[0]);
glBufferData(GL_ARRAY_BUFFER, SI, 0, GL_DYNAMIC_DRAW);
(*BFR).D[0] = clCreateFromGLBuffer(*CTX, CL_MEM_WRITE_ONLY, (*BFR).G[0], &i);
dcl(i);
glBindBuffer(GL_ARRAY_BUFFER, 0);

在这里,dcl(int) 方法只是解码 CL 错误代码。当我运行它时,我从 clCreateFromGLBuffer() 收到一个 CL_INVALID_GL_OBJECT 错误。但是,OpenGL 在生成、绑定或取消绑定相关缓冲区时没有问题。OpenCL 上下文显然是有效的,在创建或查询时不会产生错误。在 Windows 7 64 位的 VS2010 中一切正常。

编译细节

以下是相关的包括:

/* OPENGL */
#include "GL/glew.h"
#include "GL/freeglut.h"

/* OPENCL */
#include "CL/cl.h"
#include "CL/cl_gl.h"

我正在使用 GCC 并像这样链接:

gcc -w -I./include CLGL.c -o ~/Templates/GOL-CLGL/run/a.out -lGLEW -lGLU -lglut -lGL -lOpenCL;

编译和链接不会导致错误(大量关于指针滥用的警告,但我怀疑这是罪魁祸首)。

我目前不知道如何调试它。谁能建议进一步的步骤?

4

1 回答 1

2

我最近也遇到了这个问题,所以这里是答案:

OpenGL:调用 glewInit() 后 glGetError() 返回无效枚举

所以你可以丢弃那个错误。

于 2012-12-26T21:06:40.767 回答