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

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

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

เนื่องจาก AIDL มี ข้อดีต่างๆ ผู้ให้บริการจึงสามารถติดตั้งใช้งาน HAL ของ Composer ใน AIDL ได้ตั้งแต่ Android 13 เป็นต้นไปแทนที่จะใช้เวอร์ชัน HIDL ดูข้อมูลเพิ่มเติมได้ที่ส่วนการติดตั้งใช้งาน Implementation

ความแตกต่างระหว่าง HAL ของ AIDL และ HIDL

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

  • นำ Fast Message Queue (FMQ) ออกและใช้คำสั่ง Parcelable แทน

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

    เมธอด executeCommands 5 กำหนดไว้ใน IComposerClient.aidl ดังนี้

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

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

  • นำ IComposerClient.getClientTargetSupport ออกเนื่องจากไม่มี ไคลเอ็นต์ที่ใช้งานอยู่ใช้เมธอดนี้

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

  • เพิ่มฟิลด์ใหม่สำหรับการควบคุมเนื้อหา HDR

    ใน HAL ของ AIDL สแต็กเลเยอร์ 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 Enum ที่อุปกรณ์ต้องใช้ หลังจากการติดตั้งใช้งานนี้ 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 ใหม่

การติดตั้งใช้งาน

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

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

การทดสอบ

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