工具/软件:Linux
我在定制板上使用 AM5728。 我有2个摄像头连接到2个 VIP 端口。 我使用 V4L2成功地从这些端口捕获帧、并使用自定义 OpenGL 着色器将它们合成到 SGX GPU 中。 我正在使用 DMABUF 导入扩展将纹理上传到 GPU、从而不存在 memcpy。 我能够从 GPU 获取最终的 DMABUF。 在我调用"drmModePageFlip"后、生成的视频同时显示在 HDMI 监视器以及连接的 LCD 上。
因此、大多数管道工作正常。
我的下一个挑战是使用 Qt 的 linuxfb 插件将 GUI 呈现到 fb0中。 我编写了一个非常简单的 Qt 应用程序、在 fb0上显示小工具。 如果我启动板并运行此应用程序(在打开 omapdrm、配置 GPU 和创建 OpenGL Surface 之前),则简单的 GUI 在 LCD 上显示正常。 但是、如果我创建 OpenGL 表面并将 DMABUF 呈现到屏幕、然后运行简单的 Qt 应用、则无法在屏幕上看到 GUI。 此时、我可以在屏幕上将/dev/fb0扫描到文件、并在图像查看器中进行查看。 Qt 明确将 GUI 绘制到/dev/fb0.中 配置 GPU 似乎会导致一些冲突、从而阻止/dev/fb0内容与视频流一起显示。
我想我需要将 GUI 提交给着色器作为纹理和合成它,但我认为这意味着我需要在 每个呈现调用中创建一个 dumb DMABUF (DRM_IOCTL_MODE_CREASE_DUB)和 memcpy /dev/fb0数据。 这将会降低我的性能。 如果我可以使用 OpenGL DMABUF 上传扩展、那么它的速度可能会足够快。 问题是、我需要从 OMAP-bo 对象中获取一个 GBM_bo 对象-我没有看到这样做的方法。
我应该使用什么方法来呈现 Qt GUI 以及视频流? 感谢您的任何建议。