Сбой glewInit() (segfault) после создания контекста osmesa (закадрового mesa)

Я пытаюсь запустить приложение opengl на удаленном вычислительном кластере. Я использую osmesa, так как собираюсь выполнять программный рендеринг вне экрана (без пересылки x11 и т. д.). Я хочу использовать glew (чтобы облегчить жизнь, связанную с шейдерами и другими вызовами, связанными с расширениями), и, похоже, я создал и связал как mesa, так и glew.

Когда я вызываю mesa-create-context, glewinit выдает вывод OPENGL Version not available, что, вероятно, означает, что контекст не был создан. Когда я вызываю glGetString(GL_EXTENSIONS), я не получаю никакого вывода, что подтверждает это. Это также показывает, что glew отлично работает сам по себе. (Другие команды glew, такие как версия glew и т. д., также работают).

Теперь, когда я (как показано ниже) добавляю функцию mesa-make-context-current, glewinit вылетает с segfault. Запуск 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). Я обошел это, добавив extern в GLAPI, но не уверен, что это актуально.


person ishan    schedule 04.05.2014    source источник
comment
Внешний к GLAPI? GLAPI обычно представляет собой макрос, который определяет привязку библиотеки/соглашение о вызовах (например, __declspec (dllimport) для привязки DLL), а не фактический символ, на который вы можете ссылаться.   -  person Andon M. Coleman    schedule 04.05.2014
comment
извините, я имел в виду, #include GL/glew.h #define GLAPI extern #include GL/osmesa.h У меня нет прав на запись в файл glew.h, поэтому я не могу закомментировать бит undef GLAPI.   -  person ishan    schedule 04.05.2014


Ответы (1)


Глядя на источник glewInit в glew.c, если glewContextInit завершается успешно, он возвращает GLEW_OK, GLEW_OK определяется как 0, и поэтому в системах Linux он всегда будет вызывать glxewContextInit, который вызывает функции glX, которые в случае OSMesa, вероятно, не будут готовы к использованию. . Это вызовет segfault (как я вижу), и кажется, что функция glewInit не имеет возможности обрабатывать этот случай, к сожалению, без исправления исходного кода C и перекомпиляции библиотеки.

Если другие уже решили эту проблему, мне было бы интересно, я видел несколько исправленных версий исходных кодов glew.c, которые обходят это. Неясно, есть ли у сообщества GLEW какая-либо энергия для объединения изменений в этом варианте использования.

person Marcus D. Hanwell    schedule 10.09.2014