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