Android 13 เปิดตัวไลบรารีแบบคงที่ที่ผู้ให้บริการกำหนดค่าได้
ชื่อ libtonemap
ซึ่งกำหนดการดำเนินการแมปโทนและแชร์
กับกระบวนการ SurfaceFlinger และการใช้งาน Hardware Composer (HWC)
ฟีเจอร์นี้ช่วยให้ OEM กำหนดและแชร์อัลกอริทึมการแมปโทนการแสดงผลระหว่างเฟรมเวิร์กกับผู้ให้บริการได้ ซึ่งจะช่วยลดความไม่ตรงกันในการแมปโทน
ก่อน Android 13 การดำเนินการแมปโทนเฉพาะจอแสดงผล ไม่ได้แชร์ระหว่าง HWC, SurfaceFlinger และแอป สำหรับเนื้อหา HDR การดำเนินการนี้ทำให้คุณภาพของรูปภาพไม่ตรงกัน เนื่องจากเนื้อหา HDR ได้รับการแมปโทนไปยังพื้นที่เอาต์พุตในรูปแบบต่างๆ ทั้งนี้ขึ้นอยู่กับเส้นทางการแสดงผล ซึ่งสังเกตได้ในสถานการณ์ต่างๆ เช่น การหมุนหน้าจอ ซึ่งกลยุทธ์การคอมโพสิตจะเปลี่ยนระหว่าง GPU กับ DPU และความแตกต่างในลักษณะการแสดงผลระหว่าง TextureView กับ SurfaceView
หน้านี้อธิบายรายละเอียดเกี่ยวกับอินเทอร์เฟซ การปรับแต่ง และการตรวจสอบของlibtonemap
ไลบรารี
อินเทอร์เฟซไปยังไลบรารีการแมปโทนสี
ไลบรารี libtonemap
มีการใช้งานที่ได้รับการสนับสนุนจาก CPU และ Shader 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 นอกจากนี้ เรายังได้ เสียบ Shader เข้ากับlibhwui
เพื่อให้สามารถทำการแมปโทนจาก HDR เป็น SDR ได้อย่างมีประสิทธิภาพสำหรับTextureView
เนื่องจากสตริงที่สร้างขึ้นจะอยู่ใน Shader SkSL อื่นๆ ที่ Skia ใช้ Shader จึงต้องเป็นไปตามกฎต่อไปนี้- สตริง Shader ต้องมีจุดแรกเข้าที่มี
float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz)
ลายเซ็น โดยที่linearRGB
คือค่าของหน่วยนิตสัมบูรณ์ของพิกเซล RGB ในพื้นที่เชิงเส้น และxyz
คือlinearRGB
ที่แปลงเป็น XYZ - วิธีการช่วยใดๆ ที่สตริง Shader ใช้จะต้องมีคำนำหน้าเป็นสตริง
libtonemap_
เพื่อไม่ให้คำจำกัดความ Shader ของเฟรมเวิร์กขัดแย้งกัน ในทำนองเดียวกัน ต้องขึ้นต้นค่าคงที่ของอินพุตด้วย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
ปัญหาแต่ละอย่างเหล่านี้เกี่ยวข้องกับความแตกต่างของความแม่นยำสัมพัทธ์ของฮาร์ดแวร์พื้นฐาน วิธีแก้ปัญหาทั่วไปคือการตรวจสอบว่ามีขั้นตอนการดิทเทอริง ในเส้นทางที่มีความแม่นยำต่ำกว่า ซึ่งจะทำให้ความแตกต่างของความแม่นยำใดๆ สังเกตได้ยากขึ้น