EGLSurfaces ו-OpenGL ES

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

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

EGLSurfaces

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

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

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

שרשור נתון יכול לעבור בין כמה EGLSurface על ידי שינוי מה שנוכחי. בכל רגע נתון, EGLSurface יכול להיות פעיל רק בשרשור אחד.

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

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

ANativeWindow

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

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