Android 13 giới thiệu một thư viện tĩnh có thể định cấu hình của nhà cung cấp có tên là libtonemap
, xác định các hoạt động ánh xạ giai điệu và được chia sẻ với các triển khai quy trình SurfaceFlinger và Trình soạn thảo phần cứng (HWC). Tính năng này cho phép các OEM xác định và chia sẻ thuật toán ánh xạ tông màu hiển thị của họ giữa khung và nhà cung cấp, giảm bớt sự không phù hợp trong ánh xạ tông màu.
Trước Android 13, các hoạt động ánh xạ tông màu dành riêng cho màn hình không được chia sẻ giữa HWC, SurfaceFlinger và các ứng dụng. Tùy thuộc vào đường dẫn kết xuất, đối với nội dung HDR, điều này dẫn đến sự không phù hợp về chất lượng hình ảnh, trong đó nội dung HDR được ánh xạ tông màu tới không gian đầu ra theo những cách khác nhau. Điều này có thể nhận thấy trong các tình huống chẳng hạn như xoay màn hình, trong đó chiến lược thành phần thay đổi giữa GPU và DPU cũng như sự khác biệt trong hành vi hiển thị giữa TextureView và SurfaceView.
Trang này mô tả chi tiết về giao diện, tùy chỉnh và xác thực của thư viện libtonemap
.
Giao diện thư viện ánh xạ giai điệu
Thư viện libtonemap
chứa các triển khai được CPU hỗ trợ và trình đổ bóng SkSL, có thể được cắm vào bởi SurfaceFlinger cho thành phần phụ trợ GPU và bởi HWC để tạo bảng tra cứu ánh xạ tông màu (LUT). Điểm vào libtonemap
là android::tonemap::getToneMapper()
, trả về một đối tượng triển khai giao diện ToneMapper
.
Giao diện ToneMapper
hỗ trợ các khả năng sau:
Tạo LUT ánh xạ giai điệu
Giao diện
ToneMapper::lookupTonemapGain
là một triển khai CPU của trình đổ bóng được xác định tronglibtonemap_LookupTonemapGain()
. Điều này được sử dụng bởi các thử nghiệm đơn vị trong khuôn khổ và có thể được các đối tác sử dụng để hỗ trợ tạo LUT ánh xạ tông màu bên trong đường dẫn màu của họ.libtonemap_LookupTonemapGain()
nhận các giá trị màu trong không gian tuyến tính tuyệt đối, không chuẩn hóa, cả trong RGB tuyến tính và XYZ, đồng thời trả về một số float mô tả mức độ nhân các màu đầu vào trong không gian tuyến tính.Tạo trình đổ bóng SkSL
Giao diện
ToneMapper::generateTonemapGainShaderSkSL()
trả về một chuỗi đổ bóng SkSL, được cung cấp một không gian dữ liệu nguồn và đích. Trình tạo bóng SkSL được cắm vào triển khai Skia choRenderEngine
, thành phần tổng hợp được tăng tốc GPU cho SurfaceFlinger. Trình đổ bóng cũng được cắm vàolibhwui
để ánh xạ tông màu HDR sang SDR có thể được thực hiện hiệu quả choTextureView
. Vì chuỗi đã tạo được xếp thẳng vào các trình tạo bóng SkSL khác được Skia sử dụng, nên trình tạo bóng phải tuân thủ các quy tắc sau:- Chuỗi shader phải có một điểm vào với chữ ký
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
, trong đólinearRGB
là giá trị của nits tuyệt đối của pixel RGB trong không gian tuyến tính vàxyz
làlinearRGB
được chuyển đổi thành XYZ. - Bất kỳ phương thức trợ giúp nào được sử dụng bởi chuỗi shader phải được thêm tiền tố vào chuỗi
libtonemap_
để các định nghĩa shader khung không xung đột. Tương tự, đồng phục đầu vào phải có tiền tố làin_libtonemap_
.
- Chuỗi shader phải có một điểm vào với chữ ký
Tạo đồng phục SkSL
Giao diện
ToneMapper::generateShaderSkSLUniforms()
trả về thông tin sau, được cung cấp mộtstruct
siêu dữ liệu mô tả siêu dữ liệu từ các tiêu chuẩn HDR và điều kiện hiển thị khác nhau:Một danh sách các đồng phục được ràng buộc bởi một SkSL shader.
Các giá trị thống nhất
in_libtonemap_displayMaxLuminance
vàin_libtonemap_inputMaxLuminance
. Các giá trị này được sử dụng bởi các trình đổ bóng khung khi chia tỷ lệ đầu vào thànhlibtonemap
và chuẩn hóa đầu ra nếu có.
Hiện tại, quá trình tạo đồng phục không liên quan đến không gian dữ liệu đầu vào và đầu ra.
tùy biến
Việc triển khai tham chiếu của thư viện libtonemap
tạo ra kết quả có thể chấp nhận được. Tuy nhiên, vì thuật toán ánh xạ tông màu được sử dụng bởi thành phần GPU có thể khác với thuật toán được sử dụng bởi thành phần DPU, nên việc sử dụng triển khai tham chiếu có thể gây ra hiện tượng nhấp nháy trong một số trường hợp, chẳng hạn như hoạt ảnh xoay. Tùy chỉnh có thể giải quyết các vấn đề về chất lượng hình ảnh của nhà cung cấp cụ thể như vậy.
Các OEM được khuyến khích ghi đè việc triển khai libtonemap
để xác định lớp con ToneMapper
của riêng họ, được trả về bởi getToneMapper()
. Khi tùy chỉnh triển khai, các đối tác phải thực hiện một trong các thao tác sau:
- Sửa đổi trực tiếp việc triển khai
libtonemap
. - Xác định thư viện tĩnh của riêng họ, biên dịch thư viện thành một thư viện độc lập và thay thế tệp
.a
của thư việnlibtonemap
bằng tệp được tạo từ thư viện tùy chỉnh của họ.
Các nhà cung cấp không cần sửa đổi bất kỳ mã hạt nhân nào, nhưng nhiều nhà cung cấp phải thông báo chi tiết về các thuật toán ánh xạ giai điệu DPU để triển khai đúng cách.
Thẩm định
Thực hiện theo các bước sau để xác thực việc triển khai của bạn:
Phát video HDR trên màn hình của bất kỳ tiêu chuẩn HDR nào mà hệ thống hiển thị của bạn hỗ trợ , chẳng hạn như HLG, HDR10, HDR10+ hoặc DolbyVision.
Chuyển đổi thành phần GPU để đảm bảo rằng không có hiện tượng nhấp nháy mà người dùng có thể cảm nhận được.
Sử dụng lệnh
adb
sau để chuyển đổi thành phần GPU:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Các vấn đề chung
Các vấn đề sau đây có thể xảy ra với việc triển khai này:
Phân dải xảy ra khi mục tiêu hiển thị được sử dụng bởi thành phần GPU có độ chính xác thấp hơn giá trị điển hình cho nội dung HDR. Ví dụ: tạo dải có thể xảy ra khi triển khai HWC hỗ trợ các định dạng 10 bit mờ cho HDR, chẳng hạn như RGBA1010102 hoặc P010, nhưng yêu cầu thành phần GPU đó ghi vào định dạng 8 bit như RGBA8888 để hỗ trợ alpha.
Sự chuyển màu tinh tế là do sự khác biệt về lượng tử hóa gây ra nếu DPU hoạt động ở độ chính xác khác với GPU.
Mỗi vấn đề này đều liên quan đến sự khác biệt về độ chính xác tương đối của phần cứng bên dưới. Một giải pháp thay thế điển hình là đảm bảo rằng có một bước phối màu trong các đường dẫn có độ chính xác thấp hơn, làm cho bất kỳ sự khác biệt về độ chính xác nào con người khó nhận thấy hơn.