EGLSurfaces dan OpenGL ES

Android menggunakan OpenGL ES (GLES) API untuk merender grafis. Untuk membuat konteks GLES dan menyediakan sistem windowing untuk rendering GLES, Android menggunakan library EGL. Panggilan GLES merender poligon bertekstur, sedangkan panggilan EGL menempatkan rendering di layar.

Sebelum menggambar dengan GLES, Anda harus membuat konteks GL. Di EGL, ini berarti membuat EGLContext dan EGLSurface. Operasi GLES berlaku untuk konteks saat ini, yang diakses melalui penyimpanan lokal thread, bukan diteruskan sebagai argumen. Kode rendering harus dieksekusi di thread GLES, bukan thread UI.

EGLSurfaces

EGLSurface dapat berupa buffer di luar layar yang dialokasikan oleh EGL, yang disebut pbuffer, atau jendela yang dialokasikan oleh sistem operasi. Memanggil fungsi eglCreateWindowSurface() akan membuat platform jendela EGL. eglCreateWindowSurface() menggunakan objek jendela sebagai argumen, yang di Android adalah permukaan. Permukaan adalah sisi produsen BufferQueue. Konsumen, yaitu SurfaceView, SurfaceTexture, TextureView, atau ImageReader, membuat permukaan. Saat Anda memanggil eglCreateWindowSurface(), EGL akan membuat objek EGLSurface baru dan menghubungkannya ke antarmuka produsen BufferQueue objek jendela. Mulai saat itu, merender ke EGLSurface tersebut akan mengeluarkan buffer dari antrean, merender ke dalamnya, dan mengantrekannya untuk digunakan oleh konsumen.

EGL tidak menyediakan panggilan kunci/buka kunci. Keluarkan perintah menggambar dan lalu panggil eglSwapBuffers() untuk mengirimkan frame saat ini. Nama metode berasal dari pertukaran tradisional buffer depan dan belakang, tetapi penerapan sebenarnya mungkin berbeda.

Hanya satu EGLSurface yang dapat dikaitkan dengan platform dalam satu waktu (Anda hanya dapat memiliki satu produsen yang terhubung ke BufferQueue), tetapi jika Anda menghancurkan EGLSurface, EGLSurface akan terputus dari BufferQueue dan memungkinkan sesuatu yang lain terhubung.

Thread tertentu dapat beralih di antara beberapa EGLSurface dengan mengubah apa yang saat ini. EGLSurface hanya boleh aktif di satu thread dalam satu waktu.

EGL bukan aspek lain dari platform, seperti SurfaceHolder. EGLSurface adalah konsep terkait, tetapi independen. Anda dapat menggambar di EGLSurface yang tidak didukung oleh platform, dan Anda dapat menggunakan platform tanpa EGL. EGLSurface menyediakan tempat untuk menggambar GLES.

Lihat Compatibility Definition Document Android untuk persyaratan OpenGL ES dan EGL.

ANativeWindow

Class permukaan publik diimplementasikan dalam bahasa pemrograman Java. Yang setara di C/C++ adalah class ANativeWindow, yang diekspos sebagian oleh Android NDK. Anda dapat mengambil ANativeWindow dari permukaan dengan panggilan ANativeWindow_fromSurface(). Sama seperti sepupunya yang menggunakan bahasa Java, Anda dapat menguncinya, merendernya di software, dan membukanya serta mempostingnya. Jenis jendela native dasar adalah sisi produsen dari BufferQueue.

Untuk membuat platform jendela EGL dari kode native, teruskan instance EGLNativeWindowType ke eglCreateWindowSurface(). EGLNativeWindowType adalah sinonim untuk ANativeWindow, sehingga Anda dapat melakukan transmisi dari satu ke yang lain.