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

ההבדלים בין ממשקי 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. כך אפשר ליצור ממשק יציב לפקודות ולהגדיר בצורה קריאה יותר את האופן שבו מתבצע הפירוש של עומס העבודה של הפקודה.

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

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

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

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

  • ייצוג צבעים כ-float במקום כ-byte, כדי להתאים טוב יותר למחסנית הגרפיקה העליונה ב-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 לשלוח פקודת הצגה מראש להטמעה, וכך להעביר לצינור עיבוד נתונים (pipeline) יותר מעבודת העריכה.

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

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

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

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

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

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

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

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

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

הטמעה

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

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

בדיקה

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