一尘不染

Linux中没有X.org的OpenGL

linux

我想在Linux中打开不带X的OpenGL上下文。有什么办法吗?

我知道集成英特尔图形卡硬件是可能的,尽管大多数人的系统中都装有Nvidia卡。我想要一个适用于Nvidia卡的解决方案。

如果除了通过集成的Intel硬件没有别的方法,我想知道如何使用这些硬件是可以的。

X11协议本身太大且太复杂。它提供的鼠标/键盘/平板电脑输入多路复用对于现代程序来说太过淡了。我认为这是阻止Linux桌面改进的最严重障碍,这就是我寻找替代方案的原因。


阅读 465

收藏
2020-06-02

共1个答案

一尘不染

更新(2017年9月17日):

NVIDIA最近发表了一篇文章,详细介绍了如何在无头系统上使用OpenGL,该问题与问题描述非常相似。

综上所述:

  • 链接到libOpenGL.solibEGL.so不是libGL.so。(因此,您的链接器选项应为-lOpenGL -lEGL
  • 呼叫eglGetDisplay,然后eglInitialize初始化EGL。
  • 调用eglChooseConfigconfig属性,EGL_SURFACE_TYPE后跟EGL_PBUFFER_BIT
  • 呼叫eglCreatePbufferSurface,然后eglBindApi(EGL_OPENGL_API);,再eglCreateContexteglMakeCurrent

从那时起,像往常一样执行OpenGL渲染,然后可以随心所欲地涂抹像素缓冲区表面。NVIDIA的这篇补充文章包括一个基本示例和多个GPU的示例。根据应用需要,也可以将PBuffer表面替换为窗口表面或像素图表面。

我很遗憾没有在以前的编辑中对此做更多的研究,但是很好。更好的答案就是更好的答案。


自从2010年我的回答以来,Linux图形领域发生了许多重大变化。因此,一个更新的答案:

如今,nouveau和其他DRI驱动程序已经成熟到OpenGL软件稳定并且总体上表现良好的地步。随着Mesa中EGL
API的引入,现在甚至可以在Linux桌面上编写OpenGL和OpenGL ES应用程序。

您可以将应用程序编写为目标EGL,并且可以在没有窗口管理器甚至合成器的情况下运行它。为此,您可以调用eglGetDisplayeglInitialize并最终调用eglCreateContexteglMakeCurrent,而不是通常的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驱动程序。

2020-06-02