EGLとは?
OpenGLはプラットフォームに依存しない設計思想です。
しかし通常プラットフォームはそれぞれハードによって構成が違っています。
その違いを吸収するのがEGLということになります。
OpenGLとEGLがセットで使われることが多く、混同になりがちですが、それぞれ役割が明確にあります。
主な流れ
[Initialize]
ディスプレイ取得
ディスプレイ初期化
コンフィグ選択
コンテキスト作成
ウィンドウ作成
描画カレントに設定
[Rendering]
OpenGLを使用して描画
スワップバッファ
[Finalize]
描画カレントから外す
ウィンドウ破棄
EGL終了
simple-eglでEGLに着目してみよう
ソースコードはこちらです。
https://github.com/wayland-project/weston/blob/master/clients/simple-egl.c
ディスプレイ取得
display->egl.dpy = weston_platform_get_egl_display(EGL_PLATFORM_WAYLAND_KHR, display->display, NULL);
内部でeglGetDisplayが呼ばれています。
通常は引数にEGL_DEFAULT_DISPLAYを渡しますが、simple-eglはwaylandプラットフォーム上で動作するため、
waylandから取得したEGLNativeDisplayTypeを渡します。
ディスプレイ初期化
ret = eglInitialize(display->egl.dpy, &major, &minor);
取得したディスプレイを初期化します。
コンフィグ選択
EGLint config_attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
EGL_ALPHA_SIZE, 1,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
ret = eglChooseConfig(display->egl.dpy, config_attribs, configs, count, &n);
色ごとのバッファサイズなどのコンフィグ設定を行います。
配列の偶数番目に項目、奇数番目に値を格納して、終端にEGL_NONEを設定します。
コンテキスト作成
display->egl.ctx = eglCreateContext(display->egl.dpy, display->egl.conf, EGL_NO_CONTEXT, context_attribs);
レンダリングコンテキストを作成します。
ウィンドウ作成
window->egl_surface = weston_platform_create_egl_surface(display->egl.dpy, display->egl.conf, window->native, NULL);
内部でeglCreateWindowSurfaceが呼ばれています。
描画カレントに設定
ret = eglMakeCurrent(window->display->egl.dpy, window->egl_surface, window->egl_surface, window->display->egl.ctx);
ディスプレイ、サーフェス、コンテキストを関連付けます。
スワップバッファ
eglSwapBuffers(display->egl.dpy, window->egl_surface);
OpenGLで描画したバッファを描画サーバーに送ります。
描画カレントから外す
eglMakeCurrent(window->display->egl.dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
ディスプレイ、サーフェス、コンテキストを関連付けを外します。
ウィンドウ破棄
weston_platform_destroy_egl_surface(window->display->egl.dpy, window->egl_surface);
内部でeglDestroySurfaceが呼ばれています。
EGL終了
eglTerminate(display->egl.dpy);
eglReleaseThread();
終了処理です。
コメント