Mobile GPU の比較
GPU | 圧縮Tex | FB | MRT | depth | Tile | Shader | Uniform(vec4) | In/Out | TexUnit | Vertex | Fragment | Texture | Vertex | anisotropic |
size | Unit | bin | VSH | FSH | VSH | FSH | VSH | FSH | Precision | Precision | max | cube | 3D | 32F | 16F | 1010102 | depth | 16F | 1010102 | AO |
PowerVR SGX 535 | PVRTC | 2048 | | 24bit | TBDR | unified | | 128 | 64 | 16 | 8 | 0 | 8 | hi, m, low | hi, m, low | 2048 | 2048 | - | Y | Y | - | Y | A | - | Y | Y |
PowerVR SGX 543MP2 | PVRTC | 4096 | | 24bit | TBDR | unified | | 128 | 64 | 16 | 8 | 0 | 8 | hi, m, low | hi, m, low | 4096 | 4096 | - | Y | Y | - | Y | A | - | Y | Y |
PowerVR SGX 540 | PVRTC/ETC1 | 2048 | | 24bit | TBDR | unified | Y | 128 | 64 | 8 | 8 | 0 | 8 | hi, m, low | hi, m, low | 2048 | 2048 | - | Y | Y | - | Y | A | - | Y | - |
PowerVR G6430 (GLES3) | PVRTC/ETC2 | 4096 | 4 | 24bit | TBDR | unified | Y | 512×12 | 224×12 | 16 | 15 | 16 | 16 | hi, m, low | hi, m, low | 4096 | 4096 | Y | Y | Y | Y | Y | A | Y | Y | Y |
Z430 | ATITC/3DC/ETC1 | 1024 | | 24bit | TBR | unified | z400 | 251 | 222 | 16 | 8 | 4 | 16 | hi | hi | 2048 | 1024 | Y | Y | Y | Y | Y | Y | Y | - | Y |
Adreno 200 | ATITC/3DC/ETC1 | 2048 | | 24bit | TBR | unified | z400 | 251 | 222 | 16 | 8 | 4 | 16 | hi | hi | 2048 | 2048 | Y | Y | Y | Y | Y | Y | Y | - | Y |
Adreno 205 | ATITC/3DC/ETC1 | 4096 | | 24bit | TBR | unified | z400 | 251 | 222 | 16 | 8 | 4 | 16 | hi | hi | 4096 | 4096 | Y | Y | Y | Y | Y | Y | Y | - | Y |
Adreno 220 | ATITC/3DC/ETC1 | 4096 | | 24bit | TBR | unified | z400 | 251 | 222 | 16 | 8 | 4 | 16 | hi | hi | 4096 | 4096 | Y | Y | Y | Y | Y | Y | Y | - | Y |
Adreno 320 (GLES2) | ATITC/3DC/ETC2 | 4096 | | 24bit | TBR/IMR | unified | z400 | 251 | 221 | 16 | 8 | 4 | 16 | hi | hi | 4096 | 4096 | Y | Y | Y | Y | Y | Y | Y | Y | Y |
Adreno 320 (GLES3) | ATITC/3DC/ETC2 | 4096 | 4 | 24bit | TBR/IMR | unified | z400 | 256×12 | 224×12 | 16 | 16 | 16 | 16 | hi | hi | 4096 | 4096 | Y | Y | Y | Y | Y | Y | Y | Y | Y |
Tegra250 ULP GeFroce(8) | S3TC/LATC/ETC1 | 3839 | | 16bit | IMR | discrete | Y | 256 | 1024 | 16 | 15 | 0 | 16 | hi (m,low) | m, low | 2048 | 2048 | - | Y | Y | - | - | Y | - | - | Y |
Tegra 3 ULP GeFroce(12) | S3TC/LATC/ETC1 | 3839 | | 16bit | IMR | discrete | Y | 256 | 1024 | 16 | 15 | 0 | 16 | hi (m,low) | m, low | 2048 | 2048 | - | Y | Y | - | - | Y | - | - | Y |
Tegra 4 ULP GeForce(72) | S3TC/LATC/ETC1 | 4096 | | 24bit | IMR | discrete | | 280 | 1024 | 16 | 15 | 0 | 16 | hi | m, low | 4096 | 4096 | - | - | Y | - | Y | Y | - | Y | Y |
ZMS-08HD | S3TC/ETC1 | 2048 | | 32bit | | unified | Y | 128 | 16 | 8 | 8 | 8 | 8 | | | 2048 | 512 | - | - | - | - | - | - | - | - | - |
Mali-400MP4 | ETC1 | 4096 | | 24bit | TBR | discrete | mali | 128 | 1024 | 16 | 12 | 0 | 8 | hi (m) | m | 4096 | 1024 | - | - | - | - | Y | - | - | - | - |
Mali-T604 (GLES2) | ETC1 | 4096 | | 24bit | TBR | unified | mali | 256 | 256 | 16 | 12 | 16 | 16 | hi, m | hi, m | 4096 | 4096 | Y | - | - | Y | Y | - | - | Y | - |
Mali-T604 (GLES3) | ETC1/ETC2/EAC | 4096 | 4 | 24bit | TBR | unified | mali | 256 | 1024 | 16 | 15 | 16 | 16 | hi, m | hi, m | 4096 | 4096 | Y | Y | Y | Y | Y | Y | Y | Y | - |
Vivante GC860 (GLES2) | S3TC/ETC1 | 2048 | | 24bit | | unified | Y | 160 | 64 | 10 | 8 | 0 | 8 | hi | hi | 8192 | 8192 | - | - | Y | - | Y | - | - | - | - |
Immersion.16 (Vivante GC4000) | S3TC/ETC1 | 8192 | | 24bit | | unified | viv | 568 | 568 | 16 | 12 | 16 | 16 | hi | hi | 8192 | 8192 | - | Y | Y | Y | Y | Y | Y | - | Y |
VideoCore IV | ETC1 | 2048 | | 24bit | TBR | unified | | 136 | 136 | 8 | 8 | 8 | 8 | hi | hi | 2048 | 2048 | - | - | - | - | - | Y | - | - | - |
|
Angle Project (D3D9) | S3TC | 8192 | | 24bit | | unified | – | 254 | 221 | 16 | 10 | 4 | 16 | hi | hi | 8192 | 8192 | | Y | Y | - | Y | - | - | - | - |
|
OpenGL ES 2.0 minimum | ETC1 | | 1 | | | | | 128 | 16 | 8 | 8 | 0 | 8 | hi | m | | | | | | | | | | | |
OpenGL ES 3.0 minimum | ETC2/EAC | 2048 | 4 | 24bit | | | | 256 | 224 | 16 | 15 | 16 | 16 | hi | | 2048 | 2048 | Y | Y | Y | Y | Y | Y | Y | Y | |
OpenGL ES 3.1 minimum | ETC2/EAC | | 4 | | | | | 256 | 224 | 16 | 15 | 16 | 16 | hi | | | | | | | | | | | | |
|
DirectX8 Shader 1.1 | S3TC/DXT | | | | | | Y | 96 | 8 | 16 | 6 | 0 | 4 | hi | low | | | Y | - | - | | | - | | | Y |
DirectX9 Shader 2.0 | S3TC/DXT | | | | | | Y | 256 | 32 | 16 | 10 | 0 | 16 | hi | hi | | | Y | | | | | | | | Y |
DirectX9 Shader 3.0 | S3TC/DXT | | | | | | Y | 256 | 224 | 16 | 10 | 4 | 16 | hi | hi | | | Y | Y | Y | Y | Y | | | | Y |
DirectX10 Shader 4.0 | S3TC/DXT/BC | | | | | | Y | 64K | 64K | 16 | 16 | 128 | 128 | hi | hi | | | Y | Y | Y | Y | Y | Y | Y | | Y |
DirectX10 Shader 4.1 | S3TC/DXT/BC | | | | | | Y | 64K | 64K | 32 | 32 | 128 | 128 | hi | hi | | | Y | Y | Y | Y | Y | Y | Y | | Y |
DirectX11 Shader 5.0 | S3TC/DXT/BC | | | | | | Y | 64K | 64K | | | | | hi | hi | | | Y | Y | Y | Y | Y | Y | Y | | Y |
Uniform:VSH/FSH = vec4 単位の個数。DirectX でいえば Constant Register のこと。
In/Out:VSH = 入力頂点アトリビュート数、vec4 単位の個数。DirectX で言えば Input Assembler
In/Out:FSH = 頂点出力&ピクセル入力レジスタ数、vec4 単位の個数。ラスタライズレジスタの数。
TexUnit:VSH = 頂点テクスチャ枚数
TexUnit:FSH = 通常のテクスチャユニット数 (ピクセルシェーダー)
Shader:bin = シェーダーバイナリフォーマット
Vertex:AO = Array Object
MRT = Multi Render Target
Precision
glGetShaderPrecisionFormat() を使って調べた GPU 毎の演算精度の結果のまとめ。
GPU | type | Vertex FLOAT | Fragment FLOAT | Vertex INT | Fragment INT |
highp | mediump | lowp | highp | mediump | lowp | highp | mediump | lowp | highp | mediump | lowp |
PowerVR SGX540 OMAP4460 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 | 24bit | 11bit | 8bit | 24bit | 11bit | 8bit |
PowerVR SGX540 S5PC110 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 | 24bit | 11bit | 8bit | 24bit | 11bit | 8bit |
PowerVR SGX543MP2 A5 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 | 23bit | 23bit |
PowerVR SGX554MP4 A6X | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 | 23bit | 23bit |
PowerVR SGX535 S5PC100 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 | 23bit | 23bit |
PowerVR G6430 A7 (GLES2) | unified | fp32 (s23e8) | fp16 (s10e5) | fp32 (s23e8) | fp16 (s10e5) | 32bit | 16bit | 32bit | 16bit |
Adreno 200 QSD8250 | unified | fp32 (s24e7) | fp32 (s24e7) | 16bit | 16bit |
Adreno 205 MSM8255 | unified | fp32 (s24e7) | fp32 (s24e7) | 16bit | 16bit |
Adreno 220 MSM8660 | unified | fp32 (s24e7) | fp32 (s24e7) | 16bit | 16bit |
Adreno 320 APQ8064 (GLES2) | unified | fp32 (s24e7) | fp32 (s24e7) | 16bit | 16bit |
GC860 JZ4770 | unified | fp32 (s23e8) | fp32 (s23e8) | 24bit | 24bit |
Mali-400MP4 Exynos4210 | discrete | fp32 (s23e8) | – | fp16 (s10e5) | 24bit | – | 11bit |
Mali-T604 (GLES2) | unified | fp32 (s23e8) | fp16 (s10e5) | fp32 (s23e8) | fp16 (s10e5) | 32bit | 16bit | 32bit | 16bit |
ULP GeForce(8) Tegra2 | discrete | fp32 (s23e8) | – | fp20? (s13e6?) | fix10 | ? | – | ? |
ULP GeForce(12) Tegra3 | discrete | fp32 (s23e8) | – | fp20? (s13e6?) | fix10 | ? | – | ? |
Angle Project (D3D9) | | fp32 (s23e8) | fp32 (s23e8) | 24bit | 24bit |
この結果では VertexShader において、precision が有効なのは PowerVR のみのように見える (実際に走らせた場合はこの結果と異なるので注意)
Unified Shader の場合、Fragment Shader の機能は Vertex と同一。Discrete の場合、Fragment Shader では highp 未対応。
テクスチャサイズが 4096 など大きい場合、GPU によっては texcoord が mediump では解像度が足り無い計算となるが実際は不明。
Tegra の INT 型は、他の GPU と大きく異なる結果を返すため判断できない。
Adreno の結果だけ見ると exp 7bit なので precision が全部の精度を表しているなら fp24 (s16e7) のようにも受け取れる。(実測で fp32 確認)
s23e8 :
s = 1bit sign
23 = 23bit fraction (+1 = 24bit)
e8 = 8bit exponent
実際に走らせた場合の演算精度
実際に走らせてみると glGetShaderPrecisionFormat() の結果とはいろいろ異なっています。整数は未確認。
GPU | type | Vertex FLOAT | Fragment FLOAT |
highp | mediump | lowp | highp | mediump | lowp |
PowerVR SGX540 OMAP4460 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 |
PowerVR SGX535 S5PC100 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16 (s10e5) | fix10 |
PowerVR SGX543MP2 A5 | unified | fp32 (s23e8) | fp16 (s10e5) | fix10 | fp32 (s23e8) | fp16? (s10e5)? |
ULP GeForce(8) Tegra2 | discrete | fp32 (s23e8) | fp16 (s10e5) | fix10? | – | fp16 (s10e5) | fix10 |
Mali-400MP4 Exynos4210 | discrete | fp32 (s23e8) | fp32 or fp16? (s10e5?) | – | fp16 (s10e5) |
Adreno 200/205/220 系 | unified | fp32 (s23e8) | fp32 (s23e8) |
GC860 JZ4770 | unified | fp32 (s23e8) | fp32 (s23e8) |
Adreno は 1.0e-37~1.0e37 まで有効なことを確認したので普通の fp32 (s23e8) でした。
Tegra の Fragment mediump は 20bit ではなく 16bit (fp16 s10e5) でした。
PowerVR SGX535/540/543 の Vertex lowp は -2.0~2.0 の fixed であることを確認しました。