合成窗口管理器中的高效离屏窗口缓冲区访问?

时间:2017-10-04 16:40:26

标签: opengl x11 glx

我正在编写一个合成窗口管理器,并且我已成功使用Composite扩展到X11重定向顶层窗口及其子窗口的渲染。

我想将一个窗口重新显示到叠加层,映射它,并从任何其他窗口创建OpenGL纹理以在第一个窗口中显示。

我的理解是GLX_EXT_texture_from_pixmap扩展中定义的函数将纹理绑定到像素图的内容,但在我的应用程序中,我必须连续调用它来更新纹理。

我使用了this page。作为参考,我的代码非常相似。

现在,我的代码从窗口ID创建一个GLXPixmap,绑定纹理,然后使用窗口pixmap调用glXBindTexImageEXT。我怀疑当我这样做时会复制窗口的内容,但我不确定如何正确地执行此操作。

编辑:值得注意的是,从X窗口ID创建GLXPixmap后,我遇到了很多X错误。错误是BadPixmap (invalid Pixmap parameter),但奇怪的是,它似乎有效。无论如何,这似乎表明用户不应该直接从窗口ID创建GLXPixmaps。但是,似乎没有其他明确的方法可以获得对重定向窗口像素图的引用。

编辑:This blog post提供了一些关于这个问题的见解,虽然是从2008年开始,我质疑其中有多少仍然相关。

具体来说,关于内核内存管理的部分:

  

如果我想将GL纹理绑定到与其他应用程序对应的pixmap,并且我不打算通过X服务器这样做,那么显然内核本身必须知道X drawables。如果我从一个从另一个进程创建的进程打开一个命名的pixmap,那么内核中需要有一个统一的内存管理器

     

...

     

你不能用免费的驱动程序做直接的TFP,是那个题外话的结论

0 个答案:

没有答案