【问题标题】:OpenGL without X.org in linuxLinux中没有X.org的OpenGL
【发布时间】:2011-03-20 14:11:17
【问题描述】:

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

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

如果除了通过集成的 Intel 硬件别无他法,我想知道这些是如何完成的就可以了。

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

【问题讨论】:

  • @nos:libSDL 采用 X11 施加的相同限制。例如:wacom 数位板的显示分辨率受到限制,而数位板本身的分辨率是显示器的十倍!我听说过大 dpi 鼠标也有类似的问题。
  • "X11 协议...太大太复杂。"也许吧,但是您是否见过 ATI/NVidia 支持的 X 的非常流行的替代品?我的建议是坚持任何可用和支持的东西,无论你喜欢与否。此外,您不必直接处理 X。有跨平台库,如 SDL(游戏)和 Qt 4(用于 gui)。如果您不喜欢 X,请使用更高级别的 API。当 X 将被其他东西替换时,您的 API 将被更新,您不必重写所有内容。就像 Windows 上的 WinAPI - 它仍然可用,但您不必直接使用它。
  • @Cheery:现在,关于您的问题,请参阅:superuser.com/questions/115330/…。如果您想尝试制作桌面环境,我建议您使用 SDL 制作游戏 GUI 系统。将非常接近“真实的东西”,没有所有的麻烦。请记住,即使您做出了不错的 X 替代品,也需要数年时间才能被采用。
  • 透明网络是大多数人不需要的利基市场。如果你真的需要这样的东西,你会使用 plan9。
  • Qt 4 具有“QWS”,它是一个不需要 X11 并且支持 OpenGL 的虚拟帧缓冲区。我想值得一试。

标签: linux opengl x11 nvidia


【解决方案1】:

更新(2017 年 9 月 17 日):

NVIDIA 最近发表了一篇文章detailing how to use OpenGL on headless systems,与问题描述的用例非常相似。

总结:

  • 链接到libOpenGL.solibEGL.so 而不是libGL.so。 (因此,您的链接器选项应该是 -lOpenGL -lEGL
  • 调用eglGetDisplay,然后调用eglInitialize 来初始化EGL。
  • 调用eglChooseConfig,配置属性EGL_SURFACE_TYPE,后跟EGL_PBUFFER_BIT
  • 致电eglCreatePbufferSurface,然后是eglBindApi(EGL_OPENGL_API);,然后是eglCreateContexteglMakeCurrent

从那时起,像往常一样进行 OpenGL 渲染,您可以在任何您喜欢的地方对像素缓冲区表面进行 blit。 This supplementary article from 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


以下是过时的、以前接受的帖子:

我想在 linux 中打开一个没有 X 的 OpenGL 上下文。有什么办法吗?

我相信 Mesa 提供了一个帧缓冲目标。如果它完全提供任何硬件加速,那么它只会与有开源驱动程序的硬件一起支持这种用途。

据我所知,Gallium3D 还不成熟,甚至在路线图上都没有对此的支持。

我想要一个适用于 nvidia 卡的解决方案。

没有。期间。

NVIDIA 只提供 X 驱动程序,Nouveau 项目还不成熟,不支持您正在寻找的那种用途,因为他们目前只专注于 X11 驱动程序。

【讨论】:

  • 我认为这不是一个好的答案,因为它不再正确并且不提供解决方案。 Weston/wayland 适用于 nouveau,因此 opengl 适用于不带 X 的 NVIDIA 卡。关于努力项目不成熟的 cmets 也往往很快老化。
  • @elmarco 我会在今天晚些时候有空的时候修改我的答案。你说得对;我的回答已经过时了。但公平地说,我是在 2010 年年中发布的,当时 Wayland 还是一个原型。
【解决方案2】:

您可能对名为 Wayland 的项目感兴趣

http://en.wikipedia.org/wiki/Wayland_%28display_server%29

【讨论】:

    【解决方案3】:

    你看过这个页面吗? 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

    【讨论】:

      【解决方案4】:

      https://gitlab.freedesktop.org/mesa/kmscube/ 是一个很好的 OGL(或 OGLES)硬件加速渲染的参考实现,不依赖 X11 或 Wayland。

      【讨论】:

        【解决方案5】:

        您可以查看 Android 如何解决此问题。请参阅 Android-x86 项目。

        Android 使用带有 egl 和 opengles 的 mesa。 Android 有自己的简单 Gralloc 组件,用于模式设置和图形分配。除此之外,他们还有 SurfaceFlinger 组件,这是一个合成引擎,它使用 OpenGLES 进行加速。

        不明白为什么不能以类似的方式使用这些组件,甚至重用 Android 胶水代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多