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 שמגיעים מרכיבים אחרים במערכת, כמו רכיבי codec של מדיה או המצלמה.
- תמיכה בתוספים הנדרשים
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 זמין במפרט של גרסה 1.5 של Khronos.
טעינת הדרייבר
Android מצפה שהמעבדים הגרפיים שזמינים למערכת יהיו ידועים כשתמונת המערכת נוצרת. הנתיבים המועדפים לדרייברים של OpenGL ES בגרסת 32 ביט ו-64 ביט הם /vendor/lib/egl ו-/vendor/lib64/egl בהתאמה.
ה-loader משתמש בשני מאפייני מערכת, 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 layersadb shell settings put global enable_gpu_debug_layers 1# Specify target appadb 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 layersadb shell settings put global gpu_debug_layer_app package1:package2:...:packageN
כדי להשבית שכבות לכל אפליקציה:
adb shell settings delete global enable_gpu_debug_layersadb shell settings delete global gpu_debug_appadb 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.