SDV 媒体:管理展示广告

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

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_ID CRTC ID 要分配给连接器的 CRTC 的 ID
    CRTC MODE_ID blob ID 使用 drmModeCreatePropertyBlob 创建的 属性 blob 的 ID,其中包含所选视频模式的 drmModeModeInfo 结构体
    CRTC ACTIVE bool true,用于将 CRTC 标记为有效
    平面 FB_ID 帧缓冲 ID 要在屏幕上显示的 DRM 帧缓冲的 ID
    平面 SRC_X 像素 帧缓冲源图片矩形的 X 坐标
    平面 SRC_Y 像素 帧缓冲源图片矩形的 Y 坐标
    平面 SRC_W 16.16 定点数 帧缓冲源图片矩形的宽度(像素左移 16 位)
    平面 SRC_H 16.16 定点数 帧缓冲源图片矩形的高度(像素左移 16 位)
    平面 CRTC_X 像素 CRTC 目标图片矩形的 X 坐标
    平面 CRTC_Y 像素 CRTC 目标图片矩形的 Y 坐标
    平面 CRTC_W 像素 CRTC 目标图片矩形的宽度
    平面 CRTC_H 像素 CRTC 目标图片矩形的高度
  4. 输入渲染循环:

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

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