glewinit(), по-видимому, успешно, все равно устанавливает флаг ошибки

Недавно я перешел с 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;

Компиляция и связывание не приводят к ошибкам (множество предупреждений о злоупотреблении указателями, но я сомневаюсь, что это виновник).

В настоящее время у меня нет идей о том, как это отлаживать. Может ли кто-нибудь предложить дальнейшие шаги?


person evenex_code    schedule 26.12.2012    source источник


Ответы (1)


Недавно у меня тоже была эта проблема, поэтому вот ответ:

OpenGL: glGetError() возвращает недопустимое перечисление после вызова glewInit()

Таким образом, вы можете отказаться от этой ошибки.

person Michael IV    schedule 26.12.2012
comment
Попался. Так что, возможно, есть какая-то другая причина ошибки INVALID_GL_OBJECT. - person evenex_code; 27.12.2012
comment
Да, это что-то еще. Обычно я начинаю вводить getError() между методами GL API, пока не узнаю, откуда исходит ошибка. Попробуйте :) - person Michael IV; 27.12.2012
comment
Исправлена ​​проблема! Не уверен, что было не так, но очистка libopencl, fglrx и всех связанных пакетов, затем установка последнего катализатора AMD, а затем SDK AMD APP с использованием сценариев от AMD сработали. Перед этим я установил fglrx и libopencl из репозиториев debian. Так что, кого это может касаться, оставьте репозитории в покое и устанавливайте с помощью скриптов AMD. - person evenex_code; 27.12.2012