【发布时间】:2015-12-15 07:55:02
【问题描述】:
在我们的项目中,我们希望使用 Freescale iMX6Q ARM 处理器的 GPU 来渲染图像,然后通过 gstreamer 管道将其写入 VNC 服务器。 顺序如下:
- 初始化 OpenGL
- 对于视频流的每一帧:
- 使用 OpenGL ES 将图像渲染到使用帧缓冲区和 渲染缓冲区
- 使用
glReadPixels()读取图像像素 - 将Image数据复制到视频帧中
- 将帧推送到视频流
我们使用 Yocto 1.8 作为构建系统,下面的初始化序列源代码在我们的nitrogen6X-lite 原型板(定义了USE_PBUFFER)上工作,但在我们的无头生产板上工作。在生产板上,我们无法初始化“显示”:USE_PBUFFER 已定义或未定义,我们都会收到 0x3003 EGL_BAD_ALLOC 错误。我们有 vfb 内核模块加载了 vfb_enable=1 和 video=vfb 内核选项。开发文件/dev/fb0创建成功。在 yocto 中,我们在默认模式下尝试了 fsl-image-multimedia-full、image-core 和 image-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 看起来很合理(即与我的台式电脑和氮气参考板相同)
【问题讨论】: