OpenGL ES 2.0 Adreno 330, Tegra 4 の GPU 速度

ベンチマークの結果を更新しました。

Mobile GPU bench mark

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 ES 2.0 Adreno 330, Tegra 4 の GPU 速度」への5件のフィードバック

  1. かみやん

    いつも楽しみに読まさせていただいています。
    エントリーに関係なくてすみません。
    OpenGL ES2.0で、Android用のペイントアプリを作ったのですが、Tegra2の一部の機種でループ回数が変数な動的for()が非対応でクラッシュしました。
    この動的for()が対応しているかしていないか判別する方法はないものでしょうか?

    アプリは ibisPaintです。 http://ibispaint.com/

  2. oga 投稿作成者

    動的ループを行っているのは FragmentShader (PixelShader) でしょうか。
    もし FragmentShader かつループの index で Uniform を参照
    しているなら Tegra2/3 は非対応となっています。

    また初期の Android 3.x 以前の Tegra2 では、
    GLSL の構文に互換性の問題がありました。

    コンパイル時にエラーが出ているのでしょうか。
    もう少し詳しい情報をいただけるとアドバイスできるかもしれません。

    ・Vertex / Fragment どちらか
    ・ループ内で Uniform を table 参照しているかどうか

    もし問題ある部分の GLSL コードを数行いただけるなら
    手持ちのデバイスでも再現して試してみたいと思います。

  3. かみやん

    さすがogaさん親切に回答ありがとうございます!

    はい。まさにTegra2/3で問題が出ています。
    シェーダーは、Fragment Shaderです。
    Android 4.1以降対応アプリです。

    Uniform変数でのループ数ではなく、完全にローカル変数でのループ数です。
    コンパイルエラーはないです。
    GLSLコードは、メールでお送りします。
    (しょぼいロジックでぼかしを作ってしまって恥ずかしいので)

  4. かみやん

    フォームメールよりGLSLのコードを送らさせていただきました。
    ibisPaintの方はTegra系は全部ぼかしツールOFFで公開してあります。

コメントは停止中です。