AIDL สำหรับ HAL ของ Hardware Composer

ตั้งแต่ Android 13 เป็นต้นไป ระบบจะกำหนด HAL ของเครื่องมือแต่งภาพฮาร์ดแวร์ (HWC) ใน 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 จะกำหนดอินเทอร์เฟซคำสั่งตามประเภทที่มีการจัดประเภทอย่างเข้มงวดและสามารถแยกออกเป็นส่วนๆ ได้ ต่างจากคำสั่งที่แปลงเป็นอนุกรมผ่าน 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 ช่วยให้คุณระบุความสว่างของแต่ละเลเยอร์ได้ เพื่อให้ HWC ปรับความสว่างของเนื้อหาเลเยอร์ในเชิงเส้น ไม่ใช่เชิงแกมมา

    ฟิลด์ brightness ใน ClientTargetPropertyWithBrightness ช่วยให้คุณระบุพื้นที่ความสว่างสำหรับองค์ประกอบไคลเอ็นต์และสั่งให้ 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 callbacks บ่งบอกให้แพลตฟอร์มทราบว่าจอแสดงผลไม่มีการใช้งานและ vsync cadence มีการเปลี่ยนแปลง แพลตฟอร์มจะตอบสนองต่อการเรียกกลับนี้ด้วยการรีเซ็ตโมเดล vsync ระบบจะบังคับให้vsyncซิงค์ใหม่ในเฟรมถัดไป และเรียนรู้จังหวะvsyncใหม่

การใช้งาน

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

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

การทดสอบ

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