Android 13 導入了供應商可設定的靜態值
名為 libtonemap
的程式庫,用於定義色調對應作業,而且會共用
執行 SurfaceFlinger 程序
並實作 Hardware Composer (HWC) 的過程
這項功能可讓原始設備製造商 (OEM) 定義及分享螢幕色調對應
將架構和供應商之間的演算法納入考量,進而減少語意不一致的問題
對應。
在 Android 13 以下版本中,螢幕專屬色調對應 HWC、SurfaceFlinger 和應用程式之間就無法共用作業。視情況而定 導致圖像品質不一致的問題 HDR 內容會以不同方式對應至輸出空間。這個 可清楚辨識的情境,例如螢幕旋轉、組成 GPU 和 DPU 之間的策略差異,以及轉譯方式差異 TextureView 和 SurfaceView 之間的行為
本頁將說明
libtonemap
程式庫。
色調對應程式庫的介面
libtonemap
程式庫包含受 CPU 支援的實作項目和 SkSL 著色器,可
由 SurfaceFlinger 插入以用於 GPU 後端組合,而是由 HWC 插入
產生色調對應查詢表 (LUT)。libtonemap
的進入點
是 android::tonemap::getToneMapper()
,只會傳回
實作 ToneMapper
介面。
ToneMapper
介面支援下列功能:
產生色調對應 LUT
ToneMapper::lookupTonemapGain
介面是 CPUlibtonemap_LookupTonemapGain()
中定義的著色器實作。這個 提供給架構中的單元測試使用,可由合作夥伴用於 協助在其色彩管道中產生色調對應 LUT。libtonemap_LookupTonemapGain()
會採用絕對顏色值 並透過線性 RGB 和 XYZ 進行非正規化線性空間,然後傳回浮點值 描述在線性空間中,輸入色彩的乘數。產生 SkSL 著色器
ToneMapper::generateTonemapGainShaderSkSL()
介面會傳回 為來源和目的地資料空間給定的 SkSL 著色器字串。SkSL 著色器是 插入RenderEngine
的 Skia 實作項目。 適用於 SurfaceFlinger 的 GPU 加速合成元件著色器 已插入libhwui
, 以便有效率地為TextureView
執行 HDR 轉 SDR 色調對應作業。 由於產生的字串會內嵌到 Skia 使用的其他 SkSL 著色器中, 著色器必須遵循下列規則:- 著色器字串必須包含進入點,並加上
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
簽名,其中linearRGB
是線性空間中 RGB 像素的絕對 nit 值 和xyz
則linearRGB
轉換成 XYZ。 - 著色器字串使用的所有輔助方法都必須前面加上
字串
libtonemap_
,這樣架構著色器定義就不會衝突。 同樣地,輸入統一編號的開頭必須加上in_libtonemap_
。
- 著色器字串必須包含進入點,並加上
產生 SkSL 制服
ToneMapper::generateShaderSkSLUniforms()
介面會傳回 擷取自一個中繼資料struct
,用來說明來自不同 HDR 的中繼資料 標準和顯示條件受 SkSL 著色器繫結的製服清單。
統一值
in_libtonemap_displayMaxLuminance
和in_libtonemap_inputMaxLuminance
。這些值會供架構著色器使用 將輸入縮放為libtonemap
的情況,並將輸出內容正規化為
目前產生統一表單的程序並不侷限於輸入內容, 輸出資料空間
自訂
libtonemap
程式庫的參照實作會產生可接受的結果。不過
因為 GPU 組合使用的色調對應演算法
DPU 組成組合,使用參照實作可能會導致
在某些情況下 (例如旋轉動畫) 會出現閃爍情形。自訂可以
解決這類供應商特有的圖片品質問題
強烈建議原始設備製造商 (OEM) 覆寫 libtonemap
的實作,以便
定義自己的 ToneMapper
子類別,這個子類別由 getToneMapper()
傳回。
自訂實作方式時,合作夥伴應採取下列其中一種做法:
包括:
- 直接修改
libtonemap
的實作方式。 - 定義自己的靜態程式庫,將程式庫編譯成獨立程式庫,並且
將
libtonemap
程式庫的.a
檔案替換為根據自訂內容產生的檔案 資源庫。
供應商不需要修改任何核心程式碼,但多個供應商必須 提供詳細的 DPU 色調對應演算法資訊 。
驗證
請按照下列步驟驗證導入狀態:
螢幕只要符合螢幕系統支援的任何 HDR 標準,即可播放 HDR 影片。 例如 HLG、HDR10、HDR10+ 或 DolbyVision。
切換 GPU 組合,確保使用者不會察覺發生閃爍情形。
使用下列
adb
指令切換 GPU 組合:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
常見問題
這種導入方式可能發生下列問題:
當 GPU 組合使用的轉譯目標低於 比 HDR 內容的一般值更精確例如,帶狀網路 當 HWC 實作支援不透明 10 位元的 HDR 格式時, RGBA1010102 或 P010,但要求 GPU 組合寫入 8 位元格式 以便支援 alphaA8888
如果 DPU 則因量化差異而產生細微的色彩轉變, 作業的精確度與 GPU 不同。
這些問題都與 基礎硬體典型的解決方法就是確保 步驟,將任何精確度差異都降低至人為模型 一般認為。