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

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

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

เนื่องจาก AIDL มีข้อดี ผู้ให้บริการจึงสามารถใช้ HAL ของ AIDL Composer ได้ตั้งแต่ 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) ออกเพื่อใช้คำสั่งที่ส่งผ่านได้

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

    วิธีการ executeCommands 5 มีคำจำกัดความใน IComposerClient.aidl:

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

    แต่ละคำสั่งเป็นประเภทที่ส่งผ่านได้ซึ่งมีการกำหนดประเภทอย่างเข้มงวดใน DisplayCommand.aidl การตอบกลับคำสั่งเป็น Parcelable ที่มีการพิมพ์อย่างเข้มงวด ซึ่งกำหนดไว้ใน 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 เฟรมเวิร์กจะแจ้งให้ผู้ให้บริการทราบถึง การกำหนดค่าการแสดงผลเวลาบูต ผู้ให้บริการต้องแคชในการกำหนดค่าจอแสดงผลการบูต และบูตในการกำหนดค่านี้ในการรีบูตครั้งถัดไป หากอุปกรณ์ บูตในการกำหนดค่านี้ไม่ได้ ผู้จำหน่ายต้องหาการกำหนดค่าที่ ตรงกับความละเอียดและอัตราการรีเฟรชของการกำหนดค่านี้ หากไม่มี config ดังกล่าว ผู้ให้บริการต้องใช้การกำหนดค่าการแสดงผลที่ต้องการ

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

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

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

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

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

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

การใช้งาน

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

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

การทดสอบ

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