Недавно я перешел с 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. Когда я запускаю это, я получаю ошибку CL_INVALID_GL_OBJECT от clCreateFromGLBuffer(). Однако у OpenGL нет проблем с созданием, привязкой или отвязкой рассматриваемых буферов. Контекст OpenCL, по-видимому, действителен, ошибок при создании или запросе не возникает. Все работает в VS2010 на 64-битной Windows 7.
Сведения о компиляции
Вот соответствующие включает:
/* 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;
Компиляция и связывание не приводят к ошибкам (множество предупреждений о злоупотреблении указателями, но я сомневаюсь, что это виновник).
В настоящее время у меня нет идей о том, как это отлаживать. Может ли кто-нибудь предложить дальнейшие шаги?