EGLについて

wayland
スポンサーリンク

スポンサーリンク

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();

終了処理です。

wayland
スポンサーリンク
muffinをフォローする
エンジニア情報局

コメント

タイトルとURLをコピーしました