以前、STLを使うべく、直接libc++の置き換えを行っていたのですが、
gccのバージョンが上がったりしたこともあったので、stlportを試してみました。
Android用の部分も、本家に取り込まれたようなので、現在では本家から
ダウンロードし、android-ndk-r3/apps/hogehoge/project/jni/stlportとして、
あとはAndroid.mkさえ書けば、あっさりと使えます。
まだ5.2.1のtarボールには含まれていないようなので、gitより取得して下さい。

NDKではなく直接組み込むことも可能ですが、その場合はツールチェーンに
__linux__の文字列が含まれているようなので、そのままだとlinux用にビルドされてしまいます。
stlport/stl/config/_system.hで__linux__より先に、__ANDROID__を判定するようにし、
__linux__をundefするとかしないといけませんが、まあ、需要ないか、、

stlportには、tr1等、無いものもたくさんあるので、これさえあればSTLを使用した
OSSが使えるわけではありませんが、Androidには、これよりほとんど無いに等しいのと、
直接libc++を置き換えてしまうと、webkitのC++とぶつかってしまったりしてしまいますので、
手軽に使えるという点で、非常に便利です。



前回に引き続き、今回はライブラリ編ですが、以前も書いたように、
仕様がクローズドの為、残念ながら完全には実装していません。
あくまでLinux上のライブラリをトレース&ダンプした結果を元に、
Android上での動作を確認しました。

2. GPU用ライブラリを組み込む

まずは、GPU用のライブラリをロードするように設定します。
例として、vender/hogehoge/egl.cfgというファイルを以下の内容で
作成します。

0 0 android
0 1 POWERVR_SGX530_121

1行目は、ソフトウェアレンダリングのライブラリで、既存の
libGLES_android.soを指し、2行目は、新たに追加するGPU用のライブラリで、
上記の例だとlibGLES_POWERVR_SGX530_121.so等を指します。

ちなみに、以下のようなコメントを拾いましたので、参考までに。

#
# One line per configuration, of the form:
#
# D I TAG
#
# D: display (0: default)
# I: implementation (0: software, 1: hardware)
# TAG: a unique tag
#
# The library name loaded by EGL is constructed as (in that order):
#
# /system/lib/egl/libGLES_$TAG.so
# /system/lib/egl/lib{EGL|GLESv1_CM|GLESv2}_$TAG.so
#


次に、build/target/board/generic/BoardConfig.mkにて、上記ファイルを
指定します。

BOARD_EGL_CFG := /vendor/hogehoge/egl.cfg

いよいよ、ライブラリの作成ですが、私はframeworks/base/opengl/libagl
をベースに、frameworks/base/opengl/libPOWERVR_SGX530_121という
形で作成しました。
とりあえず、egl.cpp内のeglInitialize()にて、GPUの初期化を行うように
してみました。(デバイスドライバの初期化自体は、ブート時に完了しています。)
Linux用のライブラリから関数名を拾って、わかる範囲で合わせてみましたが、
かなりのioctl()を発行することになりますので、それなりに処理を追加する
必要があります。

ちなみに、モトローラ社のDROIDでは、GPU用に以下のライブラリがあるようです。

libEGL_POWERVR_SGX530_121.so
libGLESv1_CM_POWERVR_SGX530_121.so
libGLESv2_POWERVR_SGX530_121.so

ライブラリをビルドするには、プレリンクの設定を、build/core/prelink-linux-arm.map
に追加するのをお忘れなく、、
適当に空いていそうなアドレスに割り当てます。

他にも、
frameworks/base/libs/surfaceflinger/DisplayHardware/DisplayHardware.cpp
に初期化を追加したり、
frameworks/base/opengl/include/EGL/eglext.h
frameworks/base/opengl/libs/EGL/egl.cpp
frameworks/base/opengl/libs/EGL/egl_entries.in
あたりにエントリを追加する必要があります。


以前やったところまでになりますが、何も残していなかったので、
メモとして書いておきます。

1. GPU用のデバイスドライバを組み込む

TI社よりSDKをダウンロードし、GFX_Linux_KMディレクトリ以下を
drivers/gpu/pvr以下に組み込みます。
SDKの最新は、OMAP35x_Graphics_SDK_setuplinux_3_00_00_09.bin
というファイル名でした。

カーネル2.6.29のモジュール用なので、2.6.31+RTパッチによってビルド
出来ない箇所と、私はスタティックに組み込んでしまいましたので、
初期化の順番を考慮する必要がありましたので、その修正を行いました。

ちなみに、PREEMPT_RTには対応していなかったので、とりあえず
PREEMPT_VOLUNTARYで動かしました。

少ないですが、今日はここまで、