多平面覆盖(MPO)¶
注意
如果您已经阅读了“显示核心下一代 (DCN)”,您将从本页获得更多信息。
多平面覆盖(MPO)允许多个帧缓冲区通过显示控制器中的固定功能硬件进行合成,而不是使用图形或计算着色器进行合成。如果这意味着图形/计算管道可以进入低功耗状态,这可以节省一些功耗。总而言之,MPO 可以带来以下好处
减少 GPU 和 CPU 工作负载 - 不需要合成着色器,不需要额外的缓冲区复制,GPU 可以保持空闲。
平面独立的页面翻转 - 无需绑定到全局合成器页面翻转刷新率,降低延迟,独立定时。
注意
请记住,MPO 的重点是节省功耗;如果您想了解有关显示环境中的功耗节省的更多信息,请查看以下链接:电源。
多平面覆盖仅在使用 DRM 原子模型时可用。原子模型仅使用一个用户空间 IOCTL 来配置显示硬件(模式设置、页面翻转等)- drmModeAtomicCommit。要查询硬件资源和限制,用户空间还会调用 drmModeGetResources,该资源会报告平面、CRTC 和连接器的数量。驱动程序可以注册和使用三种类型的 DRM 平面
DRM_PLANE_TYPE_PRIMARY
:主平面代表 CRTC 的“主”平面,主平面是 CRTC 模式设置和翻转操作操作的平面。DRM_PLANE_TYPE_CURSOR
:光标平面代表 CRTC 的“光标”平面。光标平面是由光标 IOCTL 操作的平面DRM_PLANE_TYPE_OVERLAY
:覆盖平面代表所有非主平面、非光标平面。一些驱动程序在内部将这些类型的平面称为“精灵”。
为了说明它的工作原理,让我们看一下向用户空间公开以下平面的设备
4 个主平面(每个 CRTC 1 个)。
4 个光标平面(每个 CRTC 1 个)。
1 个覆盖平面(在 CRTC 之间共享)。
注意
请记住,不同的 ASIC 可能会公开其他数量的平面。
对于此硬件示例,我们有 4 个管道(如果您不知道 AMD 管道是什么意思,请查看“显示核心下一代 (DCN)”,部分“AMD 硬件管道”)。通常,大多数 AMD 设备都以管道拆分配置运行,以获得最佳的单显示器输出(例如,每个平面 2 个管道)。
用户空间典型的 MPO 配置 - 单个显示器上 1 个主平面 + 1 个覆盖平面 - 将看到 4 个管道正在使用,每个平面 2 个。
每个平面(主平面和覆盖平面)必须至少使用 1 个管道,因此对于我们用作示例的这个假设硬件,我们所有 CRTC 的平面总数绝对限制为 4 个。对于使用超过 4 个平面的显示配置,将拒绝原子提交。再次强调,重要的是要强调每个 DCN 都有不同的限制;在这里,我们只是试图提供概念性的想法。
平面限制¶
AMDGPU 对驱动程序中 DRM 平面的使用施加了限制。
对于不遵守这些限制的提交,将拒绝原子提交
覆盖平面必须为 ARGB8888 或 XRGB8888 格式
平面不能放置在 CRTC 目标矩形之外
平面的缩小比例不能超过其原始大小的 1/4x
平面的放大比例不能超过其原始大小的 16x
并非每个属性都可在每个平面上使用
只有主平面具有色彩空间和非 RGB 格式支持
只有覆盖平面具有 Alpha 混合支持
光标限制¶
在我们开始描述有关光标和 MPO 的一些限制之前,请参见下图
左侧的图像表示 DRM 如何期望光标和平面进行混合。但是,AMD 硬件以不同的方式处理光标,如您在右侧看到的;基本上,我们的光标不能绘制在其关联平面之外,因为它被视为平面的一部分。另一个后果是,光标会继承平面的颜色和缩放比例。
由于上述行为,在处理 MPO 时,请勿使用旧版 API 设置光标平面;否则,您可能会遇到意外的行为。
简而言之,AMD HW 没有专用的光标平面。光标附加到另一个平面,因此会继承其父平面的任何缩放或颜色处理。
用例¶
画中画(PIP)播放 - 底层策略¶
视频播放应使用“主平面作为底层”MPO 策略完成。这是一个 2 个平面的配置
1 个 YUV DRM 主平面(例如,NV12 视频)
1 个 RGBA DRM 覆盖平面(例如,ARGB8888 桌面)。合成器应按如下方式为平面准备帧缓冲区:- 覆盖平面包含常规桌面 UI、视频播放器控件和视频字幕 - 主平面包含一个或多个视频
注意
请记住,我们可以将此配置扩展到更多平面,但我们的驱动程序目前尚不支持(也许如果我们将来有用户空间请求,我们可以更改它)。
请参见下面的单视频示例
注意
我们可以将此行为扩展到更多平面,但我们的驱动程序目前尚不支持。
视频缓冲区应直接用于主平面。可以使用属性:CRTC_X、CRTC_Y、CRTC_W 和 CRTC_H 来缩放视频并将其放置在桌面上。主平面还应根据源内容设置颜色编码和颜色范围属性
COLOR_RANGE
、COLOR_ENCODING
覆盖平面应为 CRTC 的本机大小。合成器必须为视频在桌面上的放置位置绘制一个透明的切口(即,将 Alpha 设置为零)。当主平面的帧缓冲区用于标准双缓冲播放时,覆盖平面的缓冲区可以保持静态。
合成器应创建一个与 CRTC 的本机大小匹配的 YUV 缓冲区。每个视频缓冲区都应合成到此 YUV 缓冲区,以进行直接 YUV 扫描输出。主平面应根据源内容设置颜色编码和颜色范围属性:COLOR_RANGE
、COLOR_ENCODING
。但是,请注意每个视频的源色彩空间和编码是否匹配,因为它会影响整个平面。
覆盖平面应为 CRTC 的本机大小。合成器必须为每个视频在桌面上的放置位置绘制一个透明的切口(即,将 Alpha 设置为零)。主平面视频将通过底层可见。当对视频缓冲区进行视频播放合成操作时,覆盖平面的缓冲区可以保持静态。
此内核接口使用 IGT GPU 工具进行验证。可以运行以下测试来验证在各种序列和与 DPMS 和 S3 等操作交互下的定位、混合、缩放
kms_plane@plane-panning-bottom-right-pipe-*-planes
kms_plane@plane-panning-bottom-right-suspend-pipe-*-
kms_plane@plane-panning-top-left-pipe-*-
kms_plane@plane-position-covered-pipe-*-
kms_plane@plane-position-hole-dpms-pipe-*-
kms_plane@plane-position-hole-pipe-*-
kms_plane_multiple@atomic-pipe-*-tiling-
kms_plane_scaling@pipe-*-plane-scaling
kms_plane_alpha_blend@pipe-*-alpha-basic
kms_plane_alpha_blend@pipe-*-alpha-transparant-fb
kms_plane_alpha_blend@pipe-*-alpha-opaque-fb
kms_plane_alpha_blend@pipe-*-constant-alpha-min
kms_plane_alpha_blend@pipe-*-constant-alpha-mid
kms_plane_alpha_blend@pipe-*-constant-alpha-max
多显示器 MPO¶
AMDGPU 在使用多个显示器时支持显示 MPO;但是,此功能行为在很大程度上依赖于合成器的实现。请记住,用户空间可以定义不同的策略。例如,某些操作系统可以使用 MPO 来保护处理视频播放的平面;请注意,对于单个显示器,我们没有太多限制。尽管如此,对于多显示器场景,此操作可能具有更多限制。下面的示例显示了两个显示器中间的视频播放,并且由合成器来定义如何处理它的策略
让我们讨论一下我们在使用带有 MPO 的多显示器时遇到的一些硬件限制。
限制¶
为了简单起见,在讨论硬件限制时,本文档假设一个示例,其中我们有两个显示器,并且视频播放将在不同的显示器之间移动。
硬件限制
从 DCN 概述页面中,每个显示器至少需要一个管道,每个 MPO 平面需要另一个管道。因此,当视频在两个显示器的中间时,我们需要使用 2 个管道。请参见下面的示例,其中我们避免了管道拆分
1 个显示器(1 个管道)+ MPO(1 个管道),我们将使用两个管道
2 个显示器(2 个管道)+ MPO(1-2 个管道);我们将使用 4 个管道。在两个显示器中间的 MPO 需要 2 个管道。
3 个显示器(3 个管道)+ MPO(1-2 个管道),我们需要 5 个管道。
如果我们使用带有多个显示器的 MPO,则用户空间必须决定启用多个 MPO,但代价是限制了支持的外部显示器的数量,或者禁用它以支持多个显示器;这是一个策略决定。例如
当 ASIC 有 3 个管道时,AMD 硬件不支持 2 个带有 MPO 的显示器
当 ASIC 有 4 个管道时,AMD 硬件不支持 3 个带有 MPO 的显示器
让我们简要探讨一下用户空间如何在仅支持三个管道的 ASIC 上处理这两个显示器配置。我们可以有
管道总数为 3
用户点亮 2 个显示器(使用了 3 个管道中的 2 个)
用户启动视频(1 个管道用于 MPO)
现在,如果用户将视频移动到 2 个显示器的中间,则视频的一部分将不会是 MPO,因为我们已经使用了 3/3 个管道。
缩放限制
MPO 不能处理小于 0.25 和大于 x16 的缩放。例如
如果 4k 视频(3840x2160)在窗口模式下播放,则窗口的物理大小不能小于(960x540)。
注意
这些缩放限制可能因 ASIC 而异。
大小限制
最小 MPO 大小为 12 像素。