AIDL למלחין לחומרה עם HAL

החל מגרסה 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. מידע נוסף זמין בקטע הטמעה.

ההבדלים בין ממשקי HAL של AIDL לבין ממשקי HAL של HIDL

ה-HAL החדש של AIDL composer, שנקרא android.hardware.graphics.composer3, מוגדר ב-IComposer.aidl. הוא חושף ממשק API שדומה ל-HIDL HAL‏android.hardware.graphics.composer@2.4 עם השינויים הבאים:

  • הסרת Fast Message Queue‏ (FMQ) לטובת פקודות שניתן לחלק.

    ממשק ה-HAL של AIDL מגדיר את ממשק הפקודות על סמך סוגים ניתנים לחלוקה (parcelable) עם טיפוס חזק, בניגוד לפקודות בסדרה (serialized) דרך FMQ ב-HIDL. כך מתקבל ממשק יציב לפקודות והגדרה קריאה יותר לאופן הפירוש של המטען הייעודי (Payload) של הפקודה.

    השיטה executeCommands מוגדרת ב-IComposerClient.aidl בתור

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

    כאשר כל פקודה היא סוג של parcelable עם טיפוס מוגדר ב-DisplayCommand.aidl. התשובות של הפקודות הן מקטעים מוקלדים מאוד שמוגדרים ב-CommandResultPayload.aidl.

  • הסרת IComposerClient.getClientTargetSupport כי אין לקוחות פעילים לשיטה הזו.

  • ייצוג של צבעים כצפים במקום בייטים, כדי ליישר קו עם סטאק הגרפיקה העליון ב-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 שנדרשים למכשיר. לאחר ההטמעה הזו, ממשק המשתמש של המערכת מסמנים את שכבת המסכה של האלפא בתור DISPLAY_DECORATION, סוג חדש של קומפוזיציה שמנצל את החומרה הייעודית.

  • הוספת שדה expectedPresentTime חדש ל-DisplayCommand.aidl.

    השדה expectedPresentTime מאפשר ל-SurfaceFlinger להגדיר את זמן ההצגה הצפוי של זמן ההצגה הצפוי של התוכן הנוכחי במסך. התכונה הזו מאפשרת ל-SurfaceFlinger לשלוח פקודת present להטמעה מראש, וכך להעביר לצינור עיבוד נתונים (pipeline) יותר מעבודת ההרכבה.

  • הוספה של ממשקי API חדשים לצורך בקרה על הגדרות התצוגה בזמן האתחול.

    באמצעות BOOT_DISPLAY_CONFIG, הספקים יכולים לציין שיש תמיכה בהגדרות של תצוגת ההפעלה. השיטות setBootDisplayConfig, clearBootDisplayConfig ו-getPreferredBootDisplayConfig משתמשות ב-BOOT_DISPLAY_CONFIG באופן הבא:

    • באמצעות setBootDisplayConfig, ה-framework מודיע לספקים לגבי הגדרות התצוגה של זמן האתחול. הספקים חייבים לשמור במטמון את ההגדרות של מסך ההפעלה, ולהפעיל אותם בהגדרה הזו בהפעלה הבאה. אם אי אפשר לאתחל את המכשיר עם ההגדרות האלה, הספק צריך למצוא הגדרה שתואמת לרזולוציה ולקצב הרענון של התצורה הזו. אם אין הגדרה כזו, הספק צריך להשתמש בהגדרת התצוגה המועדפת עליו.

    • באמצעות clearBootDisplayConfig, המסגרת מעדכנת את הספקים לנקות את הגדרות תצוגת האתחול, ולהפעיל את ההגדרות המועדפות שלהם לתצוגה במהלך ההפעלה מחדש הבאה.

    • באמצעות getPreferredBootDisplayConfig, ה-framework שולח שאילתה לגבי מצב ההפעלה המועדף של הספק.

    כשאין תמיכה בתצורת תצוגת ההפעלה, השיטות האלה מחזירות את הערך UNSUPPORTED.

  • הוספה של ממשקי API חדשים כדי לשלוט בטיימר לא פעיל של הצגת המסך.

    • באמצעות DISPLAY_IDLE_TIMER, הספקים יכולים לציין שהספק מטמיע טיימר של חוסר פעילות במסך הזה. כשהיכולת הזו לא פעילה, קצב הרענון משתנה להגדרה נמוכה יותר כדי לשמר את אספקת החשמל. הפלטפורמה משתמשת ב-setIdleTimerEnabled כדי לשלוט על הזמן הקצוב לתפוגה של הטיימר, ובמקרים מסוימים כדי להשבית אותו, כדי למנוע החלפה של קצב רענון לא רצוי במצב של חוסר פעילות.

    • שימוש בקריאה החוזרת (callback) של IComposerCallback.onVsyncIdle מציין לפלטפורמה שהמסך לא פעיל והקצב של vsync השתנה. התגובה של הפלטפורמה להתקשרות החוזרת הזו היא איפוס המודל vsync. הוא מאלץ סנכרון מחדש של vsync בפריים הבא, ולומד את קצב vsync החדש.

הטמעה

ספקים לא נדרשים להטמיע את AIDL HAL ל-Android 13. עם זאת, אנחנו ממליצים להם להטמיע את הקומפוזיציה של AIDL במקום את גרסת HIDL כדי להשתמש בפונקציונליות החדשה ובממשקי ה-API החדשים.

הטמעת עזר של AIDL HWC HAL מוטמעת באמולטורים של Android.

בדיקה

כדי לבדוק את ההטמעה, מריצים את VtsHalGraphicsComposer3_TargetTest.