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 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_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
.