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