opengl:gpuspecs
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 による結果
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 |
- FLOAT: 浮動小数点型では仮数部の精度は厳密には +1bit
- lowp は OpenGL ES 2.0 の仕様上 -2.0~2.0 の範囲をカバーする。GL ES の仕様上符号を含めて最低 10bit 。
- lowp の glGetShaderPrecisionFormat の Range は -1~1 (log2) となるはずだが iOS の PowerVR SGX だけ range が 0 になっている。
- この結果では 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 であることを確認しました。
- Tegra の VertexShader は mediump, lowp 宣言が有効であることを確認。glGetShaderPrecisionFormat() の結果と大きく異なっています。
- Vertex mediump : range は 16384
- Vertex lowp : range は -2~2048 (plus 方向だけ広い)
- Mali-400 の VertexShader は fp32 固定ですが、mediump 宣言で結果がわずかに変わります。
- 数値演算自体は mediump/lowp でも 1.0e-37~1.0e37 の highp であることを確認しました。highp = fp32 (s23e8)
- もしかしたら attribute や uniform だけ fp16 対応なのかもしれません。
- lowp は存在しておらず mediump と同じでした。
- PowerVR SGX543 は同じ PowerVR でも Fragment Shader の結果が 540/535 と異なっています。
- Vertex Shader は同一
- Fragment Shader の lowp 宣言でも mediump 相当の演算範囲でした。
- 同じ fp16 (s10e5) でも GPU によって指数範囲が異なります。
- fp32 は完全にいっしょです。
opengl/gpuspecs.txt · 最終更新: 2015/02/15 15:28 by oga