多平面疊加 (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-*-planeskms_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-scalingkms_plane_alpha_blend@pipe-*-alpha-basickms_plane_alpha_blend@pipe-*-alpha-transparant-fbkms_plane_alpha_blend@pipe-*-alpha-opaque-fbkms_plane_alpha_blend@pipe-*-constant-alpha-minkms_plane_alpha_blend@pipe-*-constant-alpha-midkms_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 畫素。