SDV 媒体:管理展示广告

SDV Media 使用 Linux DRM API 向 OEM 应用公开可用显示屏。

DRM 组件之间的交互

图 1. DRM 组件之间的互动。

  • 帧缓冲区是像素数据的来源,由一些外部分配的内存缓冲区提供支持。

  • 平面是 CRTC 使用的图片来源。它与帧缓冲区相关联,可以表示帧缓冲区的裁剪视图。

  • CRTC 表示整体显示流水线。它可以组合多个平面来创建最终视频输出,并将输出分派给多个编码器。

  • 编码器将 CRTC 的视频输出转换为适合特定连接器的形式。

  • 连接器表示可用的显示连接器。例如,HDMI 端口。

如需更深入的说明,请参阅:

API Surface

SDV Media 提供 Linux DRM 接口。虽然可以使用 ioctl 系统调用直接使用这些接口,但对于应用开发,建议使用用户空间帮助程序库。例如:

设置对单个显示屏的渲染

  1. 打开 DRM 设备 (/dev/dri/card*),并使用 Linux DRM API(例如通过 libdrm)在其文件描述符上选择显示屏及其模式。

    通常,主机系统仅公开一个虚拟 GPU 设备,该设备显示为 /dev/dri/card0

  2. 使用 Linux DRM API 分配前缓冲区和后缓冲区。

    建议使用 minigbm's gbm_bo_create() 并使用 gbm_bo_get_fd() 获取 DMA-BUF 文件描述符。

  3. 创建由分配的缓冲区支持的 GL 帧缓冲区。

    1. 使用 eglCreateImageKHREGL_LINUX_DMA_BUF_EXT(来自 EGL_EXT_image_dma_buf_import 扩展程序)从 DRM 缓冲区创建 EGLImage

    2. 创建 GL 纹理,并使用 glEGLImageTargetTexture2DOES(来自 GL_OES_EGL_image 扩展程序)将纹理的存储空间设置为上一步中的 EGLImage

    3. 创建 GL 帧缓冲区,并使用 glFramebufferTexture2D 将其 支持纹理设置为在上一步中创建的纹理。

  4. 如需渲染帧,请执行以下操作:

    1. 绑定其中一个创建的 GL 帧缓冲区。

    2. 使用常用的 GLES API 绘制帧。

    3. 在屏幕上显示帧:使用 Linux DRM API (drmModeAtomicCommit()) 发送 DRM_MODE_PAGE_FLIP_EVENT,其中包含绑定 GL 帧缓冲区使用的 DMA-BUF 文件描述符。

组合来自多个层的视频输出

对于硬件加速的多层(多平面)组合,我们依赖于主机系统将每个层公开为单独的 DRM 连接器(虚拟显示屏),并将它们映射到正确的硬件位置 / 流水线。

如需了解详情,请参阅设置对多个显示屏的渲染

设置对多个显示屏的渲染

  1. 打开 /dev/dri/card* DRM 设备,就像在单显示屏流程中一样。

  2. 列出可用的显示连接器。

    每个显示屏都作为 DRM 设备的单独 DRM 连接器公开。

  3. 对于每个显示连接器:

    1. 选择与连接器兼容的 CRTC。每个连接器都有一个可用编码器列表,每个编码器都指明了它可以与哪些 CRTC 搭配使用。始终至少有一个兼容的 CRTC。

      1. 选择与 CRTC 兼容的平面。

      2. 创建由 GPU 缓冲区支持的 DRM 帧缓冲区。此过程与单显示屏变体相同。

      3. 连接平面、CRTC 和连接器,并在 CRTC 上设置视频模式。

        您可以同时设置多个显示屏的模式,方法是使用原子 API 为每个连接器、CRTC 和平面集设置以下 DRM 属性。

    必要属性的完整列表:

    定位 属性类型说明
    连接器CRTC_IDCRTC ID要分配给连接器的 CRTC 的 ID
    CRTCMODE_IDBlob ID 使用 drmModeCreatePropertyBlob 创建的属性 blob 的 ID,其中包含所选视频模式的 drmModeModeInfo 结构体
    CRTCACTIVE布尔值true,用于将 CRTC 标记为有效
    平面FB_ID帧缓冲区 ID要在屏幕上显示的 DRM 帧缓冲区的 ID
    平面SRC_X像素帧缓冲区源图片矩形的 X 坐标
    平面SRC_Y像素帧缓冲区源图片矩形的 Y 坐标
    平面SRC_W16.16 定点数帧缓冲区源图片矩形的宽度(像素左移 16 位)
    平面SRC_H16.16 定点数帧缓冲区源图片矩形的高度(像素左移 16 位)
    平面CRTC_X像素CRTC 目标图片矩形的 X 坐标
    平面CRTC_Y像素CRTC 目标图片矩形的 Y 坐标
    平面CRTC_W像素CRTC 目标图片矩形的宽度
    平面CRTC_H像素CRTC 目标图片矩形的高度
  4. 输入渲染循环:

    1. 在渲染下一帧之前,等待 CRTC 上的页面翻转事件。

    2. 通过为给定的 CRTC+帧缓冲区安排页面翻转,渲染帧并在屏幕上显示该帧。