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