הטמעת 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 מעדכן את רשימת ה-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.