我想在 Linux 中打开一个没有 X 的 OpenGL 上下文。有什么办法吗?
我知道集成英特尔显卡硬件是可能的,尽管大多数人的系统中都有 Nvidia 卡。我想要一个适用于 Nvidia 卡的解决方案。
如果除了通过集成的英特尔硬件别无他法,我想知道这些是如何完成的就可以了。
X11 协议本身过于庞大和复杂。它提供的鼠标/键盘/平板电脑输入多路复用对于现代程序来说太淡化了。我认为这是阻止 Linux 桌面改进的最大障碍,这就是我寻找替代方案的原因。
更新(2017 年 9 月 17 日):
NVIDIA 最近发表了一篇文章,详细介绍了如何在无头系统上使用 OpenGL,这是一个与问题描述的非常相似的用例。
总之:
libOpenGL.so
而libEGL.so
不是libGL.so
. (因此,您的链接器选项应该是-lOpenGL -lEGL
eglGetDisplay
,然后eglInitialize
初始化 EGL。eglChooseConfig
使用 config 属性调用,EGL_SURFACE_TYPE
后跟EGL_PBUFFER_BIT
.eglCreatePbufferSurface
, then eglBindApi(EGL_OPENGL_API);
, theneglCreateContext
和eglMakeCurrent
。从那时起,像往常一样进行 OpenGL 渲染,您可以在任何您喜欢的地方对像素缓冲区表面进行 blit。这篇来自 NVIDIA 的补充文章包括一个基本示例和一个多 GPU 示例。根据应用需要,PBuffer 表面也可以替换为窗口表面或像素图表面。
我很遗憾没有在我之前的编辑中对此进行更多研究,但是哦,好吧。更好的答案是更好的答案。
自从我在 2010 年回答以来,Linux 图形领域发生了许多重大变化。所以,一个更新的答案:
今天,nouveau 和其他 DRI 驱动程序已经成熟到 OpenGL 软件稳定并且总体上表现相当不错的程度。随着 Mesa 中 EGL API 的引入,现在甚至可以在 Linux 桌面上编写 OpenGL 和 OpenGL ES 应用程序。
您可以将应用程序编写为目标 EGL,它可以在没有窗口管理器甚至合成器的情况下运行。为此,您将调用eglGetDisplay
, eglInitialize
, 并最终调用eglCreateContext
and eglMakeCurrent
,而不是通常的 glx 调用来做同样的事情。
我不知道在没有显示服务器的情况下工作的具体代码路径,但 EGL 接受 X11 显示器和 Wayland 显示器,而且我知道 EGL 可以在没有显示服务器的情况下运行。您可以创建 GL ES 1.1、ES 2.0、ES 3.0(如果您有 Mesa 9.1 或更高版本)和 OpenGL 3.1(Mesa 9.0 或更高版本)上下文。Mesa(截至 2013 年 9 月)尚未实现 OpenGL 3.2 Core。
值得注意的是,在 Raspberry Pi 和 Android 上,默认支持 EGL 和 GL ES 2.0(Android < 3.0 上的 1.1)。在 Raspberry Pi 上,我不认为 Wayland 还可以工作(截至 2013 年 9 月),但是您确实可以使用包含的二进制驱动程序在没有显示服务器的情况下获得 EGL。如果您感兴趣的话,您的 EGL 代码也应该可以移植到 iOS(只需最少的修改)。
以下是过时的,以前接受的帖子:
我想在 linux 中打开一个没有 X 的 OpenGL 上下文。有什么办法吗?
我相信 Mesa 提供了一个帧缓冲目标。如果它完全提供任何硬件加速,那么它只会与已经适应支持这种用途的开源驱动程序的硬件一起使用。
Gallium3D 也不成熟,据我所知,甚至在路线图上都没有对此的支持。
我想得到一个适用于 nvidia 卡的解决方案。
没有一个。时期。
NVIDIA 只提供 X 驱动程序,而 Nouveau 项目还不成熟,不支持您正在寻找的那种用途,因为他们目前只专注于 X11 驱动程序。
您可能对名为 Wayland 的项目感兴趣
你看过这个页面吗? http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_
它可能有点过时了。我还没有尝试过,但我会欣赏更多这种类型的文档。
截至今天,可能一个好主意是遵循 Wayland compositor-drm.c 实现: http ://cgit.freedesktop.org/wayland/weston/tree/src/compositor-drm.c
https://gitlab.freedesktop.org/mesa/kmscube/是一个很好的 OGL(或 OGLES)硬件加速渲染的参考实现,没有 X11 或 Wayland 依赖。
你可以看看Android是如何解决这个问题的。请参阅 Android-x86 项目。
Android 使用带有 egl 和 opengles 的 mesa。Android 有自己的简单 Gralloc 组件,用于模式设置和图形分配。最重要的是,他们有 SurfaceFlinger 组件,它是一个合成引擎,它使用 OpenGLES 进行加速。
看不出你为什么不能以类似的方式使用这些组件,甚至不能重用 Android 胶水代码。