Android 13 memperkenalkan elemen statis yang dapat dikonfigurasi vendor
library yang disebut libtonemap
, yang menentukan operasi pemetaan nada dan dibagikan
dengan proses SurfaceFlinger dan implementasi Hardware Composer (HWC).
Fitur ini memungkinkan OEM menentukan dan membagikan pemetaan nuansa tampilan mereka
algoritma antara kerangka kerja dan vendor, mengurangi ketidakcocokan nada
pemetaan peta Google.
Sebelum Android 13, pemetaan nada khusus layar tidak dibagikan di antara HWC, SurfaceFlinger, dan aplikasi. Bergantung di jalur rendering, untuk konten HDR, hal ini menyebabkan ketidakcocokan kualitas gambar, konten HDR dipetakan ke ruang output dengan berbagai cara. Ini terlihat dalam skenario seperti rotasi layar, di mana komposisi perubahan strategi antara GPU dan DPU, dan perbedaan dalam rendering perilaku antara TextureView dan SurfaceView.
Halaman ini menjelaskan detail antarmuka, penyesuaian, dan validasi produk
Library libtonemap
.
Antarmuka ke library pemetaan nada
libtonemap
berisi implementasi yang didukung CPU dan shader SkSL, yang dapat
disambungkan oleh SurfaceFlinger untuk komposisi backend GPU dan oleh HWC untuk
menghasilkan tabel pencarian pemetaan nada (LUT). Titik entri ke libtonemap
adalah android::tonemap::getToneMapper()
, yang menampilkan objek yang
menerapkan antarmuka ToneMapper
.
Antarmuka ToneMapper
mendukung kemampuan berikut:
Membuat LUT pemetaan nada
Antarmuka
ToneMapper::lookupTonemapGain
adalah sebuah CPU implementasi shader yang ditentukan dalamlibtonemap_LookupTonemapGain()
. Ini digunakan oleh pengujian unit dalam framework, dan dapat digunakan oleh partner untuk bantuan dalam menghasilkan LUT pemetaan nada di dalam pipeline warnanya.libtonemap_LookupTonemapGain()
menggunakan nilai warna secara absolut, ruang linear yang tidak dinormalisasi, baik dalam RGB linear dan dalam XYZ, dan menampilkan float menjelaskan seberapa banyak perkalian warna input dalam ruang linear.Membuat shader SkSL
Antarmuka
ToneMapper::generateTonemapGainShaderSkSL()
menampilkan String shader SkSL, dengan ruang data sumber dan tujuan. Shader SkSL adalah dihubungkan ke implementasi Skia untukRenderEngine
, komponen pengomposisian yang dipercepat GPU untuk SurfaceFlinger. Shader juga dicolokkan kelibhwui
, sehingga pemetaan nada HDR-ke-SDR dapat dilakukan secara efisien untukTextureView
. Karena string yang dihasilkan disisipkan ke dalam shader SkSL lain yang digunakan oleh Skia, shader harus mematuhi aturan berikut:- String shader harus memiliki titik entri dengan
Tanda tangan
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
, denganlinearRGB
adalah nilai nit absolut dari piksel RGB dalam ruang linear danxyz
adalahlinearRGB
dikonversi menjadi XYZ. - Setiap metode bantuan yang digunakan oleh string shader harus diawali dengan
string
libtonemap_
agar definisi shader framework tidak bertentangan. Demikian pula, uniform input harus diawali denganin_libtonemap_
.
- String shader harus memiliki titik entri dengan
Tanda tangan
Membuat seragam SkSL
Antarmuka
ToneMapper::generateShaderSkSLUniforms()
akan menampilkan berikut ini, mengingat metadatastruct
yang menjelaskan metadata dari berbagai HDR standar dan kondisi tampilan:Daftar uniform yang terikat oleh shader SkSL.
Nilai uniform
in_libtonemap_displayMaxLuminance
danin_libtonemap_inputMaxLuminance
. Nilai ini digunakan oleh shader framework saat menskalakan input menjadilibtonemap
, dan menormalisasi output sebagai berlaku.
Saat ini, proses pembuatan uniform tidak bergantung pada input ruang data output.
Penyesuaian
Penerapan referensi library libtonemap
memberikan hasil yang dapat diterima. Namun,
karena algoritma pemetaan nada yang digunakan
oleh komposisi GPU mungkin berbeda dari
yang digunakan oleh komposisi DPU, penerapan referensi dapat menyebabkan
berkedip dalam beberapa skenario, seperti animasi rotasi. Penyesuaian dapat
untuk menyelesaikan masalah kualitas gambar khusus vendor tersebut.
OEM sangat dianjurkan untuk mengganti penerapan libtonemap
untuk
menentukan subclass ToneMapper
-nya sendiri, yang ditampilkan oleh getToneMapper()
.
Saat menyesuaikan penerapan, partner diharapkan untuk melakukan salah satu
berikut ini:
- Ubah implementasi
libtonemap
secara langsung. - Menentukan pustaka statis mereka sendiri, mengompilasi {i>library<i} sebagai {i>standalone<i}, dan
mengganti file
.a
librarylibtonemap
dengan file yang dibuat dari file kustomnya library.
Vendor tidak perlu memodifikasi kode {i>kernel<i} apa pun, tetapi beberapa vendor harus mengkomunikasikan detail tentang algoritma pemetaan nada DPU untuk terlepas dari implementasi layanan.
Validasi
Ikuti langkah-langkah berikut untuk memvalidasi penerapan:
Putar video HDR pada layar dengan standar HDR apa pun yang didukung sistem tampilan, seperti HLG, HDR10, HDR10+, atau DolbyVision.
Alihkan komposisi GPU untuk memastikan tidak ada kedipan yang terlihat oleh pengguna.
Gunakan perintah
adb
berikut untuk mengalihkan komposisi GPU:adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition, 1 to force GPU composition>
Masalah umum
Masalah berikut dapat terjadi dengan penerapan ini:
Banding terjadi ketika target render yang digunakan oleh komposisi GPU lebih rendah presisi dibandingkan nilai standar untuk konten HDR. Misalnya, garis berwarna dapat terjadi ketika implementasi HWC mendukung format 10-bit buram untuk HDR seperti RGBA1010102 atau P010, tetapi mensyaratkan bahwa komposisi GPU menulis ke format 8-bit seperti RGBA8888 untuk mendukung alpha.
Pergeseran warna yang halus disebabkan oleh perbedaan kuantisasi jika DPU beroperasi pada presisi yang berbeda dengan GPU.
Masing-masing masalah ini terkait dengan perbedaan presisi relatif dari perangkat keras yang mendasarinya. Solusi umumnya adalah memastikan bahwa ada hal yang melangkah di jalur presisi yang lebih rendah, sehingga perbedaan presisi lebih kecil dapat disimak.