Android 13 memperkenalkan library statis yang dapat dikonfigurasi vendor bernama libtonemap, yang menentukan operasi pemetaan nada dan dibagikan dengan proses SurfaceFlinger dan implementasi Hardware Composer (HWC). Fitur ini memungkinkan OEM menentukan dan membagikan algoritma pemetaan nada tampilan mereka antara framework dan vendor, sehingga mengurangi ketidakcocokan dalam pemetaan nada.
Di Android 12 dan yang lebih rendah, operasi pemetaan nada khusus tampilan tidak dibagikan antara HWC, SurfaceFlinger, dan aplikasi. Bergantung pada jalur rendering, untuk konten HDR, hal ini menyebabkan ketidakcocokan dalam kualitas gambar, dengan konten HDR dipetakan nada ke ruang output dengan cara yang berbeda. Hal ini dapat dirasakan dalam skenario seperti rotasi layar, dengan strategi komposisi berubah antara GPU dan DPU, serta perbedaan dalam perilaku rendering antara TextureView dan SurfaceView.
Halaman ini menjelaskan detail antarmuka, penyesuaian, dan validasi library libtonemap.
Antarmuka ke library pemetaan nada
Library libtonemap
berisi implementasi yang didukung CPU dan shader SkSL, yang dapat dihubungkan oleh SurfaceFlinger untuk komposisi backend GPU dan oleh HWC untuk membuat tabel pencarian pemetaan nada (LUT). Titik entri ke libtonemap
adalah
android::tonemap::getToneMapper,
yang menampilkan objek yang mengimplementasikan antarmuka
ToneMapper.
Antarmuka ToneMapper mendukung kemampuan berikut:
Membuat LUT pemetaan nada
Antarmuka
ToneMapper::lookupTonemapGainadalah implementasi CPU dari shader yang ditentukan dalamlibtonemap_LookupTonemapGain. Hal ini digunakan oleh pengujian unit dalam framework, dan dapat digunakan oleh partner untuk mendapatkan bantuan dalam membuat LUT pemetaan nada di dalam pipeline warna mereka.libtonemap_LookupTonemapGainmengambil nilai warna dalam ruang linear absolut yang tidak dinormalisasi, baik dalam RGB linear maupun dalam XYZ, dan menampilkan float yang menjelaskan seberapa banyak warna input dalam ruang linear harus dikalikan.Membuat shader SkSL
Antarmuka
ToneMapper::generateTonemapGainShaderSkSLmenampilkan string shader SkSL, yang diberikan ruang data sumber dan tujuan. Shader SkSL terhubung ke implementasi Skia untukRenderEngine, komponen compositing yang dipercepat GPU untuk SurfaceFlinger. Shader juga terhubung kelibhwui, sehingga pemetaan nada HDR ke SDR dapat dilakukan secara efisien untukTextureView. Karena string yang dihasilkan di-inline 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), denganlinearRGBadalah nilai nits absolut piksel RGB dalam ruang linear danxyzadalahlinearRGByang dikonversi menjadi XYZ. - Metode helper apa pun 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 uniform SkSL
Antarmuka
ToneMapper::generateShaderSkSLUniformsmenampilkan hal berikut, yang diberikan metadatastructyang menjelaskan metadata dari berbagai standar HDR dan kondisi tampilan:Daftar uniform yang terikat oleh shader SkSL.
Nilai uniform
in_libtonemap_displayMaxLuminancedanin_libtonemap_inputMaxLuminance. Nilai ini digunakan oleh shader framework saat menskalakan input kelibtonemap, dan menormalkan output jika berlaku.Proses pembuatan uniform tidak bergantung pada ruang data input dan output.
Penyesuaian
Implementasi referensi library
libtonemap
menghasilkan hasil yang dapat diterima. Namun, karena algoritma pemetaan nada yang digunakan oleh komposisi GPU dapat berbeda dengan yang digunakan oleh komposisi DPU, penggunaan implementasi referensi dapat menyebabkan kedipan dalam beberapa skenario seperti animasi rotasi. Penyesuaian dapat mengatasi masalah kualitas gambar khusus vendor tersebut.
OEM sangat dianjurkan untuk mengganti implementasi libtonemap guna
menentukan subclass ToneMapper mereka sendiri, yang ditampilkan oleh getToneMapper.
Saat menyesuaikan implementasi, partner diharapkan melakukan salah satu hal berikut:
- Mengubah implementasi
libtonemapsecara langsung. - Menentukan library statis mereka sendiri, mengompilasi library sebagai library mandiri, dan mengganti file
.alibrarylibtonemapdengan file yang dihasilkan dari library kustom mereka.
Vendor tidak perlu mengubah kode kernel apa pun, tetapi beberapa vendor harus mengomunikasikan detail tentang algoritma pemetaan nada DPU untuk implementasi yang tepat.
Validasi
Ikuti langkah-langkah berikut untuk memvalidasi implementasi Anda:
Putar video HDR di layar standar HDR apa pun yang didukung sistem tampilan Anda , seperti HLG, HDR10, HDR10+, atau DolbyVision.
Alihkan komposisi GPU untuk memastikan tidak ada kedipan yang dapat dirasakan pengguna.
Gunakan perintah
adbberikut 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 implementasi ini:
Banding disebabkan saat target render yang digunakan oleh komposisi GPU memiliki presisi yang lebih rendah daripada nilai umum untuk konten HDR. Misalnya, banding dapat terjadi saat implementasi HWC mendukung format 10-bit buram untuk HDR seperti RGBA1010102 atau P010, tetapi mengharuskan komposisi GPU menulis ke format 8-bit seperti RGBA8888 untuk mendukung alfa.
Pergeseran warna yang halus disebabkan oleh perbedaan kuantisasi jika DPU beroperasi pada presisi yang berbeda dengan GPU.
Setiap masalah ini terkait dengan perbedaan presisi relatif dari hardware yang mendasarinya. Solusi umum adalah memastikan ada langkah dithering di jalur presisi yang lebih rendah, sehingga perbedaan presisi menjadi kurang dapat dirasakan oleh manusia.