【问题标题】:context sharing in FreeGLUT under Linux with xorgLinux下FreeGLUT中的上下文共享与xorg
【发布时间】:2014-08-01 17:33:33
【问题描述】:

我正在尝试通过 FreeGLUT 库将 OpenGL 与共享上下文一起使用(因为在窗口之间共享纹理)...它工作正常,我可以共享纹理,但我在程序结束时或在窗口被鼠标关闭期间失败了。 ..

我已经验证了模拟问题的代码:(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);,效果很好。

有人知道我做错了什么吗?

【问题讨论】:

    标签: linux opengl freeglut xorg openglcontext


    【解决方案1】:

    GLUT_USE_CURRENT_CONTEXT 选项创建共享上下文。这只是意味着 same GL 上下文用于所有窗口。您只有一个 GL 上下文,并在您第一次销毁使用它的窗口时将其销毁,因此其他销毁调用失败。我所知道的 GLUT 实现实际上都不支持 GL 上下文共享。

    GLUT_USE_CURRENT_CONTEXT 更像是一个 hack(而且它也不是 GLUT 规范的一部分),并且不是一个很好的实现。它可以使用一些引用计数来破坏上下文,而不是在使用它的最后一个窗口被破坏之前,但事实并非如此。

    【讨论】:

    • 谢谢。它解释了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多