使用窗口系统交换缓冲区和清除返回(GLX)

时间:2016-03-31 14:39:26

标签: c++ x11 xlib egl glx

在后缓冲区和前缓冲区之间交换时,后台缓冲区中的内容变为未定义。我想使用“窗口系统”来定义它,例如GLX,EGL,WGL。使用“本机”渲染器,如OpenGL(glClear)是我的备份计划,不用再提了。它是备份的原因是因为我不想搞乱本机渲染上下文。我会坚持使用X / GLX来解决这个问题,但是如果你想在其他环境中描述如何做到这一点,那就继续吧。

从Xlib文档(http://www.x.org/docs/X11/xlib.pdf)中,我找到了一个操作,XClearWindow,用于清除带有“背景像素”的窗口(顺便说一句,名字很棒......)。

  1. XClearWindow是清除前/后还是两个缓冲区?我想回缓冲区是有意义的,但我不能单独从Xlib文档中找出来......如果有人问过三重缓冲区,那不是我!
  2. 它是否与OpenGL渲染同步,或者我是否必须通过例如在操作之前调用glxWaitGL来同步自己?
  3. 命令是否阻塞,即停止直到完成?实施依赖?
  4. 关于如何在使用窗口系统(GLX)进行交换后清除后台缓冲区的其他建议是适用的。

    干杯!

2 个答案:

答案 0 :(得分:1)

  

在后缓冲区和前缓冲区之间交换时,后台缓冲区中的内容将变为未定义。

是的,这是一件好事。

  

我想使用“窗口系统”来定义它,例如GLX,EGL,WGL

为什么呢?除此之外,这也是未定义的,因为交换后的背景没有任何好处将来自它。

如果OpenGL DDX知道它将同步的XClearWindow,它最多只会降低性能。在最坏的情况下,你会引入一种竞争条件,在此条件下结果是不可预测的。

  

关于如何在使用窗口系统(GLX)进行交换后清除后台缓冲区的其他建议是适用的。

使用正确的OpenGL操作:glClear(…)

答案 1 :(得分:0)

经过一些研究,我可能找到了解决方案。文件似乎是有序的,但我没有机会在实践中测试这个。一旦我开始工作,我会用代码更新答案。

  

XClearWindow是清除前/后还是两个缓冲区?

X没有双缓冲区的概念。每当与双缓冲窗口交互X时,两个缓冲区都会受到影响。唯一的例外是读取操作,例如只在前缓冲区上运行的XGetImage

然而,

X通过X双缓冲区扩展或xdbe扩展了双缓冲区概念:http://www.x.org/releases/X11R7.6/doc/xextproto/dbe.html#dbeswapbuffers

xdbe提供类似于GLX提供的XdbeSwapBuffers的{​​{1}}操作。有一些重要的区别:

  • XdbeSwapBuffers不管理与任何客户端的任何同步    像glxSwapBuffers这样的API。用户必须手动执行此操作。幸运的是,GLX提供了很棒的服务    不会停止的同步操作(glxSwapBuffersglxWaitGL)    执行。这几乎是我第二个问题的答案。
  • glxSwapBuffers为当前执行隐式刷新(glxWaitX) 上下文。 XdbeSwapBuffers没有。何时冲洗或不冲洗 应用程序设计师决定。
  • XdbeSwapBuffers可以在一次调用中交换许多窗口。
  • 交换时XdbeSwapBuffers可能有不同的行为: '未定义','背景','未触动','复制'。阅读链接 详情。

为了在交换到预定义颜色后清除,“背景”交换行为是可行的方法。要清除的内容可以通过X配置,可能是像素图或单色(背景像素)。

  

命令是否阻塞,即停止直到完成?履行   依赖

使用X的应用程序必须在许多情况下提供自己的同步机制。这将指示异步执行模式,但标准本身并不需要它。我将使用“实现已定义”,强烈建议大多数平台的大多数命令都是异步执行的。