EGLSurfaces ו-OpenGL ES

מערכת Android משתמשת ב-API של OpenGL ES‏ (GLES) כדי ליצור גרפיקה. כדי ליצור הקשרים של GLES ולספק מערכת חלונות לעיבוד גרפי של GLES, Android משתמשת בספריית EGL. קריאות ל-GLES מבצעות עיבוד פוליגונים עם טקסטורה, ואילו קריאות ל-EGL מעבירות את העיבודים למסכים.

לפני שאפשר לצייר באמצעות GLES, צריך ליצור הקשר GL. ב-EGL, המשמעות היא יצירת EGLContext ו-EGLSurface. פעולות GLES חלות על ההקשר הנוכחי, שאליו מתבצעת גישה דרך אחסון מקומי לשרשור ולא מועברת כארגומנטים. קוד הרינדור צריך לפעול בשרשור GLES נוכחי, ולא בשרשור של ממשק המשתמש.

EGLSurfaces

EGLSurface יכול להיות מאגר מחוץ למסך שהוקצה על ידי EGL, שנקרא pbuffer, או חלון שהוקצה על ידי מערכת ההפעלה. קריאה לפונקציה eglCreateWindowSurface() יוצרת משטחי חלון של EGL. הפונקציה eglCreateWindowSurface() מקבלת כארגומט אובייקט חלון, שהוא משטח ב-Android. ה-surface הוא הצד של הבעלים של BufferQueue. צרכנים, שהם SurfaceView‏, SurfaceTexture‏, TextureView או ImageReader, יוצרים משטחים. כשקוראים ל-eglCreateWindowSurface(), מערכת EGL יוצרת אובייקט EGLSurface חדש ומחברת אותו לממשק הבעלים של BufferQueue של אובייקט החלון. מנקודה זו ואילך, היצירה של EGLSurface תוביל להסרת מאגר מהתור, ליצירה שלו ולהוספה שלו לתור לשימוש על ידי הצרכן.

EGL לא מספק קריאות נעילה/ביטול נעילה. נותנים פקודות ציור ואז קוראים לפונקציה eglSwapBuffers() כדי לשלוח את המסגרת הנוכחית. שם השיטה נגזר מההחלפה המסורתית של מאגרים קדמיים ואחוריים, אבל ההטמעה בפועל עשויה להיות שונה.

אפשר לשייך רק EGLSurface אחד למשטח בכל פעם (אפשר לשייך רק יוצר אחד ל-BufferQueue), אבל אם משמידים את ה-EGLSurface הוא מתנתק מ-BufferQueue ומאפשר למשהו אחר להתחבר.

שרשור נתון יכול לעבור בין כמה EGLSurfaces על ידי שינוי מה שנוכחי. EGLSurface חייב להיות עדכני בשרשור אחד בלבד בכל פעם.

EGL הוא לא היבט נוסף של משטח (כמו SurfaceHolder). EGLSurface הוא קונספט קשור אבל עצמאי. אפשר לצייר ב-EGLSurface שלא מגובה על ידי surface, ואפשר להשתמש ב-surface ללא EGL. EGLSurface רק מספק ל-GLES מקום לציור.

דרישות OpenGL ES ו-EGL מפורטות במסמך ההגדרה של תאימות ל-Android.

ANativeWindow

הכיתה הציבורית של פני השטח מיושמת בשפת התכנות Java. המקבילה ב-C/C++ היא הכיתה ANativeWindow, שנחשפת באופן חלקי על ידי Android NDK. אפשר לקבל את ANativeWindow מ-surface באמצעות הקריאה ANativeWindow_fromSurface(). בדומה לבן הדוד שלו בשפת Java, אפשר לנעול אותו, ליצור גרפיקה בתוכנה, לבטל את הנעילה ולפרסם. הסוג הבסיסי של חלון מקורי הוא הצד של היוצר ב-BufferQueue.

כדי ליצור משטח חלון של EGL מקוד מקומי, מעבירים למשתנה eglCreateWindowSurface() מופע של EGLNativeWindowType. ‎EGLNativeWindowType הוא שם נרדף ל-ANativeWindow, כך שאפשר להעביר את אחד מהם לשני.