AIDL สำหรับ HAL คอมโพสเซอร์ฮาร์ดแวร์

ตั้งแต่ Android 13 เป็นต้นไป ฮาร์ดแวร์ Composer (HWC) HAL จะกำหนดไว้ใน AIDL และเวอร์ชัน HIDL ตั้งแต่ android.hardware.graphics.composer@2.1 ถึง android.hardware.graphics.composer@2.4 เลิกใช้งานแล้ว

หน้านี้อธิบายความแตกต่างระหว่าง AIDL กับ HIDL HAL สำหรับ HWC รวมถึงการติดตั้งใช้งานและการทดสอบ AIDL HAL

เราขอแนะนำให้ผู้ให้บริการติดตั้งใช้งาน HAL คอมโพเซอร์ AIDL ตั้งแต่ Android 13 แทนเวอร์ชัน HIDL เนื่องจาก AIDL มีข้อดี ดูข้อมูลเพิ่มเติมในส่วนการใช้งาน

ความแตกต่างระหว่าง AIDL กับ HIDL HAL

HAL เครื่องมือแต่ง AIDL ใหม่ชื่อ android.hardware.graphics.composer3 กำหนดไว้ใน IComposer.aidl โดยแสดง API ที่คล้ายกับ HIDL HAL android.hardware.graphics.composer@2.4 โดยมีการเปลี่ยนแปลงต่อไปนี้

  • การนํา Fast Message Queue (FMQ) ออกเพื่อใช้คําสั่งที่แบ่งได้

    AIDL HAL กำหนดอินเทอร์เฟซคำสั่งโดยอิงตามประเภท Parcelable ประเภทที่พิมพ์ออกมาแรงมาก ซึ่งตรงข้ามกับคำสั่งแบบอนุกรมผ่าน FMQ ใน HIDL ซึ่งจะให้อินเทอร์เฟซที่เสถียรสําหรับคําสั่งและคำจำกัดความที่อ่านง่ายขึ้นเกี่ยวกับวิธีตีความเพย์โหลดคําสั่ง

    วิธีการ executeCommands จะกำหนดไว้ใน IComposerClient.aidl ดังนี้

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    โดยที่แต่ละคำสั่งเป็นประเภทพาร์เซลที่มีการพิมพ์ชัดเจนที่กำหนดไว้ใน DisplayCommand.aidl การตอบกลับคำสั่งเป็นพาร์เซลที่มีการพิมพ์อย่างเข้มงวดที่กำหนดไว้ใน CommandResultPayload.aidl

  • นำ IComposerClient.getClientTargetSupport ออกเนื่องจากไม่มีลูกค้าที่ใช้วิธีการนี้อยู่

  • การแสดงสีเป็นแบบลอยแทนไบต์เพื่อให้สอดคล้องมากขึ้นกับสแต็กกราฟิกด้านบนใน Android ตามที่กำหนดไว้ใน ASurfaceTransaction_setColor

  • การเพิ่มช่องใหม่สำหรับการควบคุมเนื้อหา HDR

    ใน AIDL HAL กลุ่มเลเยอร์ SDR/HDR แบบผสมจะรองรับการลดแสงเลเยอร์ SDR อย่างราบรื่นเมื่อเลเยอร์ HDR ปรากฏพร้อมกันบนหน้าจอ

    ช่อง brightness ใน LayerCommand ให้ SurfaceFlinger ระบุความสว่างต่อเลเยอร์เพื่อให้ HWC หรี่เนื้อหาของเลเยอร์ในพื้นที่แสงเชิงเส้น แทนที่จะเป็นช่องว่างแกมมา

    ช่อง brightness ใน ClientTargetPropertyWithBrightness ให้ HWC ระบุพื้นที่ความสว่างสำหรับองค์ประกอบไคลเอ็นต์ และบอก RenderEngine ว่าจะหรี่เลเยอร์ SDR ในองค์ประกอบไคลเอ็นต์หรือไม่

    ฟิลด์ dimmingStage ช่วยให้ HWC กำหนดค่าได้ว่าเมื่อใดที่ RenderEngine ควรปรับความสว่างของเนื้อหาให้สลัว วิธีนี้รองรับ ColorModes ที่ผู้ให้บริการกำหนด ซึ่งอาจต้องการลดความสว่างในพื้นที่แกมมาเพื่อให้เพิ่มคอนทราสต์ที่ผู้ให้บริการกำหนดในไปป์ไลน์สีได้

  • การเพิ่มองค์ประกอบ DISPLAY_DECORATION ประเภทใหม่ใน Composition.aidl สำหรับการตกแต่งหน้าจอ

    อุปกรณ์บางเครื่องมีฮาร์ดแวร์เฉพาะเพื่อเพิ่มประสิทธิภาพการวาดหน้ากากอัลฟ่าที่ปรับมุมโค้งมนและส่วนตัดบนจอแสดงผลให้เรียบเนียน อุปกรณ์ที่มีฮาร์ดแวร์ดังกล่าวต้องใช้งาน IComposerClient.getDisplayDecorationSupport เพื่อแสดงผลโครงสร้าง DisplayDecorationSupport ตามที่ระบุไว้ใน DisplayDecorationSupport.aidl ใหม่ โครงสร้างนี้อธิบายเกี่ยวกับ PixelFormat และ AlphaInterpretation ที่เป็นอนุกรมที่อุปกรณ์ต้องการ จากการติดตั้งใช้งานนี้ UI ของระบบจะทำเครื่องหมายเลเยอร์มาสก์อัลฟ่าเป็น DISPLAY_DECORATION ซึ่งเป็นองค์ประกอบประเภทใหม่ที่ใช้ประโยชน์จากฮาร์ดแวร์เฉพาะ

  • การเพิ่มช่อง expectedPresentTime ใหม่ใน DisplayCommand.aidl

    ช่อง expectedPresentTime ช่วยให้ SurfaceFlinger กำหนดเวลาปัจจุบันที่คาดไว้ว่าจะต้องแสดงเนื้อหาปัจจุบันบนหน้าจอเมื่อใด เมื่อมีฟีเจอร์นี้ SurfaceFlinger จะส่งคำสั่งปัจจุบันไปยังการติดตั้งใช้งานก่อนกำหนด ซึ่งช่วยให้ไปป์ไลน์งานองค์ประกอบเพิ่มเติมได้

  • การเพิ่ม API ใหม่เพื่อควบคุมการกำหนดค่าการแสดงผลการเปิดเครื่อง

    ผู้ให้บริการสามารถใช้ BOOT_DISPLAY_CONFIG เพื่อระบุว่ารองรับการกำหนดค่าการแสดงผลเปิดเครื่อง วิธีการ setBootDisplayConfig, clearBootDisplayConfig และ getPreferredBootDisplayConfig ใช้ BOOT_DISPLAY_CONFIG ดังนี้

    • เมื่อใช้ setBootDisplayConfig เฟรมเวิร์กจะแจ้งให้ผู้ให้บริการทราบถึงการกำหนดค่าการแสดงเวลาเปิดเครื่อง ผู้ให้บริการต้องแคชในการกำหนดค่าการแสดงผลการเปิดเครื่องและเปิดเครื่องในการกำหนดค่านี้เมื่อรีบูตครั้งถัดไป หากอุปกรณ์เปิดเครื่องในการกำหนดค่านี้ไม่ได้ ผู้ให้บริการต้องหาการกำหนดค่าที่ตรงกับความละเอียดและอัตราการรีเฟรชของการกำหนดค่านี้ หากไม่มีการกำหนดค่าดังกล่าว ผู้ให้บริการควรใช้การกำหนดค่าการแสดงผลที่ต้องการ

    • เมื่อใช้ clearBootDisplayConfig เฟรมเวิร์กจะแจ้งให้ผู้ให้บริการล้างการกำหนดค่าจอแสดงผลเปิดเครื่อง และเปิดเครื่องในการกำหนดค่าการแสดงผลที่ต้องการในระหว่างการรีบูตครั้งถัดไป

    • เมื่อใช้ getPreferredBootDisplayConfig เฟรมเวิร์กจะค้นหาโหมดการบูตที่ผู้ให้บริการต้องการ

    เมื่อระบบไม่รองรับการกำหนดค่าหน้าจอการเปิดเครื่อง เมธอดเหล่านี้จะแสดงผลค่า UNSUPPORTED

  • การเพิ่ม API ใหม่เพื่อควบคุมตัวจับเวลาไม่มีการใช้งานของจอแสดงผล

    • เมื่อใช้ DISPLAY_IDLE_TIMER ผู้ให้บริการจะระบุได้ว่ามีการใช้ตัวจับเวลาไม่มีการใช้งานสำหรับจอแสดงผลนี้ เมื่อไม่มีการใช้งาน ความสามารถนี้จะเปลี่ยนอัตราการรีเฟรชเป็นการตั้งค่าที่ต่ำลงเพื่อประหยัดพลังงาน แพลตฟอร์มจะใช้ setIdleTimerEnabled ในการควบคุมระยะหมดเวลาของตัวจับเวลา และในบางกรณีก็ปิดใช้โหมดนี้เพื่อป้องกันการสลับอัตราการรีเฟรชที่ไม่พึงประสงค์เมื่อไม่มีการใช้งาน

    • การใช้การเรียกกลับ IComposerCallback.onVsyncIdle จะบอกให้แพลตฟอร์มทราบว่าจอแสดงผลไม่มีการใช้งานและvsync อัตราความถี่มีการเปลี่ยนแปลง แพลตฟอร์มจะตอบสนองต่อ Callback นี้โดยการรีเซ็ตโมเดล vsync โดยจะบังคับให้ vsync ซิงค์ใหม่ในเฟรมถัดไป และเรียนรู้เกี่ยวกับรอบการทำงาน vsync ใหม่

การใช้งาน

ผู้ให้บริการไม่จำเป็นต้องใช้ AIDL HAL สำหรับ Android 13 อย่างไรก็ตาม ขอแนะนำให้ใช้ HAL สำหรับคอมโพสเซอร์ AIDL แทนเวอร์ชัน HIDL เพื่อใช้ฟังก์ชันและ API ใหม่

การใช้งานการอ้างอิงสำหรับ AIDL HWC HAL จะใช้ในโปรแกรมจำลองของ Android

การทดสอบ

หากต้องการทดสอบการใช้งาน ให้เรียกใช้ VtsHalGraphicsComposer3_TargetTest