【问题标题】:OpenGL ES use in a headless embedded linux platformOpenGL ES 在无头嵌入式 Linux 平台中的使用
【发布时间】:2015-12-15 07:55:02
【问题描述】:

在我们的项目中,我们希望使用 Freescale iMX6Q ARM 处理器的 GPU 来渲染图像,然后通过 gstreamer 管道将其写入 VNC 服务器。 顺序如下:

  • 初始化 OpenGL
  • 对于视频流的每一帧:
    1. 使用 OpenGL ES 将图像渲染到使用帧缓冲区和 渲染缓冲区
    2. 使用glReadPixels()读取图像像素
    3. 将Image数据复制到视频帧中
    4. 将帧推送到视频流

我们使用 Yocto 1.8 作为构建系统,下面的初始化序列源代码在我们的nitrogen6X-lite 原型板(定义了USE_PBUFFER)上工作,但在我们的无头生产板上工作。在生产板上,我们无法初始化“显示”:USE_PBUFFER 已定义或未定义,我们都会收到 0x3003 EGL_BAD_ALLOC 错误。我们有 vfb 内核模块加载了 vfb_enable=1video=vfb 内核选项。开发文件/dev/fb0创建成功。在 yocto 中,我们在默认模式下尝试了 fsl-image-multimedia-fullimage-coreimage-core-directfb 图像,并使用

DISTRO_FEATURES_remove = " x11 wayland"
DISTRO_FEATURES_append = " directfb"

在我们的conf/local.conf 文件中。

我们应该如何在嵌入式 Linux 设置中使用 iMX 处理器的 GPU 在没有显示器的情况下进行离屏渲染?什么是适当的内核设置?使用哪些合适的用户空间函数?

OpenGL 初始化序列的当前用户空间实现:

EGLDisplay display;
EGLSurface surface;
#ifdef  USE_PBUFFER
  display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
#else
 int fbnum = 0; // fbnum is an integer for /dev/fb0 fbnum = 0
 EGLNativeDisplayType native_display = fbGetDisplayByIndex(fbnum);
 EGLNativeWindowType native_window = fbCreateWindow(native_display, 0, 0, 0, 0);
 display = eglGetDisplay(native_display);
#endif  
if (display == EGL_NO_DISPLAY) {
 g_print("Unable to open connection to Window system: 0x%x\n",eglGetError());
 return 0; // <-- Point of failure, both with and without USE_PBUFFER set
}
// ...
if (!eglInitialize(display, &majorVersion, &minorVersion)) {
 g_print("Unable to initialize Display: 0x%x\n",eglGetError());
 return 0;
}
// ...
#ifdef USE_PBUFFER
  surface = eglCreatePbufferSurface(display, config, surfaceAttribList); 
#else
  surface = eglCreateWindowSurface(display, config, native_display, surfaceAttribList);
#endif

当前内核配置的提取,基于 3.14.28

# CONFIG_VGASTATE is not set
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
CONFIG_HDMI=y
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
# CONFIG_FB_BOOT_VESA_SUPPORT is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=m
CONFIG_FB_SYS_COPYAREA=m
CONFIG_FB_SYS_IMAGEBLIT=m
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=m
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
# CONFIG_FB_TILEBLITTING is not set
#
# Frame buffer hardware drivers
#
# CONFIG_FB_IMX is not set
# CONFIG_FB_UVESA is not set
# CONFIG_FB_OPENCORES is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_TMIO is not set
# CONFIG_FB_SMSCUFX is not set
# CONFIG_FB_UDL is not set
# CONFIG_FB_GOLDFISH is not set
CONFIG_FB_VIRTUAL=m
# CONFIG_FB_METRONOME is not set
CONFIG_FB_MX3=y
# CONFIG_FB_BROADSHEET is not set
# CONFIG_FB_AUO_K190X is not set
# CONFIG_FB_MXS is not set
# CONFIG_FB_SIMPLE is not set
# CONFIG_EXYNOS_VIDEO is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
CONFIG_FB_MXC=y
# CONFIG_FB_MXC_SYNC_PANEL is not set
CONFIG_FB_MXC_EDID=y
# CONFIG_FB_MXC_EINK_PANEL is not set

2015 年 9 月 24 日更新: 好吧,作为解决问题的第一步,我们将正确的 MXC 帧缓冲驱动程序添加到内核和设备树中,但我们仍然不断收到 EGL_BAD_ALLOC 错误(无论是否将 x11 和 wayland 添加到图像中)。我们使用以下内核命令行:

[..] video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 gpumem=64M fbmem=32M,32M [..]

此外,设备文件/dev/fb0/dev/fb1 已正确创建,/sys/class/graphics/fb0 上的输出分别为。 fb1 看起来很合理(即与我的台式电脑和氮气参考板相同)

【问题讨论】:

    标签: c linux opengl-es yocto


    【解决方案1】:

    根据https://community.freescale.com/thread/375384,这是 3.14.28 内核与 imx6 处理器的 Vivante 库之间的兼容性问题。因此,解决方案是回到另一个内核版本。

    【讨论】:

      【解决方案2】:

      好的,您遇到的问题是,您正试图打开一个“本机”显示器,该显示器希望在某种显示设备上运行。这显然不适用于无头系统。

      由于您使用的是 EGL,因此您需要某种“显示”,您的特定版本的 EGL 知道如何与之对话。但是,您删除了所有可以解决问题的东西 (DISTRO_FEATURES_remove = " x11 wayland")。现在事情是这样的:

      你对整个事情完全过度思考/过度设计;假设有适当的 Wayland 支持。

      如果您可以使用 Wayland,而不是执行“渲染到 FBO 并附加纹理/渲染缓冲区然后 glReadPixels”舞蹈,您可以实现 VNC Wayland 系统合成器,即提供由支持的系统“显示”的 Wayland 合成器VNC(或者您使用 RealVNC http://www.realvnc.com/products/vnc/wayland/ 的现有实现)。由于 Wayland 协议本身与 GPU 无关,这允许您的应用程序使用 GPU,而图形输出将仅由 VNC 服务器作为合成器重定向到 VNC 服务器。

      【讨论】:

      • 谢谢。 “渲染到 FBO 舞蹈”的原因是,OpenGL 渲染的输出在发送到 VNC 之前与其他视频流混合。我认为,这在您提出的解决方案中也是可能的。
      • @StefanRiesen:是的,它被称为 Wayland compositor 是有原因的。合成器从客户端获取帧缓冲区内容,并可以以它喜欢的任何方式合成它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多