Android 13 เปิดตัวไลบรารีแบบคงที่ที่กําหนดค่าได้ซึ่งเรียกว่า libtonemap
ซึ่งจะกําหนดการทํางานของการปรับโทนสีและแชร์กับกระบวนการ SurfaceFlinger และการใช้งาน Hardware Composer (HWC)
ฟีเจอร์นี้ช่วยให้ OEM กำหนดและแชร์อัลกอริทึมการปรับโทนสีของจอแสดงผลระหว่างเฟรมเวิร์กกับผู้ให้บริการได้ ซึ่งจะช่วยลดการจับคู่โทนสีที่ไม่ตรงกัน
ก่อน Android 13 การดำเนินการการปรับโทนสีเฉพาะจอแสดงผลไม่ได้แชร์ระหว่าง HWC, SurfaceFlinger และแอป สำหรับเนื้อหา HDR ปัญหานี้อาจส่งผลให้คุณภาพของภาพไม่ตรงกัน ทั้งนี้ขึ้นอยู่กับเส้นทางการแสดงผล โดยเนื้อหา HDR ได้รับการแมปโทนสีไปยังพื้นที่เอาต์พุตด้วยวิธีที่แตกต่างกัน ปัญหานี้สังเกตได้ในกรณีต่างๆ เช่น การหมุนหน้าจอที่กลยุทธ์การจัดองค์ประกอบจะเปลี่ยนไประหว่าง GPU กับ DPU และความแตกต่างของลักษณะการแสดงผลระหว่าง TextureView กับ SurfaceView
หน้านี้อธิบายอินเทอร์เฟซ การปรับแต่ง และรายละเอียดการตรวจสอบของไลบรารีlibtonemap
อินเทอร์เฟซกับไลบรารีการแมปโทนสี
ไลบรารี libtonemap
มีการใช้งานที่รองรับ CPU และเชิดที่ SkSL ซึ่ง SurfaceFlinger สามารถเสียบเพื่อใช้กับการจัดองค์ประกอบแบ็กเอนด์ GPU และ HWC เพื่อสร้างตารางการค้นหา (LUT) การปรับโทนสี จุดแรกเข้าของ libtonemap
คือ android::tonemap::getToneMapper()
ซึ่งจะแสดงผลออบเจ็กต์ที่ใช้อินเทอร์เฟซ ToneMapper
อินเทอร์เฟซ ToneMapper
รองรับความสามารถต่อไปนี้
สร้าง LUT การปรับโทนสี
อินเทอร์เฟซ
ToneMapper::lookupTonemapGain
คือการใช้งาน CPU ของโปรแกรมเปลี่ยนสีที่กำหนดไว้ในlibtonemap_LookupTonemapGain()
ข้อมูลนี้ใช้กับการทดสอบ 1 หน่วยในเฟรมเวิร์ก และพาร์ทเนอร์สามารถใช้เพื่อขอความช่วยเหลือในการสร้าง LUT การปรับโทนสีในไปป์ไลน์สีได้libtonemap_LookupTonemapGain()
จะรับค่าสีในพื้นที่เชิงเส้นแบบสัมบูรณ์ซึ่งไม่ได้ปรับมาตรฐาน ทั้งในรูปแบบ RGB เชิงเส้นและ XYZ และจะแสดงผลเป็นค่าลอยตัวที่อธิบายจำนวนที่จะคูณสีอินพุตในพื้นที่เชิงเส้นสร้างโปรแกรมเปลี่ยนรูปแบบ SkSL
อินเทอร์เฟซ
ToneMapper::generateTonemapGainShaderSkSL()
จะแสดงผลสตริงโปรแกรมเปลี่ยนสี SkSL โดยอิงตามพื้นที่ข้อมูลต้นทางและปลายทาง โปรแกรมเปลี่ยนรูปแบบ SkSL จะเสียบเข้ากับการใช้งาน Skia สำหรับRenderEngine
ซึ่งเป็นคอมโพเนนต์การจัดวางองค์ประกอบที่เร่งด้วย GPU สำหรับ SurfaceFlinger นอกจากนี้ Shader ยังเสียบเข้ากับlibhwui
ด้วย เพื่อให้TextureView
ทำการแมปโทนสี HDR เป็น SDR ได้อย่างมีประสิทธิภาพ เนื่องจากสตริงที่สร้างขึ้นจะฝังอยู่ในโปรแกรมเปลี่ยนรูปแบบ SkSL อื่นๆ ที่ Skia ใช้ โปรแกรมเปลี่ยนรูปแบบจึงต้องเป็นไปตามกฎต่อไปนี้- สตริงโปรแกรมเปลี่ยนสีต้องมีจุดแรกเข้าที่มีลายเซ็น
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
โดยที่linearRGB
คือค่าของ Nits สัมบูรณ์ของพิกเซล RGB ในเชิงเส้น และxyz
คือlinearRGB
ที่แปลงเป็น XYZ - เมธอดตัวช่วยที่ใช้โดยสตริง Shader ต้องมีสตริง
libtonemap_
นำหน้าเพื่อให้คําจํากัดความ Shader ของเฟรมเวิร์กไม่ทับซ้อนกัน ในทำนองเดียวกัน อินพุตแบบเหมือนกันต้องขึ้นต้นด้วยin_libtonemap_
- สตริงโปรแกรมเปลี่ยนสีต้องมีจุดแรกเข้าที่มีลายเซ็น
สร้างยูนิฟอร์ม SkSL
อินเทอร์เฟซ
ToneMapper::generateShaderSkSLUniforms()
จะแสดงผลต่อไปนี้เมื่อมีข้อมูลเมตาstruct
ที่อธิบายข้อมูลเมตาจากมาตรฐาน HDR และสภาพการแสดงผลที่แตกต่างกันรายการยูนิฟอร์มที่เชื่อมโยงกับโปรแกรมเปลี่ยนสี SkSL
ค่าแบบเดียวกัน
in_libtonemap_displayMaxLuminance
และin_libtonemap_inputMaxLuminance
โปรแกรมเปลี่ยนสีของเฟรมเวิร์กจะใช้ค่าเหล่านี้เมื่อปรับขนาดอินพุตเป็นlibtonemap
และทำให้เอาต์พุตเป็นมาตรฐานตามความเหมาะสม
ปัจจุบันกระบวนการสร้างยูนิฟอร์มจะไม่สนใจพื้นที่ข้อมูลอินพุตและเอาต์พุต
การปรับแต่ง
การใช้งานอ้างอิงของไลบรารี libtonemap
ให้ผลลัพธ์ที่ยอมรับได้ อย่างไรก็ตาม เนื่องจากอัลกอริทึมการปรับโทนสีที่ใช้โดยองค์ประกอบ GPU อาจแตกต่างจากที่ใช้โดยองค์ประกอบ DPU การใช้การติดตั้งใช้งานอ้างอิงอาจทำให้เกิดภาพกะพริบในบางสถานการณ์ เช่น ภาพเคลื่อนไหวของการหมุน การปรับแต่งจะช่วยแก้ปัญหาคุณภาพรูปภาพเฉพาะผู้ให้บริการดังกล่าวได้
เราขอแนะนําอย่างยิ่งให้ OEM ลบล้างการใช้งาน libtonemap
เพื่อกําหนดคลาสย่อย ToneMapper
ของตนเอง ซึ่ง getToneMapper()
จะแสดงผล
เมื่อปรับแต่งการติดตั้งใช้งาน พาร์ทเนอร์จะต้องดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- แก้ไขการใช้งาน
libtonemap
โดยตรง - กำหนดไลบรารีแบบคงที่ของตนเอง คอมไพล์ไลบรารีแบบสแตนด์อโลน และแทนที่ไฟล์
.a
ของไลบรารีlibtonemap
ด้วยไฟล์ที่สร้างขึ้นจากไลบรารีที่กำหนดเอง
ผู้ให้บริการไม่จำเป็นต้องแก้ไขโค้ดเคอร์เนล แต่ผู้ให้บริการหลายรายต้องสื่อสารรายละเอียดเกี่ยวกับอัลกอริทึมการปรับโทนสี DPU เพื่อการใช้งานอย่างเหมาะสม
การตรวจสอบความถูกต้อง
ทําตามขั้นตอนต่อไปนี้เพื่อตรวจสอบการติดตั้งใช้งาน
เล่นวิดีโอ HDR บนหน้าจอมาตรฐาน HDR ที่ระบบการแสดงผลรองรับ เช่น HLG, HDR10, HDR10+ หรือ Dolby Vision
สลับใช้การคอมโพสิชัน GPU เพื่อให้แน่ใจว่าไม่มีภาพกะพริบที่ผู้ใช้มองเห็น
ใช้คำสั่ง
adb
ต่อไปนี้เพื่อสลับใช้การคอมโพสิชัน GPUadb 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 บิต เช่น RGBA8888 เพื่อรองรับอัลฟา
การเปลี่ยนสีเล็กน้อยเกิดจากความแตกต่างของการจัดกลุ่มหาก DPU ทำงานด้วยความแม่นยำที่แตกต่างจาก GPU
ปัญหาเหล่านี้เกี่ยวข้องกับความแตกต่างของความแม่นยำแบบสัมพัทธ์ของฮาร์ดแวร์ที่เกี่ยวข้อง วิธีแก้ปัญหาทั่วไปคือตรวจสอบว่ามีขั้นตอนการแรเงาในเส้นทางที่มีความแม่นยำต่ำกว่า ซึ่งจะทำให้ผู้ใช้สังเกตความแตกต่างของความแม่นยำได้น้อยลง