C + Linux:如何接管帧缓冲区

C + Linux: How to takeover the framebuffer

我有一个直接渲染到帧缓冲区的 OpenGL 应用程序。

如果我从终端启动应用程序,有时我会看到光标在我的应用程序后面闪烁。同样,如果我从 X 中的终端仿真器内部启动它,如果我四处移动鼠标,我会瞥见鼠标在后面移动。

我的应用程序目前以 45fps 的速度呈现,因此低帧率应该不是问题。

我注意到当 X 启动时它似乎在开始渲染之前清除 shell 但是当你稍后关闭 X 服务器时,发送到 stdout 的诊断内容又回来了所以我怀疑它正在发布明确的命令。

我想做的事情是如何完成的?你能简单地渲染到 fb1 并告诉视频输出从 fb1 显示而不争夺 fb0 吗?然后,当您的应用程序死机时,您可以 return 显示到 fb0 吗?

编辑:

需要说明的是,该应用程序是针对 ARM SoC(飞思卡尔 i.MX6)上的嵌入式系统开发的,配备 Vivante GPU 和 运行 ArchLinux ARM。

I have an OpenGL application that renders directly to the framebuffer.

澄清一下:您是使用 KMS + DRI/DRM + GBM 对吗?

If I start the application from the shell, at times I will see a glimpse of the cursor flashing behind my application.

您在这里混淆了一些术语。 shell 是为您提供诸如作业控制、stdio 重定向、脚本支持等命令的程序。您可能指的是 Linux 内核虚拟终端控制台 (Linux VT)。

当启动直接使用帧缓冲设备的程序时,您必须将您的进程使用的虚拟终端设置为graphics mode (KDSETMODE)。

Likewise, if I start it from inside a terminal emulator in X, I get glimpses of the mouse moving behind if I move the mouse around.

在从 X11 环境启动时,X11 服务器是 VT 和图形模式的独占所有者。所有图形操作都必须通过 X11 服务器。就系统设计而言,任何试图接触不属于它的 fbdev 的程序都应该被打脸(立即发送 SIGSEGV)。不要这样做。期间,不讨论。 X11 服务器拥有 VT,当 VT 处于活动状态时,fbdev。

您可以做的是为您的程序分配一个自己的 VT,并让它使用它。但是,只有当 X11 服务器不是 运行 并且控制台切换到程序的 VT 时,您才会获得图形输出。