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