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.
Sebelum Android 13, operasi pemetaan warna spesifik per layar tidak dibagikan antara HWC, SurfaceFlinger, dan aplikasi. Bergantung pada jalur rendering, untuk konten HDR, hal ini menyebabkan ketidakcocokan dalam kualitas gambar, di mana konten HDR dipetakan ke ruang output dengan cara yang berbeda. Hal ini dapat dirasakan dalam skenario seperti rotasi layar, saat strategi komposisi berubah antara GPU dan DPU, serta dalam perbedaan perilaku rendering antara TextureView dan SurfaceView.
Halaman ini menjelaskan antarmuka, penyesuaian, dan detail 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 (LUT) pemetaan warna. Titik entri ke libtonemap
adalah android::tonemap::getToneMapper()
, yang menampilkan objek yang
menerapkan antarmuka ToneMapper
.
Antarmuka ToneMapper
mendukung kemampuan berikut:
Membuat LUT pemetaan warna
Antarmuka
ToneMapper::lookupTonemapGain
adalah implementasi shader CPU yang ditentukan dalamlibtonemap_LookupTonemapGain()
. Ini digunakan oleh pengujian unit dalam framework, dan dapat digunakan oleh partner untuk mendapatkan bantuan dalam membuat LUT pemetaan warna di dalam pipeline warna mereka.libtonemap_LookupTonemapGain()
menggunakan nilai warna dalam ruang linear yang tidak dinormalisasi dan absolut, baik dalam RGB linear maupun XYZ, dan menampilkan float yang menjelaskan seberapa banyak warna input harus dikalikan dalam ruang linear.Membuat shader SkSL
Antarmuka
ToneMapper::generateTonemapGainShaderSkSL()
menampilkan string shader SkSL, yang diberikan sumber dan ruang data tujuan. Shader SkSL dihubungkan ke implementasi Skia untukRenderEngine
, komponen komposit yang diakselerasi GPU untuk SurfaceFlinger. Shader juga terhubung 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 nits absolut piksel RGB dalam ruang linear danxyz
adalahlinearRGB
yang dikonversi menjadi XYZ. - Setiap metode helper yang digunakan oleh string shader harus diawali dengan
string
libtonemap_
agar definisi shader framework tidak berkonflik. Demikian pula, input seragam harus diawali denganin_libtonemap_
.
- String shader harus memiliki titik entri dengan tanda tangan
Membuat seragam SkSL
Antarmuka
ToneMapper::generateShaderSkSLUniforms()
menampilkan berikut, mengingat metadatastruct
yang menjelaskan metadata dari berbagai standar HDR dan kondisi tampilan:Daftar seragam yang terikat oleh shader SkSL.
Nilai seragam
in_libtonemap_displayMaxLuminance
danin_libtonemap_inputMaxLuminance
. Nilai ini digunakan oleh shader framework saat menskalakan input kelibtonemap
, dan menormalisasi output sebagaimana berlaku.
Saat ini, proses pembuatan seragam tidak bergantung pada ruang data input dan output.
Penyesuaian
Implementasi referensi library libtonemap
menghasilkan hasil yang dapat diterima. Namun,
karena algoritma pemetaan warna yang digunakan oleh komposisi GPU dapat berbeda dengan algoritma yang digunakan oleh komposisi DPU, penggunaan implementasi referensi dapat menyebabkan kedipan dalam beberapa skenario seperti animasi rotasi. Penyesuaian dapat
menyelesaikan 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 penerapan, partner diharapkan melakukan salah satu hal berikut:
- Ubah penerapan
libtonemap
secara langsung. - Menentukan library statis mereka sendiri, mengompilasi library sebagai standalone, dan mengganti file
.a
librarylibtonemap
dengan 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 penerapan yang tepat.
Validasi
Ikuti langkah-langkah berikut untuk memvalidasi penerapan Anda:
Putar video HDR di layar dengan 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
adb
berikut untuk mengganti 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 disebabkan saat target render yang digunakan oleh komposisi GPU memiliki presisi yang lebih rendah daripada nilai umum untuk konten HDR. Misalnya, masalah garis warna (banding) dapat terjadi saat penerapan 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 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 tidak terlalu terlihat oleh manusia.