יישום OpenGL ES ו-EGL

OpenGL הוא API גרפי חוצה פלטפורמות המציין ממשק תוכנה סטנדרטי עבור חומרה לעיבוד גרפיקה תלת מימדית. OpenGL ES היא תת-קבוצה של מפרט OpenGL עבור התקנים משובצים.

כדי להיות תואמים לאנדרואיד, מכשירים צריכים לספק מנהלי התקנים עבור 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 v1.1 ואילך דורש את ההרחבה EGL_ANDROID_framebuffer_target .

מומלץ מאוד לתמוך גם EGL_ANDROID_blob_cache , EGL_KHR_fence_sync ו- EGL_ANDROID_native_fence_sync .

אנדרואיד 10 מיישמת את ממשק EGL 1.5 . למידע על תכונות חדשות ב-EGL 1.5, ראה מפרט Khronos Releases 1.5 .

טעינת מנהל ההתקן

אנדרואיד מצפה שה-GPUs הזמינים למערכת יהיו ידועים כאשר תמונת המערכת נבנית. הנתיבים המועדפים עבור מנהלי התקנים של 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

אנדרואיד 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 .