הטמעת OpenGL ES ו-EGL

OpenGL הוא ממשק API של גרפיקה בפלטפורמות שונות, שמציין ממשק תוכנה סטנדרטי לחומרת עיבוד גרפיקה תלת-ממדית. OpenGL ES הוא קבוצת משנה של מפרט OpenGL למכשירים מוטמעים.

כדי להיות תואם ל-Android, המכשירים צריכים לספק מנהלי התקנים ל-EGL, ל-OpenGL ES 1.x ול-OpenGL ES 2.0. התמיכה ב-OpenGL ES 3.x היא אופציונלית. בין השיקולים החשובים:

  • מוודאים שמנהל התקן GL חזק ועומד בתקני OpenGL ES.
  • הפעלת מספר בלתי מוגבל של הקשרי GL. מכיוון שמערכת Android מאפשרת להריץ אפליקציות ברקע ומנסה לשמור על הקשרי GL פעילים, לא כדאי להגביל את מספר ההקשרים בנהג.
  • חשוב לשים לב לכמות הזיכרון שמוקצית לכל הקשר, כי מקובל להפעיל 20 עד 30 הקשרי GL פעילים בו-זמנית.
  • תמיכה בפורמט התמונה YV12 ובפורמטים אחרים של תמונות YUV שמקורם ברכיבים אחרים במערכת, כמו קודק מדיה או המצלמה.
  • תמיכה בתוספים החובה EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer, EGL_ANDROID_recordable. בנוסף, ל-Harware Composer מגרסה 1.1 ואילך נדרש התוסף EGL_ANDROID_framebuffer_target.

מומלץ מאוד גם לתמוך ב-EGL_ANDROID_blob_cache, ב-EGL_KHR_fence_sync וב-EGL_ANDROID_native_fence_sync.

ב-Android 10 מוטמע ממשק EGL 1.5. מידע על התכונות החדשות ב-EGL 1.5 זמין במפרט של Khronos Releases 1.5.

טעינה של מנהל ההתקן

מערכת Android מצפה שה-GPUs שזמינים למערכת יהיו ידועים כשתמונה המערכת נוצרת. הנתיבים המועדפים למנהלי OpenGL ES של 32 ביט ו-64 ביט הם /vendor/lib/egl ו-/vendor/lib64/egl, בהתאמה. הטוען משתמש בשני מאפייני מערכת, ro.hardware.egl ו-ro.board.platform, או בשם המדויק כדי לגלות ולטעון את מנהלי ההתקנים של המערכת. מנהל ההתקן של OpenGL ES חייב להישלח בקובץ בינארי אחד או לפלח לשלושה קבצים בינאריים. אם מנהל התקן OpenGL ES נשלח בקובץ בינארי אחד, משתמשים באחד מהשמות הבאים:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

אם מנהל ה-OpenGL ES נשלח בשלושה קבצים בינאריים, צריך להשתמש באחת מקבוצות השמות הבאות:

libEGL_${ro.hardware.egl}.so
libGLESv1_CM_${ro.hardware.egl}.so
libGLESv2_${ro.hardware.egl}.so

libEGL_${ro.board.platform}.so
libGLESv1_CM_${ro.board.platform}.so
libGLESv2_${ro.board.platform}.so

libEGL.so
libGLESv1_CM.so
libGLESv2.so

שכבות של OpenGL ES

ב-Android 10 אנחנו משיקים מערכת שכבות ל-GLES 2.0 ואילך. שכבות GLES הן אובייקטים משותפים שזמינים מתוך אפליקציות או מסופקים על ידי כלים. שכבות GLES מאפשרות לאפליקציות שניתן לנפות באגים בהן לזהות ולטעון שכבות באמצעות אותם מנגנוני הגדרה כמו ב-Vulkan.

רכיב GLES LayerLoader בתוך מעבד ה-EGL מזהה שכבות GLES. לכל שכבה ש-GLES LayerLoader מוצא, הוא קורא ל-AndroidGLESLayer_Initialize, עובר על רשימות הפונקציות של libEGL וקורא ל-AndroidGLESLayer_GetProcAddress לכל הפונקציות הידועות. אם השכבה מיירטת פונקציה, היא עוקבת אחר הכתובת של הפונקציה. אם השכבה לא מפריעה לפונקציה, הפונקציה AndroidGLESLayer_GetProcAddress מחזירה את אותה כתובת פונקציה שהועברה אליה. לאחר מכן LayerLoader מעדכן את רשימת ההוק (hook) של הפונקציה כך שמצביעים על נקודת הכניסה של השכבה.

הפעלת שכבות

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

כדי להפעיל שכבות לכל אפליקציה:

# Enable layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb shell settings put global gpu_debug_app package_name

# Specify layer list (from top to bottom)
adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN

# Specify packages to search for layers
adb shell settings put global gpu_debug_layer_app package1:package2:...:packageN

כדי להשבית שכבות לכל אפליקציה:

adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app

כדי להפעיל שכבות באופן גלובלי:

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

שכבות בדיקה

שכבות GLES מגובות על ידי Android CTS ונדרשות לעבור בדיקות CTS של מכשירים תואמים. כדי לזהות אם שכבות פועלות במכשיר, מריצים את $ atest CtsGpuToolsHostTestCases.