【问题标题】:error with cairo + freeglut combinationcairo + freeglut 组合出错
【发布时间】:2014-03-23 22:19:29
【问题描述】:

我用freeglut 制作了一个GL 上下文,如下所示:

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 内容混合在一起。

【问题讨论】:

  • 如果 Cairo 如此建议包装 GLX,那么您应该通过它。如果允许 cairo 管理诸如调用线程的活动 GLX 上下文之类的事情,FreeGLUT 将做出可能不成立的假设。
  • 当然,但是我用cairoGLX 上下文初始化它,我不知道是否正在创建一个新的。也许有人一直在玩类似的东西。

标签: c++ opengl glut cairo freeglut


【解决方案1】:

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

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

【讨论】:

  • 不行,仍然出现错误。如果您有工作示例,请发布。
  • 7 年过去了,现在我认为你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多