多平面叠加 (MPO)¶
注意
如果您已经阅读了“Display Core Next (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 流水线是什么意思,请查看“Display Core Next (DCN)”,“AMD 硬件流水线”部分)。通常,大多数 AMD 设备以流水线分离配置运行,以实现最佳的单显示输出(例如,每个平面 2 条流水线)。
一个典型的用户空间 MPO 配置——在单个显示器上使用 1 个主平面 + 1 个叠加平面——将使用 4 条流水线,每个平面 2 条。
每个平面(主平面和叠加平面)至少必须使用 1 条流水线,因此对于我们作为示例使用的这个假设硬件,所有 CRTC 的平面总数绝对限制为 4 个。对于使用超过 4 个平面的显示配置,原子提交将被拒绝。再次强调,重要的是每个 DCN 都有不同的限制;这里,我们只是试图提供概念想法。
平面限制¶
AMDGPU 对驱动程序中 DRM 平面的使用施加限制。
不遵循这些限制的提交将被拒绝
叠加平面必须是 ARGB8888 或 XRGB8888 格式
平面不能放置在 CRTC 目标矩形之外
平面不能缩小到其原始尺寸的 1/4 以下
平面不能放大到其原始尺寸的 16 倍以上
并非每个属性都适用于每个平面
只有主平面支持色彩空间和非 RGB 格式
只有叠加平面支持 Alpha 混合
光标限制¶
在我们开始描述光标和 MPO 的一些限制之前,请看下面的图像:
左侧的图像表示 DRM 期望光标和平面如何混合。然而,AMD 硬件处理光标的方式不同,如您在右侧所见;基本上,我们的光标不能绘制在其关联平面之外,因为它被视为平面的一部分。另一个结果是光标继承了平面的颜色和缩放。
由于上述行为,在使用 MPO 时,请勿使用旧版 API 设置光标平面;否则,您可能会遇到意外行为。
简而言之,AMD 硬件没有专用的光标平面。光标附着在另一个平面上,因此继承其父平面的任何缩放或颜色处理。
用例¶
画中画 (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 Tools 验证。可以运行以下测试来验证各种序列和与 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 条)
用户启动视频(MPO 使用了 1 条流水线)
现在,如果用户将视频移动到 2 个显示器中间,视频的一部分将不会是 MPO,因为我们已经使用了 3/3 条流水线。
缩放限制
MPO 无法处理小于 0.25 和大于 x16 的缩放。例如:
如果 4k 视频 (3840x2160) 以窗口模式播放,则窗口的物理大小不能小于 (960x540)。
注意
这些缩放限制可能因 ASIC 而异。
尺寸限制
MPO 的最小尺寸为 12 像素。