Совместное использование контекста в FreeGLUT под Linux с помощью xorg

Я пытаюсь использовать OpenGL с общим контекстом (из-за совместного использования текстур между окнами) через библиотеку FreeGLUT... Он работает нормально, я могу поделиться текстурами, но у меня не получилось в конце программы или при закрытии окон мышью...

Я выполнил код, имитирующий проблему: ( http://pastie.org/9437038)

// file: main.c
// compile: gcc -o test -lglut main.c
// compile: gcc -o test -lglut -DTIME_LIMIT main.c

#include "GL/freeglut.h"

#include <unistd.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  int winA, winB, winC;
  int n;

  glutInit(&argc, argv);

  glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE , GLUT_ACTION_CONTINUE_EXECUTION);
  //glutSetOption(GLUT_RENDERING_CONTEXT, GLUT_USE_CURRENT_CONTEXT);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  winA = glutCreateWindow("Test A");
  glutSetOption(GLUT_RENDERING_CONTEXT, GLUT_USE_CURRENT_CONTEXT);
  winB = glutCreateWindow("Test B");
  winC = glutCreateWindow("Test C");

  printf("loop\n");
  #ifdef TIME_LIMIT
  for (n=0;n<50;n++)
  {
    glutMainLoopEvent();

    usleep(5000);
  }
  #else //TIMELIMIT
  glutMainLoop();
  #endif // TIME_LIMIT

  printf("Destroy winC\n");
  glutDestroyWindow(winC);
  printf("Destroy winB\n");
  glutDestroyWindow(winB);
  printf("Destroy winA\n");
  glutDestroyWindow(winA);

  printf("Normal end\n");

  return 0;
}

Выход:

loop
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  153 (GLX)
  Minor opcode of failed request:  4 (X_GLXDestroyContext)
  Serial number of failed request:  113
  Current serial number in output stream:  114
Segmentation fault

вывод с TIME_LIMIT:

loop
Destroy winC
Destroy winB
Destroy winA
Segmentation fault

Без вызова glutSetOption(GLUT_RENDERING_CONTEXT, GLUT_USE_CURRENT_CONTEXT); он работает хорошо.

У кого-нибудь есть идеи, что я делаю плохо?

1 ответ

Решение

Опция GLUT_USE_CURRENT_CONTEXT не создает общие контексты. Это просто означает, что один и тот же контекст GL используется для всех окон. У вас есть только один контекстный текст GL, и вы уничтожаете его, когда вы впервые уничтожаете окно, в котором он используется, поэтому другие вызовы уничтожения не будут выполнены. Ни одна из реализаций GLUT, о которых я знаю, на самом деле не поддерживает совместное использование контекста GL.

GLUT_USE_CURRENT_CONTEXT больше похоже на хак (и в любом случае он не является частью спецификации GLUT) и не очень хорошо реализовано. Он может использовать подсчет ссылок для уничтожения контекста не раньше, чем будет уничтожено последнее окно, использующее его, но это просто не тот случай.

Другие вопросы по тегам