AIDL สำหรับผู้แต่งฮาร์ดแวร์HAL

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

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

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

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

การนำไปปฏิบัติ

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

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

การทดสอบ

หากต้องการทดสอบการใช้งานของคุณ ให้รัน VtsHalGraphicsComposer3_TargetTest