AIDL ל-HAL של Hardware Composer

החל מ-Android 13, ‏ Hardware Composer (HWC) HAL מוגדר ב-AIDL. הגרסאות של HIDL שנעות בין android.hardware.graphics.composer@2.1 לבין android.hardware.graphics.composer@2.4 הוצאו משימוש.

בדף הזה מוסבר על ההבדלים בין AIDL ל-HIDL HALs עבור HWC, ואיך מטמיעים ובודקים את AIDL HAL.

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

ההבדלים בין AIDL לבין HIDL HALs

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

  • הסרה של תור הודעות מהיר (FMQ) לטובת פקודות שניתנות להעברה.

    ‫AIDL HAL מגדיר את ממשק הפקודות על סמך סוגים חזקים של parcelable במקום הפקודות שעברו סריאליזציה ב-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 אפשר להגדיר מתי RenderEngine יחליש את התוכן. ההגדרה הזו מתאימה לספקים שמגדירים ColorModes שעשויים להעדיף להחשיך במרחב גמא כדי להפעיל שיפורים בניגודיות שהוגדרו על ידי הספק בצינורות הצבע שלהם.

  • הוספה של סוג יצירה, DISPLAY_DECORATION, ב-Composition.aidl לקישוטים במסך.

    במכשירים מסוימים יש רכיבי חומרה ייעודיים לאופטימיזציה של ציור מסכת האלפא, שמחליקה פינות מעוגלות וחיתוכים במסכים. במכשירים עם חומרה כזו צריך להטמיע את IComposerClient.getDisplayDecorationSupport ולהחזיר מבנה DisplayDecorationSupport כפי שמוגדר ב-DisplayDecorationSupport.aidl. המבנה הזה מתאר את סוגי ה-enum‏ PixelFormat ו-AlphaInterpretation שנדרשים במכשיר. אחרי ההטמעה הזו, ממשק המשתמש של המערכת מסמן את שכבת מסכת האלפא כ-DISPLAY_DECORATION, סוג קומפוזיציה שמנצל את החומרה הייעודית.

  • נוסף שדה expectedPresentTime אל DisplayCommand.aidl.

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

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

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

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

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

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

    אם אין תמיכה בהגדרת תצוגת האתחול, הפונקציות האלה מחזירות את הערך UNSUPPORTED.

  • הוספנו ממשקי API חדשים לשליטה בטיימר של חוסר פעילות בתצוגה:

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

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

הטמעה

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

אמולטורים של Android כוללים הטמעה לדוגמה של AIDL HWC HAL.

בדיקה

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