cairo + freeglut组合出错

时间:2014-03-23 22:19:29

标签: c++ opengl glut cairo freeglut

我与GL建立freeglut上下文,如下所示:

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_STENCIL);

cairo这样的平局:

  if (!device_)
  {
    device_ = cairo_glx_device_create(glXGetCurrentDisplay(),
      glXGetCurrentContext());
  }
  // else do nothing

  auto const surface(cairo_gl_surface_create_for_window(device_,
    glXGetCurrentDrawable(), width, height));

  auto const cr(cairo_create(surface));

  // draw using cairo calls

  cairo_destroy(cr);
  cairo_gl_surface_swapbuffers(surface); // !!!
  cairo_surface_destroy(surface);

如果我没有打电话给cairo_gl_surface_swapbuffers(),但是打电话给glutSwapBuffers(),则没有任何显示,但是有错误:

X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  156 (GLX)
  Minor opcode of failed request:  11 (X_GLXSwapBuffers)
  Serial number of failed request:  69
  Current serial number in output stream:  72

但是,如果我拨打cairo_gl_surface_swapbuffers(),但不要拨打glutSwapBuffers(),则会显示图纸,并且不会出现错误。如何调用glutSwapBuffers(),而不是cairo_gl_surface_swapbuffers()并且不会触发错误?我希望将其他内容与cairo内容混合在一起。

1 个答案:

答案 0 :(得分:1)

函数cairo_gl_surface_swapbuffers应该等同于调用cairo_surface_flush,然后调用正确的函数来交换缓冲区。

所以我猜您正在寻找cairo_surface_flush(surface)