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