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 ตั้งแต่ Android 13 เป็นต้นไปแทนที่จะใช้เวอร์ชัน HIDL ดูข้อมูลเพิ่มเติมได้ที่ส่วนการติดตั้งใช้งาน

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

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

  • การนำคิวข้อความด่วน (FMQ) ออก เพื่อใช้คำสั่งที่ส่งผ่านได้

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

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

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

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

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

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

การใช้งาน

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

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

การทดสอบ

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