OpenGL窗口管理器 - 多进程合成

时间:2014-09-23 14:56:36

标签: opengl graphics window-managers multiprocess compositing

我想设计一个能够合成多个进程输出的简单窗口管理器。我的第一个想法是只为独立应用程序使用不同的线程,所以我只使用一个上下文并在应用程序和管理器主线程之间共享它,但是在第二个想法听起来不是一个好主意,因为任何一个线程崩溃将终止一切。

所以我决定它必须实际支持应用程序的专用流程,但这让我想到了这个问题,即我如何将来自不同流程的输出拼接在一起并以高性能的方式。将数据从GPU复制到CPU以共享系统内存根本不是一种选择。从OpenGL并行常见问题解答中可以清楚地看出,使用多个进程中的一个上下文是不可能的,除非它是间接的,导致性能非常低。

那么,现有的窗口管理器是如何做到的呢?当然,我不期望任何低级细节,只是一般概念概述。

1 个答案:

答案 0 :(得分:1)

  

那么,现有的窗口管理器是如何做到的呢?当然,我不期望任何低级细节,只是一般概念概述。

在X11中有X11扩展GLX_ARB_texture_from_pixmap和Render,允许移动窗口离屏并将窗口的X11像素图绑定为OpenGL中的纹理。这个实现方式的名称称为AIGLX(Accelerated Indirect GLX),尽管名称不依赖于间接GLX上下文。在这种情况下,间接意味着一切都在显示服务器上发生。

您的合成窗口管理器永远不会直接与其他进程通信。相反,它只使用X11服务器中已存在的资源和数据来合成最终结果。

这与Wayland不同,其中合成者直接与其他进程交谈以交换帧缓冲信息。我个人更喜欢X11型号,但这只是我的观点。