2011/07/09

q5 : mNativeWindow.get()はFramebufferNativeWindowのアドレスを返す

前回の続き。
mNativeWindow.get()が590200という値を返しているが、これはRGB565なので4になるべきでは?
その疑問を抱いたので、調べることにした。

mNativeWindowは、FramebufferNativeWindowクラス。
frameworks/base/include/ui/FramebufferNativeWindow.hにある。
が、この中にget()はいない。
しかし、getなんていう曖昧な名前は勘弁して欲しい。。。

ここからが大変だ。
定義はこうなっている。

class FramebufferNativeWindow
    : public EGLNativeBase<
        ANativeWindow,
        FramebufferNativeWindow,
        LightRefBase >

テンプレートだ。。。

template
class EGLNativeBase : public NATIVE_TYPE, public REF

第1と第3のクラスを継承している。
第1はANativeWindow、第3はまたテンプレートだが、これはラッパのようだ。
よくわからないが、そういう書き方をするのだろう。

が、ここまでみていってもget()がない。
なんでだ??

そこでようやく、mNativeWindowの定義を見た。

sp<FramebufferNativeWindow> mNativeWindow;

なんと、spだ。
shared pointerの略なのかな? newすれどdelete不要っていう参照カウンタで管理してくれるやつだ。
で、sp<>.get()は、本体のアドレスを返す。
つまり、mNativeWindow.get()はアドレスなのだ。
それをintでデバッグ表示させていたので、数値が違ったのだな。
なんで間違ったかというと、見る関数を1つ飛ばしていたからだ。
あーあ、ばからしい。


ただしく。

init()はEGLUtils::selectConfigForNativeWindow()を呼び、その中でNATIVE_WINDOW_FORMATを取得し、その値でselectConfigForPixelFormat()を呼び出している。
値を確認すると、4。
ちゃんとしてますな。

問題なのは、eglGetConfigAttrib(EGL_NATIVE_VISUAL_ID)が0を返すというところにある。
次はそこを見ていきましょう。

0 件のコメント:

コメントを投稿

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