ベンチマークの結果を更新しました。
Android 4.1 以降かつ対応しているデバイスでは SwapInterval を 0 に
変更したので 60fps 以上出ています。(関連)
GPU SoC CPU clock OS Screen fps pix/sec --------------------------------------------------------------------- Adreno 330 MSM8974 2.2GHz A4.2 1920x1200 71.98fps 165.8M Adreno 320(64) APQ8064 1.5GHz A4.4 1920x1104 40.97fps 86.8M Mali-T604 Exynos5D 1.7GHz A4.4 2560x1504 20.73fps 79.8M ULP GeForce(72) Tegra4 1.8GHz A4.3 1126x800 44.58fps 43.4M ULP GeForce(12) Tegra3 1.2GHz A4.4 1280x752 15.70fps 15.0M (*1) *1: Shadow Map 無し, 16bit depth
Adreno 330 は予想以上に速く、Adreno 320 比でもおよそ 2倍の速度が出ています。
ついに一番負荷が高い設定でも Full HD (1920×1200) で 60fps を超えるように
なってしまいました。
2010 年の GPU では 800×480 でもわずか 3fps でした。
対する Tegra 4 はあまり速度が伸びていません。
負荷を下げても速度が上がらないので、SwapInterval 設定が効いていないか
何かしら問題が発生している可能性があります。
その代わり Tegra 3 で省かれていたさまざまな extension をサポートしており
描画結果が他の GPU とほぼ一致するようになりました。
特に GL_EXT_shadow_samplers は単なる Hardware ShadowMap ではなく
PCF にきちんと Bi-linear Filter もかかります。
GL_EXT_shadow_samplers は OpenGL ES 3.0 以降のデバイスはどれも対応
していますが、必ずしも Filter がかかるとは限らないようです。
下記はいくつかテストした結果です。
depth-tex sh-samplers PCF Filter ---------------------------------------------------------------- 8064 Adreno 320 OpenGL ES 3.0 ◎ ◎ ◎ -- 8064 Adreno 320 OpenGL ES 2.0 ◎ -- -- -- Mali-T604 OpenGL ES 3.0 ◎ ◎ ◎ ◎ Tegra 4 OpenGL ES 2.0 ◎ ◎ ◎ ◎ Tegra 3 OpenGL ES 2.0 -- -- -- -- iOS PVR 543MP3 OpenGL ES 2.0 ◎ ◎ ◎ ◎ Vivante GC4000 OpenGL ES 2.0 ◎ -- -- -- Mali-400MP4 OpenGL ES 2.0 ◎ -- -- -- PowerVR SGX540 OpenGL ES 2.0 ◎ -- -- --
この辺りはもう少し詳しく調べたいと思っています。
なお Tegra4 の Extension 詳細は下記のページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Android OpenGL ES と V-Sync (eglSwapInterval)
・Nexus 10 GPU Mali-T604
・Qualcomm APQ8064 GPU Adreno 320 の速度
・さらに OpenGL ES 2.0 Mobile GPU の速度比較
・GPU 速度に関連するエントリ
いつも楽しみに読まさせていただいています。
エントリーに関係なくてすみません。
OpenGL ES2.0で、Android用のペイントアプリを作ったのですが、Tegra2の一部の機種でループ回数が変数な動的for()が非対応でクラッシュしました。
この動的for()が対応しているかしていないか判別する方法はないものでしょうか?
アプリは ibisPaintです。 http://ibispaint.com/
動的ループを行っているのは FragmentShader (PixelShader) でしょうか。
もし FragmentShader かつループの index で Uniform を参照
しているなら Tegra2/3 は非対応となっています。
また初期の Android 3.x 以前の Tegra2 では、
GLSL の構文に互換性の問題がありました。
コンパイル時にエラーが出ているのでしょうか。
もう少し詳しい情報をいただけるとアドバイスできるかもしれません。
・Vertex / Fragment どちらか
・ループ内で Uniform を table 参照しているかどうか
もし問題ある部分の GLSL コードを数行いただけるなら
手持ちのデバイスでも再現して試してみたいと思います。
さすがogaさん親切に回答ありがとうございます!
はい。まさにTegra2/3で問題が出ています。
シェーダーは、Fragment Shaderです。
Android 4.1以降対応アプリです。
Uniform変数でのループ数ではなく、完全にローカル変数でのループ数です。
コンパイルエラーはないです。
GLSLコードは、メールでお送りします。
(しょぼいロジックでぼかしを作ってしまって恥ずかしいので)
フォームメールよりGLSLのコードを送らさせていただきました。
ibisPaintの方はTegra系は全部ぼかしツールOFFで公開してあります。
下記に追加しました
http://dench.flatlib.jp/opengl/glsl