2011/07/09

q5 : EGL

画面が出ない件の調査中。

E/SurfaceFlinger( 1888): couldn't find an EGLConfig matching the screen format

まずはこれを追っていこう。

frameworks/base/services/surfaceflinger/DisplayHardware.cppのinit()。
ここで、EGLUtils::selectConfigForNativeWindow()がエラーを返している。

EGLUtils::selectConfigForNativeWindow()はlibs/ui/EGLUtils.cppにある。
eglChooseConfig()でconfigを取得し、eglGetConfigAttrib()で属性を取得し、期待するformatと一致するconfigを探す、という動作。

ということはわかるのだが、そもそもeglChooseConfig()とかeglGetConfigAttrib()とかがわからん。
OpenGL関係っぽいことは名前からわかるのだが。。。
関数の頭にeglって書いてあるから、EGLっていうものがあるんだろう。

まずは、EGLが何なのかを知らねば。

-------------------------------------------------------------------------------------------------
EGL
OpenGL|ESのようなAPIとネイティブ環境の描画をつなぐ層みたいだ。
peer層みたいなものか。
つまり、OpenGL|ESの詳細な実装方法は知らなくても、EGLの各API仕様を満たすように実装しさえすればOpenGL|ESが動かせる、ということになる。
ネイティブとつなぐ部分だから、今回のようにハードウェア環境が違うと手を入れなくてはならないのだろう。


簡単に使い方を知りたいので検索すると、こちらのサイトが見つかった。
うん、今回の処理部分は、ここに書いてある初期化部分と同じ流れだ。
参考にして読み進めよう。


まず、eglChooseConfig()。
init()からはattribとしてEGL_SURFACE_TYPEとEGL_WINDOW_BITを指定している。
これが検索対象ということだろう。
検索値は、format、しかないな。
mNativeWindow.get()は"590200"という値。
なんだこれは・・・。

frameworks/include/ui/PixelFormat.hに定義がある。
型はint32_tで、内容はenumで定義してある。
しかし・・・590200に相当する値がない。
SmartQ5を見ると、ここが拡張されていた。
マージ漏れか。。

いや、ちょっと待て。
うちのSmartQ5はこんな感じだ。

I/gralloc ( 1888): using (fd=25)
I/gralloc ( 1888): id           = s3cfb
I/gralloc ( 1888): xres         = 800 px
I/gralloc ( 1888): yres         = 480 px
I/gralloc ( 1888): xres_virtual = 800 px
I/gralloc ( 1888): yres_virtual = 960 px
I/gralloc ( 1888): bpp          = 16
I/gralloc ( 1888): r            = 11:5
I/gralloc ( 1888): g            =  5:6
I/gralloc ( 1888): b            =  0:5
I/gralloc ( 1888): upper_margin = 10
I/gralloc ( 1888): lower_margin = 35
I/gralloc ( 1888): left_margin  = 40
I/gralloc ( 1888): right_margin = 216
I/gralloc ( 1888): pixclock     = 33358920
I/gralloc ( 1888): width        = 800 mm (25.400000 dpi)
I/gralloc ( 1888): height       = 480 mm (25.400000 dpi)
I/gralloc ( 1888): refresh rate = 60.00 Hz

RGB565なのだから、PIXEL_FORMAT_RGB_565=HAL_PIXEL_FORMAT_RGB_565=4のはずだ。
mNativeWindow.get()は何を返しているんだ?

これは別の調査としよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。