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