הטמעת 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 בנוסף, Hardware 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 מצפה שיחידות ה-GPU שזמינות למערכת יהיו ידועות למערכת של הבינה המלאכותית. הנתיבים המועדפים למנהלי התקנים של 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 מוצא, ה-GLES LayerLoader קורא לפונקציה AndroidGLESLayer_Initialize, עובר על רשימות הפונקציות של libEGL, וקוראת AndroidGLESLayer_GetProcAddress לכל הפונקציות הידועות. אם השכבה מיירטת פונקציה, היא עוקבת אחר הכתובת של הפונקציה. אם השכבה לא מיירט פונקציה, הפונקציה AndroidGLESLayer_GetProcAddress מחזירה את אותה פונקציה הכתובת שבה הוא עבר. לאחר מכן, LayerLoader מעדכן את רשימת ה-הוקים (hooks) של הפונקציה שמצביעים על נקודת הכניסה של השכבה.

הפעלת שכבות

אפשר להפעיל שכבות 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.