前回に引き続き、今回はライブラリ編ですが、以前も書いたように、
仕様がクローズドの為、残念ながら完全には実装していません。
あくまで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
あたりにエントリを追加する必要があります。