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, מומלץ לספקים להטמיע את 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) לטובת פקודות שניתנות להעברה.

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

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

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

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

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

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

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

    ספקים יכולים לציין שהגדרת התצוגה של האתחול נתמכת באמצעות BOOT_DISPLAY_CONFIG. ה-methods‏ 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 composer HAL במקום את גרסת ה-HIDL כדי להשתמש בפונקציונליות ובממשקי ה-API החדשים.

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

בדיקה

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