Nexus 10 GPU Mali-T604

Nexus 10 のデータを追加しました。
Nexus 10 の Exynos 5 Dual は Krait + Adreno 320 の APQ8064 と同じように、
CPU (Cortex-A15)、GPU (ARM Mali-T604) ともに新しい世代の core が用いられています。

Mobile GPU の OpenGL ES Extension

下記 GPU 機能の比較表も更新しました。

Mobile GPU の機能比較表

Mali-T604 は OpenGL ES 3.0 世代の GPU ですが、今のところ使えるのは
Adreno 320 同様 OpenGL ES 2.0 API の範囲に限られます。

Adreno の場合 OpenGL ES 2.0 API でも ETC2/EAC Texture など、
部分的に OpenGL ES 3.0 の機能が取り込まれていました。
Mali-T604 では特に OpenGL ES 3.0 を先取りしているような部分はないようです。

新しい core なので動作速度も十分高速でシェーダーパフォーマンスも良好です。
前世代の Mali-400MP では TBR ながら discrete 構成で頂点性能に難がありました。
Mali-T604 は Unified Shader となったため総合的に性能が上がっています。
構造の違いは機能面からもわかります。

例えば Shader Constant (Uniform) 数、Vertex Texture mapping 、
Pixel Format/Vertex Format、Shader の演算精度など、
さまざまな面で Vertex と Pixel (Fragment) の機能差が無くなっています。

Uniform数      Vertex Fragment
----------------------------------------
Tegra2/3        256    1024     discrete
Mali-400MP      128    1024     discrete
Mali-T604       256     256     unified
Adreno          251     221     unified
PowerVR SGX 5   128      64     unified

Tegra2/3, Mali-400MP の Fragment Shader は Uniform 数に 1024 と極端に
大きな値を返しています。
おそらく古い GeForce と同じように、Pixel (Fragmen) の場合だけ
Shader Program のバイナリを直接書き換える仕組みで、
事実上制限が無いのだと思われます。

T604 は Vertex / Fragment との差がなく他の GPU に近い数値になりました。

これまで Unified Shader の GPU は大きく分けて、highp 固定精度と
highp/mediump/lowp 可変精度の 2種類ありました。

Unified Shader GPU     Precision
---------------------------------------------------------
Adreno 200/300         highp のみ          (highp 固定)
Vivante GC             highp のみ          (highp 固定)
PowerVR SGX 5          highp/mediump/lowp  (3種類の可変)
Mali-T604              highp/mediump       (lowp 無し)

Mali-T604 は PowerVR のように precision 宣言が有効ですが、
highp と mediump の 2種類しかありません。
mediump 固定で lowp が無かった Mali-400MP に似ています。

highp に対応しているにも関わらず GL_OES_fragment_precision_high が
無いので、Mali-400MP と同じように Fragment Shader (PixelShader) では
mediump を使って欲しいのかもしれません。

ただし下記の記事にも書いたように glGetShaderPrecisionFormat() の返す値は
実際の動作と異なっている場合があります。まだ実測していません。

OpenGL ES 2.0 GLSL precision 宣言と GPU 毎の演算精度を調べる
Mobile GPU の比較 Precision

●全然関係ないシェーダーのはまり

GPU 機能とは関係なく、Nexus 10 の解像度の高さに自分のシェーダーが対応できて
いませんでした。
もともと浮動小数点の演算を利用して複数のデータを圧縮して格納していたのですが、
2560×1600 のスクリーン座標がオーバーフローしていることが原因でした。
やはり演算精度は実機できちんと測定しておいた方がよさそうです。

関連エントリ
Qualcomm APQ8064 GPU Adreno 320 の速度
OpenGL ES 2.0 GLSL precision 宣言と GPU 毎の演算精度を調べる
GPU 速度に関連するエントリ