2013/03/07
HiSilicon K3V2 の GPU
Huawei の端末に使われている Hisilicon K3V2 の CPU は Cortex-A9 quad ですが、
GPU は詳細不明で 16 core としか書かれていないので少々調べてみました。
GPU は Hisilicon Technologies の Immersion.16 となっています。
GL Extension は下記の通り。
初めて見る GPU ですが、GL_OES_fragment_precision_high かつ
GL_EXT_discard_framebuffer なので、おそらく Unified シェーダーで
Tile Base のアーキテクチャであると考えられます。
また GL_VIV_shader_binary があるので、Vivante の GPU core または
何らかの形で Vivante が関与している可能性が高いようです。
GPU Extension は下記に追加しました。
・OpenGL ES Extension (Mobile GPU)
Vivante GC860 と比べても、Unified + TBR が同一で、かつ
GL_OES_stencil1, GL_OES_stencil4 と言った特徴的なシンボルが含まれています。
ただし GC860 が持っていた S3TC (DXT) に対応しておらず EXT1 のみとなっています。
追記: K3V2 搭載端末の例 (2013/03/09)
・GT01
・STREAM X GL07S
・Ascend D2 HW-03E
・dtab
・端末一覧
関連ページ
・SoC spec list
・OpenGL ES Extension (Mobile GPU)
GPU は詳細不明で 16 core としか書かれていないので少々調べてみました。
GPU は Hisilicon Technologies の Immersion.16 となっています。
GL Extension は下記の通り。
GL_VERSION: OpenGL ES 2.0
GL_RENDERER: Immersion.16
GL_VENDOR: Hisilicon Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00
Extension:
GL_EXT_debug_marker
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_compressed_paletted_texture
GL_OES_EGL_image
GL_OES_depth24
GL_OES_element_index_unit
GL_OES_fbo_render_mipmap
GL_OES_fragment_precision_high
GL_OES_rgb8_rgba8
GL_OES_stencil1
GL_OES_stencil4
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_depth_texture
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_get_program_binary
GL_EXT_texture_format_RGBA8888
GL_IMG_read_format
GL_EXT_blend_minmax
GL_EXT_read_format_bgra
GL_EXT_multi_draw_arrays
GL_APPLE_texture_format_BGRA8888
GL_APPLE_texture_max_level
GL_ARM_rgba8
GL_EXT_frag_depth
GL_VIV_shader_binary
GL_VIV_timestamp
GL_OES_mapbuffer
GL_EXT_discard_framebuffer
GL_OES_vertex_type_10_10_10_2
GL_EXT_texture_type_2_10_10_REV
GL_EXT_texture_filter_anisotropic
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
初めて見る GPU ですが、GL_OES_fragment_precision_high かつ
GL_EXT_discard_framebuffer なので、おそらく Unified シェーダーで
Tile Base のアーキテクチャであると考えられます。
また GL_VIV_shader_binary があるので、Vivante の GPU core または
何らかの形で Vivante が関与している可能性が高いようです。
GPU Extension は下記に追加しました。
・OpenGL ES Extension (Mobile GPU)
Vivante GC860 と比べても、Unified + TBR が同一で、かつ
GL_OES_stencil1, GL_OES_stencil4 と言った特徴的なシンボルが含まれています。
ただし GC860 が持っていた S3TC (DXT) に対応しておらず EXT1 のみとなっています。
追記: K3V2 搭載端末の例 (2013/03/09)
・GT01
・STREAM X GL07S
・Ascend D2 HW-03E
・dtab
・端末一覧
関連ページ
・SoC spec list
・OpenGL ES Extension (Mobile GPU)
OS の更新が始まり、端末によっては使える API が増えています。
Nexus 10 (Exynos 5 Dual 5250) は Android 5.0 で OpenGL ES 3.1 が
使えるようになりました。
Tegra K1 と違い AEP には対応しておりません。
詳細は Extension のページ↓に追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
下記は手持ちの端末で調べたものです。
Amazon Kindle Fire も Fire OS 4 への更新が行われており、
Android 4.4 ベースとなりました。
GPU が対応している場合は OpenGL ES 3.0 が使えるようになっています。
関連エントリ
・Nexus 9 Tegra K1 と ARM 64bit Denver
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索
Nexus 10 (Exynos 5 Dual 5250) は Android 5.0 で OpenGL ES 3.1 が
使えるようになりました。
Tegra K1 と違い AEP には対応しておりません。
GL_VERSION: OpenGL ES 3.1 GL_RENDERER: Mali-T604 GL_VENDOR: ARM GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10
詳細は Extension のページ↓に追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
下記は手持ちの端末で調べたものです。
Nexus の OpenGL API Nexus SoC GPU Android 4.4 Android 5.0 ---------------------------------------------------------------------- Nexus 7 2012 Tegra 3 ULP GeForce OpenGL ES 2.0 OpenGL ES 2.0 Nexus 7 2013 APQ8064 Adreno320 OpenGL ES 3.0 OpenGL ES 3.0 Nexus 5 MSM8974 Adreno330 OpenGL ES 3.0 OpenGL ES 3.0 Nesus 10 Exynos 5D Mali-T604 OpenGL ES 3.0 OpenGL ES 3.1 Nesus 9 Tegra K1 Kepler -- OpenGL ES 3.1 AEP
Amazon Kindle Fire も Fire OS 4 への更新が行われており、
Android 4.4 ベースとなりました。
GPU が対応している場合は OpenGL ES 3.0 が使えるようになっています。
Amazon Fire の OpenGL API Fire SoC GPU FireOS 3 FireOS 4 ---------------------------------------------------------------------- Kindle Fire HDX 7 MSM8974 Adreno 330 OpenGL ES 2.0 OpenGL ES 3.0 Fire HD 6 MT8135 PowerVR G6200 -- OpenGL ES 3.0
関連エントリ
・Nexus 9 Tegra K1 と ARM 64bit Denver
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索
Nexus 6 の GPU Adreno 420 は OpenGL ES 3.1 AEP (Android Extension Pack)
に対応していることがわかりました。
OpenGL ES 3.1 は ComputeShader に対応しています。
OpenGL ES 3.1 AEP ではさらに Tessellator (HullShader/DomainShader,TCS/TES) や
GeometryShader など Direct3D 11 相当の機能が加わります。
これまでに判明した OpenGL ES 3.0 以上対応の GPU
Nexus 9 の Tegra K1 に続き、新型 Nexus はどちらも AEP に対応していることになります。
以下 Nexus 6 Snapdargon 805 APQ8084 の GL Extension
関連エントリ
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索
に対応していることがわかりました。
OpenGL ES 3.1 は ComputeShader に対応しています。
OpenGL ES 3.1 AEP ではさらに Tessellator (HullShader/DomainShader,TCS/TES) や
GeometryShader など Direct3D 11 相当の機能が加わります。
これまでに判明した OpenGL ES 3.0 以上対応の GPU
SoC GPU OpenGL ------------------------------------------------------------------ Kindle Fire HD6 MediaTek MT8135 PowerVR G6430 OpenGL ES 3.0 iPhone/iPad Apple A7/A8 PowerVR G6430 OpenGL ES 3.0 MeMO Pad ME176 BayTrail-T Z3745 HD Graphics OpenGL ES 3.0 LG G Watch W100 Snapdragon 400 Adreno 305 OpenGL ES 3.0 Nexus 7(2013) Snapdragon S4 Pro Adreno 320 OpenGL ES 3.0 Nexus 5 Snapdragon 800 Adreno 330 OpenGL ES 3.0 Nexus 10 Exynos 5 Dual Mali-T604 OpenGL ES 3.1 Nexus 6 Snapdragon 805 Adreno 420 OpenGL ES 3.1 AEP Nexus 9 NVIDIA Tegra K1 Kepler(192) OpenGL ES 3.1 AEP
Nexus 9 の Tegra K1 に続き、新型 Nexus はどちらも AEP に対応していることになります。
以下 Nexus 6 Snapdargon 805 APQ8084 の GL Extension
Extension: GL_EXT_debug_marker GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_KHR_texture_compression_astc_ldr GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_OES_element_index_uint GL_EXT_copy_image GL_EXT_geometry_shader GL_EXT_tessellation_shader GL_OES_texture_stencil8 GL_EXT_shader_io_blocks GL_OES_shader_image_atomic GL_OES_sample_variables GL_EXT_texture_border_clamp GL_EXT_multisampled_render_to_texture GL_OES_shader_multisample_interpolation GL_EXT_draw_buffers_indexed GL_EXT_gpu_shader5 GL_EXT_robustness GL_EXT_texture_buffer GL_OES_texture_storage_multisample_2d_array GL_OES_sample_shading GL_OES_get_program_binary GL_EXT_debug_label GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_QCOM_tiled_rendering GL_ANDROID_extension_pack_es31a GL_EXT_primitive_bounding_box GL_OES_standard_derivatives GL_OES_vertex_array_object GL_KHR_debug
関連エントリ
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・Extension で記事検索
2011/08/07
Android Galaxy S2 ARM Mali-400 MP は速い (2)
そこそこ複雑なシーンでの比較。
そこそこの背景+キャラ描画に Shadow map ありの数値です。
TBR だし OpenGL ES 2.0 では Shadow map は現実的ではないと
思ってましたが Mali だと十分できそうです。
影なしだと全体的に数値が上がり、Mali はほとんど 60fps 固定。
PVR 対策で alpha test は off。
圧縮テクスチャ次第ではもう少し差が縮まるかもしれません。
Tegra2 は解像度が異なり近い条件での比較ができませんでした。
Tegra2 には depth texture がありませんが、代わりに half float
の color buffer を使っています。
・GL ES Extension 一覧
関連エントリ
・Android Galaxy S2 ARM Mali-400 MP
Mali-400MP 800x480 : 50fps Adreno 205 854x480 : 20fps Adreno 200 800x480 : 5fps PVR SGX540 800x480 : 23fps
そこそこの背景+キャラ描画に Shadow map ありの数値です。
TBR だし OpenGL ES 2.0 では Shadow map は現実的ではないと
思ってましたが Mali だと十分できそうです。
影なしだと全体的に数値が上がり、Mali はほとんど 60fps 固定。
PVR 対策で alpha test は off。
圧縮テクスチャ次第ではもう少し差が縮まるかもしれません。
Tegra2 は解像度が異なり近い条件での比較ができませんでした。
Tegra2 には depth texture がありませんが、代わりに half float
の color buffer を使っています。
if( Extension("GL_OES_depth_texture") ){ ~ }else if( Extension("GL_OES_texture_half_float") ){ // Tegra250 glGenTextures( 1, &gShadowTexture ); glBindTexture( GL_TEXTURE_2D, gShadowTexture ); glTexImage2D( GL_TEXTURE_2D, 0, GL_LUMINANCE, width, height, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, NULL ); glGenRenderbuffers( 1, &gShadowDepth ); glBindRenderbuffer( GL_RENDERBUFFER, gShadowDepth ); glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height ); glGenFramebuffers( 1, &gShadowTarget ); glBindFramebuffer( GL_FRAMEBUFFER, gShadowTarget ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gShadowTexture, 0 ); glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, gShadowDepth ); }
・GL ES Extension 一覧
関連エントリ
・Android Galaxy S2 ARM Mali-400 MP
2012/08/28
OpenGL ES 2.0 BGRA Texture を直接読む
OpenGL と Direct3D は Texture の RGB の並びが違っています。
Vista の D3D10 で一度 OpenGL の並び順に統一されましたが
Windows 7 以降、D3D11 で元の Windows 配列が復活しました。
DDS 形式のデータはデフォルトで Windows 順の配列になっています。
OpenGL ES 2.0 では BGRA は定義されておらず、Texture Swizzle も
ないので DDS の Texture を読み込む場合は色の並び順を反転させる
必要があります。
並びの違いについて詳しくは下記の記事を参照してください。
・OpenGLES2.0 DDS テクスチャを読み込む
ですが結局 GPU としては OpenGL/D3D 両方に対応するものがほとんど
なので、この両者にそれほど違いはありません。
どちらかに決めてしまえばシェーダーでも入れ替えできます。
下記のデータを見ても、PowerVR, Adreno, Tegra は
GL_EXT_texture_format_BGRA8888 に対応していることがわかります。
・OpenGL ES Extension (Mobile GPU)
同じ PowerVR でも iOS の場合は GL_EXT_texture_format_BGRA8888
ではなく GL_APPLE_texture_format_BGRA8888 になっています。
どちらも DirectX の Windows 配列のピクセルをそのまま glTexImage2D() に
渡せる点は同じです。でも使い方が少し違います。
おそらく内部で RGBA 並びに統一した方が効率的にアクセスできるのでしょう。
PowerVR は lowp の swizzle が苦手ということもありますし、
結局ロード時に自分で byte 並びを入れ替えても変わらないかもしれません。
Mali-400MP は GL_EXT_texture_format_BGRA8888 に対応していません。
Extension として GL_ARM_rgba8 がありますが、こちらは Texture ではなく
フレームバッファの並び順です。
関連エントリ
・OpenGLES2.0 DDS テクスチャを読み込む
Vista の D3D10 で一度 OpenGL の並び順に統一されましたが
Windows 7 以降、D3D11 で元の Windows 配列が復活しました。
DDS 形式のデータはデフォルトで Windows 順の配列になっています。
Windows : B8 G8 R8 A8 OpenGL : R8 G8 B8 A8
OpenGL ES 2.0 では BGRA は定義されておらず、Texture Swizzle も
ないので DDS の Texture を読み込む場合は色の並び順を反転させる
必要があります。
並びの違いについて詳しくは下記の記事を参照してください。
・OpenGLES2.0 DDS テクスチャを読み込む
ですが結局 GPU としては OpenGL/D3D 両方に対応するものがほとんど
なので、この両者にそれほど違いはありません。
どちらかに決めてしまえばシェーダーでも入れ替えできます。
下記のデータを見ても、PowerVR, Adreno, Tegra は
GL_EXT_texture_format_BGRA8888 に対応していることがわかります。
・OpenGL ES Extension (Mobile GPU)
同じ PowerVR でも iOS の場合は GL_EXT_texture_format_BGRA8888
ではなく GL_APPLE_texture_format_BGRA8888 になっています。
どちらも DirectX の Windows 配列のピクセルをそのまま glTexImage2D() に
渡せる点は同じです。でも使い方が少し違います。
Extension InternalFormat Format Type
---------------------------------------------------------------
EXT BGRA8888 GL_BGRA_EXT GL_BGRA_EXT GL_UNSIGNED_BYTE
APPLE BGRA8888 GL_RGBA GL_BGRA_EXT GL_UNSIGNED_BYTE
おそらく内部で RGBA 並びに統一した方が効率的にアクセスできるのでしょう。
PowerVR は lowp の swizzle が苦手ということもありますし、
結局ロード時に自分で byte 並びを入れ替えても変わらないかもしれません。
Mali-400MP は GL_EXT_texture_format_BGRA8888 に対応していません。
Extension として GL_ARM_rgba8 がありますが、こちらは Texture ではなく
フレームバッファの並び順です。
関連エントリ
・OpenGLES2.0 DDS テクスチャを読み込む
Snapdragon 820 (Adreno 530) の OpenGL ES の extension 結果です。Snapdragon 820 は Qualcomm 独自の 64bit CPU Kyro を搭載し、GPU も Adreno 530 に強化されています。
Android 6 なので ES 3.1 AEP 止まりですが、Android N 以降では ES 3.2 と Vulkan に対応するものと思われます。この中では ASTC HDR 対応が目を引きます。今までサポートしていたのは Mali だけでした。
Adreno 400 等、他の GPU のデータは下記からどうぞ。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
HTC 10 Snapdragon 820 Android 6.0 CPU Kyro 2+2 core GPU Adreno 530
Android 6 なので ES 3.1 AEP 止まりですが、Android N 以降では ES 3.2 と Vulkan に対応するものと思われます。この中では ASTC HDR 対応が目を引きます。今までサポートしていたのは Mali だけでした。
GL_VENDOR: Qualcomm GL_RENDERER: Adreno (TM) 530 GL_VERSION: OpenGL ES 3.1 V@145.0 (GIT@I7b6ba47bd6) GL_EXTENSIONS: GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_KHR_texture_compression_astc_ldr GL_KHR_texture_compression_astc_hdr GL_OES_texture_compression_astc GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_OES_element_index_uint GL_EXT_copy_image GL_EXT_geometry_shader GL_EXT_tessellation_shader GL_OES_texture_stencil8 GL_EXT_shader_io_blocks GL_OES_shader_image_atomic GL_OES_sample_variables GL_EXT_texture_border_clamp GL_EXT_multisampled_render_to_texture GL_OES_shader_multisample_interpolation GL_EXT_texture_cube_map_array GL_EXT_draw_buffers_indexed GL_EXT_gpu_shader5 GL_EXT_robustness GL_EXT_texture_buffer GL_EXT_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_OES_texture_storage_multisample_2d_array GL_OES_sample_shading GL_OES_get_program_binary GL_EXT_debug_label GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_QCOM_tiled_rendering GL_ANDROID_extension_pack_es31a GL_EXT_primitive_bounding_box GL_OES_standard_derivatives GL_OES_vertex_array_object GL_EXT_disjoint_timer_query GL_KHR_debug GL_EXT_YUV_target GL_EXT_sRGB_write_control GL_EXT_texture_norm16 GL_EXT_discard_framebuffer GL_OES_surfaceless_context GL_OVR_multiview GL_OVR_multiview2 GL_EXT_texture_sRGB_R8 GL_KHR_no_error GL_EXT_debug_marker GL_OVR_multiview_multisampled_render_to_texture GL_EXT_buffer_storage GL_EXT_blit_framebuffer_paramsDisabled
Adreno 400 等、他の GPU のデータは下記からどうぞ。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
2013/06/25
NVIDIA Tegra4 の OpenGL ES 2.0 Extension
REGRA Tablet AT703 より、Tegra4 の GL Extension です。
以前の Tegra2/3 と比べて Extension の数が大幅に増えています。
Tegra3 (Nexus 7) 比で 1.7倍、初期の Tegra2 の 2倍くらいあります。
Tegra2/3 (ULP GeForce) の単なる強化版ではなく、GPU 機能そのものが
大きく変わっていることがわかります。
また NV 拡張機能の割合が非常に多くなっています。
51% も占めており、ハードウエアを使いこなすために NVIDIA がかなり力を
入れている様子が伺えます。
ただ開発サイドとしては、独自拡張よりも他社 GPU との互換性が高まった
ことの方が嬉しいというのが本音です。
例えばこれとか。
GL_OES_depth24
GL_OES_depth_texture
今まで見てきた OpenGL ES 2.0 GPU で 24bit depth が使えなかったのは
Tegra2/3 だけでした。
Tegra4 以降は広い空間のレンダリングも 24bit 前提で作ることができます。
depth_texture も同じで、ShadpwMap を使う場合 Tegra2/3 の場合だけ
別処理が必要でした。
Tegra4 はこれらの欠点を補うどころか、むしろ積極的に機能拡張が
行われているようです。
GL_EXT_shadow_samplers
OpenGL ES 3.0 では標準となる機能ですが、PowerVR SGX 5XT など一部の
GPU ではすでに使えるようになっています。
ただしフィルタリングがかかりませんでした。
未確認ですが Tegra4 はおそらく PCF に対応していると考えられます。
他にも sRGB や draw_instanced など、OpenGL ES 3.0 に対応していないものの
同等の描画が出来るだけの拡張が施されていることがわかります。
他の GPU との比較はこちら↓から。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Nexus 10 GPU Mali-T604
・3DMark Android 版の結果から
・HiSilicon K3V2 の GPU
・2013/01/09:Qualcomm APQ8064 GPU Adreno 320 の速度
Extension:
GL_OES_rgb8_rgba8
GL_OES_EGL_sync
GL_OES_surfaceless_context
GL_OES_fbo_render_mipmap
GL_NV_depth_nonliner
GL_NV_draw_path
GL_NV_draw_texture
GL_NV_texture_npot_2D_mipmap
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_vertex_half_float
GL_OES_mapbuffer
GL_NV_draw_buffers
GL_NV_multiview_draw_buffers
GL_EXT_color_buffer_half_float
GL_EXT_packed_float
GL_EXT_texture_rg
GL_OES_texture_half_float
GL_NV_texture_array
GL_OES_compressed_ETC1_RGB8_texture
GL_EXT_texture_compression_latc
GL_NV_texture_compression_latc
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_s3tc
GL_NV_texture_compression_s3tc
GL_EXT_texture_filter_anisotropic
GL_NV_get_tex_image
GL_NV_read_buffer
GL_NV_shader_framebuffer_fetch
GL_NV_copy_image
GL_NV_fbo_color_attachments
GL_EXT_bgra
GL_EXT_texture_format_BGRA8888
GL_EXT_read_format_bgra
GL_EXT_unpack_subimage
GL_NV_pack_subimage
GL_NV_texture_compression_s3tc_update
GL_NV_read_depth
GL_NV_read_stencil
GL_NV_uniform_buffer_object
GL_NV_map_buffer_range
GL_EXT_robustness
GL_OES_standard_derivatives
GL_NV_EGL_stream_consumer_external
GL_EXT_separate_shader_objects
GL_NV_copy_buffer
GL_NV_3dvision_settings
GL_EXT_debug_marker
GL_EXT_debug_label
GL_KHR_debug
GL_EXT_texture_storage
GL_NV_pixel_buffer_object
GL_NV_framebuffer_blit
GL_NV_non_square_matrices
GL_NV_explicit_attrib_location
GL_OES_vertex_array_object
GL_NV_smooth_points_lines
GL_OES_texture_half_float_linear
GL_NV_texture_border_clamp
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_NV_shadow_samplers_cube
GL_NV_shadow_samplers_array
GL_EXT_shadow_samplers
GL_OES_depth24
GL_EXT_sRGB
GL_NV_sRGB_formats
GL_NV_generate_mipmap_sRGB
GL_EXT_occlusion_query_boolean
GL_NV_occlusion_query_samples
GL_NV_timer_query
GL_NV_framebuffer_multisamples
GL_EXT_frag_depth
GL_NV_instanced_arrays
GL_NV_draw_instanced
GL_NV_secure_context
以前の Tegra2/3 と比べて Extension の数が大幅に増えています。
Tegra3 (Nexus 7) 比で 1.7倍、初期の Tegra2 の 2倍くらいあります。
Tegra2/3 (ULP GeForce) の単なる強化版ではなく、GPU 機能そのものが
大きく変わっていることがわかります。
また NV 拡張機能の割合が非常に多くなっています。
51% も占めており、ハードウエアを使いこなすために NVIDIA がかなり力を
入れている様子が伺えます。
ただ開発サイドとしては、独自拡張よりも他社 GPU との互換性が高まった
ことの方が嬉しいというのが本音です。
例えばこれとか。
GL_OES_depth24
GL_OES_depth_texture
今まで見てきた OpenGL ES 2.0 GPU で 24bit depth が使えなかったのは
Tegra2/3 だけでした。
Tegra4 以降は広い空間のレンダリングも 24bit 前提で作ることができます。
depth_texture も同じで、ShadpwMap を使う場合 Tegra2/3 の場合だけ
別処理が必要でした。
Tegra4 はこれらの欠点を補うどころか、むしろ積極的に機能拡張が
行われているようです。
GL_EXT_shadow_samplers
OpenGL ES 3.0 では標準となる機能ですが、PowerVR SGX 5XT など一部の
GPU ではすでに使えるようになっています。
ただしフィルタリングがかかりませんでした。
未確認ですが Tegra4 はおそらく PCF に対応していると考えられます。
他にも sRGB や draw_instanced など、OpenGL ES 3.0 に対応していないものの
同等の描画が出来るだけの拡張が施されていることがわかります。
他の GPU との比較はこちら↓から。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Nexus 10 GPU Mali-T604
・3DMark Android 版の結果から
・HiSilicon K3V2 の GPU
・2013/01/09:Qualcomm APQ8064 GPU Adreno 320 の速度
2011/10/15
A5 PowerVR SGX543MP2 は iOS 5 だと速い
iPad2 を iOS5 にアップデートしたら 3D の描画性能が大幅に向上しました。
テスト内容は前回までと同じです。
iOS5 では 15fps → 20fps 、 45fps → 57fps とスコアが伸びています。
iOS5 ではドライバレベルで大きく手が加えられているようです。
まず OpenGL が返す Extension List が増えています。
Extension の中身は下記のページに追加しました。
・Mobile CPU/GPU の詳細 OpenGL Extension など
さらにレンダリング可能な解像度と最大テクスチャサイズも 2048 から 4096 へと
拡張されました。
iOS4 までは互換性重視なのか PowerVR SGX535 と全く同じ値を返していました。
iOS5 でやっと PowerVR SGX543MP 本来の能力を引き出せるようになったのかもしれません。
速度に大きな差があることから、シェーダーコンパイラの最適化がより進んだ
可能性があります。
残念ながら PowerVR SGX535 搭載の iPod tpuch3/4 では iOS5 に更新しても
速度は変わりませんでした。
今までのテスト結果を下記のページにまとめました。
・Mobile GPU 速度比較のまとめ
シェーダー負荷が小さいケースではおそらく PowerVR SGX543MP2 の圧勝です。
重いシェーダーでは Mali-400MP, Adreno 220 に届きませんが差は縮まっています。
やはりこの 3 GPU が現段階での最速候補のようです。
関連エントリ
・さらに OpenGL ES 2.0 Mobile GPU の速度比較
・OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
・Android HTC EVO 3D GPU Adreno 220 の速度
・OpenGL ES 2.0 shader の演算精度
・Android Galaxy S2 ARM Mali-400 MP は速い (2)
テスト内容は前回までと同じです。
iPad2 ( A5 : PowerVR SGX543MP2 ) (1) light 3 + shadow map ------------------------------------ iOS 5 15.81 fps 13.0Mpix/sec iOS 4 11.83 fps 12.4Mpix/sec (2) light 3 ------------------------------------ iOS 5 20.67 fps 16.3Mpix/sec iOS 4 15.27 fps 12.0Mpix/sec (3) light 1 ------------------------------------ iOS 5 57.04 fps 44.9Mpix/sec iOS 4 45.49 fps 35.8Mpix/sec
iOS5 では 15fps → 20fps 、 45fps → 57fps とスコアが伸びています。
iOS5 ではドライバレベルで大きく手が加えられているようです。
まず OpenGL が返す Extension List が増えています。
Extension の中身は下記のページに追加しました。
・Mobile CPU/GPU の詳細 OpenGL Extension など
さらにレンダリング可能な解像度と最大テクスチャサイズも 2048 から 4096 へと
拡張されました。
iOS4 までは互換性重視なのか PowerVR SGX535 と全く同じ値を返していました。
iOS5 でやっと PowerVR SGX543MP 本来の能力を引き出せるようになったのかもしれません。
速度に大きな差があることから、シェーダーコンパイラの最適化がより進んだ
可能性があります。
残念ながら PowerVR SGX535 搭載の iPod tpuch3/4 では iOS5 に更新しても
速度は変わりませんでした。
今までのテスト結果を下記のページにまとめました。
・Mobile GPU 速度比較のまとめ
シェーダー負荷が小さいケースではおそらく PowerVR SGX543MP2 の圧勝です。
重いシェーダーでは Mali-400MP, Adreno 220 に届きませんが差は縮まっています。
やはりこの 3 GPU が現段階での最速候補のようです。
関連エントリ
・さらに OpenGL ES 2.0 Mobile GPU の速度比較
・OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
・Android HTC EVO 3D GPU Adreno 220 の速度
・OpenGL ES 2.0 shader の演算精度
・Android Galaxy S2 ARM Mali-400 MP は速い (2)
GPU 毎の Extension の結果も追加しました。
・Vulkan Device Features (GPU毎の比較表)
上のページで一番下の表は Instance/Device それぞれの対応 Extension の取得結果です。初期化時に参考になるかと思います。
関連エントリ
・vulkaninfo 結果の比較表 (Desktop GPU/Mobile GPU)
・Android の Vulkaninfo 結果
・Android で Vulkan Sample を走らせるまでの手順
・Linux で Vulkan を使う (GeForce, RADEON, Intel)
・低レベル API 対応 GPU まとめ (D3D12,Vulkan,Metal)
・Vulkan Device Features (GPU毎の比較表)
上のページで一番下の表は Instance/Device それぞれの対応 Extension の取得結果です。初期化時に参考になるかと思います。
関連エントリ
・vulkaninfo 結果の比較表 (Desktop GPU/Mobile GPU)
・Android の Vulkaninfo 結果
・Android で Vulkan Sample を走らせるまでの手順
・Linux で Vulkan を使う (GeForce, RADEON, Intel)
・低レベル API 対応 GPU まとめ (D3D12,Vulkan,Metal)
OpenGL 4.5 から GL_ARB_ES3_1_compatibility が含まれるようになりました。
Mobile 向け API OpenGL ES 3.1 と互換性があります。
実際に GeForce GTX 650 (GK107 Kepler) で OpenGL ES 3.1 context を作成したのが
下記の結果です。
Extension として GL_ANDROID_extension_pack_es31a が含まれており、
OpenGL ES 3.1 AEP に対応していることがわかります。
つまり Android 向け Tegra K1 同様に OpenGL ES API でも D3D11 相当の機能を
利用することができるわけです。
省略部分を含めてより詳しい結果は下記のページに追加しました。
・Desktop GPU Extensions
下記には Tegra K1 (Kepler) のデータを載せていますので、比べてみると
Tegra K1 と GeForce GTX 650 の結果ほとんど同じであることがわかります。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
同じ GPU Core かつドライバもおそらく同一なのでしょう。
Android で動くなら Linux も同様で、共通化されているものと思われます。
実際に OpenGL ES 3.1 context を作成することができました。
上では Version 3.1 を指定していますが、Android と同じく ES 2.0 の Context に
対しても 3.1 を返すようです。
この手順は下記のページにも追加しました。
・Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境
Desktop でも Kepler 世代 GeForce を載せているならそもそも同じ GPU なので、
以前の Emulator のようなツールに頼る必要がないわけです。
逆に Mobile GPU で OpenGL ES を使う意味も無くなりつつあります。
↓ NVIDIA SHILED Tablet では OpenGL 4.5 に対応したことが発表されています。
・Impress NVIDIA、SHIELDタブレット用Android 5.0.1アップデートを配信開始
ハイエンド向け API はそろそろ統合してもよいのかもしれません。
関連エントリ
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・Nexus 9 Tegra K1 と ARM 64bit Denver
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・OpenGL 4.3 と GL_ARB_ES3_compatibility
Mobile 向け API OpenGL ES 3.1 と互換性があります。
OpenGL 4.1 GL_ARB_ES2_compatibility OpenGL 4.3 GL_ARB_ES3_compatibility OpenGL 4.5 GL_ARB_ES3_1_compatibility
実際に GeForce GTX 650 (GK107 Kepler) で OpenGL ES 3.1 context を作成したのが
下記の結果です。
GL_VERSION: OpenGL ES 3.1 NVIDIA 347.09 GL_RENDERER: GeForce GTX 650/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10 Extension: GL_NV_internalformat_sample_query GL_EXT_base_instance ~ GL_OES_vertex_half_float GL_ANDROID_extension_pack_es31a
Extension として GL_ANDROID_extension_pack_es31a が含まれており、
OpenGL ES 3.1 AEP に対応していることがわかります。
つまり Android 向け Tegra K1 同様に OpenGL ES API でも D3D11 相当の機能を
利用することができるわけです。
省略部分を含めてより詳しい結果は下記のページに追加しました。
・Desktop GPU Extensions
下記には Tegra K1 (Kepler) のデータを載せていますので、比べてみると
Tegra K1 と GeForce GTX 650 の結果ほとんど同じであることがわかります。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
同じ GPU Core かつドライバもおそらく同一なのでしょう。
Android で動くなら Linux も同様で、共通化されているものと思われます。
実際に OpenGL ES 3.1 context を作成することができました。
// Windows WGL
static const int opengl_es31[]= {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, 0,
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
0,
};
HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es31 );
static const int opengl_es31[]= {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1,
WGL_CONTEXT_FLAGS_ARB, 0,
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
0,
};
HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es31 );
// X11 GLX
static const int opengl_es31[]= {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_FLAGS_ARB, 0,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT,
None,
};
GLXContext context= glXCreateContextAttribsARB( display, config, 0, True, opengl_es31 );
static const int opengl_es31[]= {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_FLAGS_ARB, 0,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_ES2_PROFILE_BIT_EXT,
None,
};
GLXContext context= glXCreateContextAttribsARB( display, config, 0, True, opengl_es31 );
上では Version 3.1 を指定していますが、Android と同じく ES 2.0 の Context に
対しても 3.1 を返すようです。
この手順は下記のページにも追加しました。
・Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境
Desktop でも Kepler 世代 GeForce を載せているならそもそも同じ GPU なので、
以前の Emulator のようなツールに頼る必要がないわけです。
逆に Mobile GPU で OpenGL ES を使う意味も無くなりつつあります。
↓ NVIDIA SHILED Tablet では OpenGL 4.5 に対応したことが発表されています。
・Impress NVIDIA、SHIELDタブレット用Android 5.0.1アップデートを配信開始
ハイエンド向け API はそろそろ統合してもよいのかもしれません。
関連エントリ
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・Nexus 9 Tegra K1 と ARM 64bit Denver
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・OpenGL 4.3 と GL_ARB_ES3_compatibility
NVIDIA SHIELD Android TV はすでに OpenGL ES 3.2 の Context に対応していることがわかりました。
OpenGL ES 3.2 は ES 3.1 AEP が取り込まれており D3D11/OpenGL 4.x 相当の API となります。Android SDK が 3.2 に対応していないので現状ではあまり意味はありませんが、Desktop と共通のドライバが使われていることが読み取れます。
下記は Tegra K1 (Nexus 9 Driver 343.00) から追加された Extension です。
↑ GL_NV_conservative_raster や GL_NV_fragment_shader_interlock など、Maxwell GM2xx で追加された D3D12 相当の機能も見えます。(参考)
↓ 他にも K1 との違いとして fp16 対応があります。
詳細は下記に追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
公式サイトには Tegra X1 の CPU clock が載っていませんが、調べた限りでは 2.0GHz でした。ただし VFP Benchmark の実測では 2.1GHz 相当なので TB のような機能が働いているものと思われます。
・VFP Benchmark Log
関連エントリ
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
Android 5.1 Tegra X1 Maxwell (256) GL_VERSION: OpenGL ES 3.2 NVIDIA 349.00 GL_RENDERER: NVIDIA Tegra GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.20
OpenGL ES 3.2 は ES 3.1 AEP が取り込まれており D3D11/OpenGL 4.x 相当の API となります。Android SDK が 3.2 に対応していないので現状ではあまり意味はありませんが、Desktop と共通のドライバが使われていることが読み取れます。
下記は Tegra K1 (Nexus 9 Driver 343.00) から追加された Extension です。
GL_EXT_discard_framebuffer GL_EXT_draw_elements_base_vertex GL_EXT_multi_draw_indirect GL_EXT_post_depth_coverage GL_EXT_raster_multisample GL_EXT_shader_texture_lod GL_KHR_context_flush_control GL_KHR_robust_buffer_access_behavior GL_KHR_robustness GL_NV_conditional_render GL_NV_conservative_raster GL_NV_fill_rectangle GL_NV_fragment_coverage_to_color GL_NV_fragment_shader_interlock GL_NV_framebuffer_mixed_samples GL_NV_geometry_shader_passthrough GL_NV_path_rendering_shared_edge GL_NV_polygon_mode GL_NV_sample_locations GL_NV_sample_mask_override_coverage GL_NV_shader_noperspective_interpolation GL_NV_viewport_array GL_NV_viewport_array2 GL_OES_copy_image GL_OES_draw_buffers_indexed GL_OES_draw_elements_base_vertex GL_OES_texture_border_clamp GL_OES_tessellation_point_size GL_OES_tessellation_shader GL_OES_texture_buffer GL_OES_geometry_point_size GL_OES_geometry_shader GL_OES_gpu_shader5 GL_OES_shader_io_blocks GL_OES_texture_view GL_OES_primitive_bounding_box GL_OES_texture_cube_map_array
↑ GL_NV_conservative_raster や GL_NV_fragment_shader_interlock など、Maxwell GM2xx で追加された D3D12 相当の機能も見えます。(参考)
↓ 他にも K1 との違いとして fp16 対応があります。
Precision: 0: [15 15] 10 VS float lowp 1: [15 15] 10 VS float mediump 2: [127 127] 23 VS float highp 3: [31 30] 0 VS int lowp 4: [31 30] 0 VS int mediump 5: [31 30] 0 VS int highp 6: [15 15] 10 FS float lowp 7: [15 15] 10 FS float mediump 8: [127 127] 23 FS float highp 9: [31 30] 0 FS int lowp 10: [31 30] 0 FS int mediump 11: [31 30] 0 FS int highp
詳細は下記に追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
公式サイトには Tegra X1 の CPU clock が載っていませんが、調べた限りでは 2.0GHz でした。ただし VFP Benchmark の実測では 2.1GHz 相当なので TB のような機能が働いているものと思われます。
・VFP Benchmark Log
関連エントリ
・Direct3D 12 GeForce GTX970 は FeatureLevel 12_1 対応、Resource Bind/Heap Tier は低い
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
2014/01/15
OpenGL ES 2.0 Adreno 330, Tegra 4 の GPU 速度
ベンチマークの結果を更新しました。
・Mobile GPU bench mark
Android 4.1 以降かつ対応しているデバイスでは SwapInterval を 0 に
変更したので 60fps 以上出ています。(関連)
Adreno 330 は予想以上に速く、Adreno 320 比でもおよそ 2倍の速度が出ています。
ついに一番負荷が高い設定でも Full HD (1920x1200) で 60fps を超えるように
なってしまいました。
2010 年の GPU では 800x480 でもわずか 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 がかかるとは限らないようです。
下記はいくつかテストした結果です。
この辺りはもう少し詳しく調べたいと思っています。
なお 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 速度に関連するエントリ
・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 (1920x1200) で 60fps を超えるように
なってしまいました。
2010 年の GPU では 800x480 でもわずか 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 速度に関連するエントリ
HONEY BEE 101K は Renesas SH-Mobile APE5R を搭載した
Android スマートフォンです。
CPU Core は ARM Cortex-A9 1.2GHz の dual、
GPU core は PowerVR SGX543MP2 と意外なほどパワフルです。
・KYOCERA HONEY BEE 101K
GPU である PowerVR SGX543MP2 は iPhone 4S/iPad2 に使われており、
4core 版 SGX543MP4 は iPad 3 や PS Vita で有名です。
ところが Android ではほとんど見かけることがありませんでした。
触る機会があったので試してみました。
・CPU info/GPU Caps/Extension 等
Android なので PVRTC だけでなく ETC1 もサポートされています。
テクスチャサイズが 4096 になっただけで、Extension 等それ以外の
機能は PowerVR SGX540 とほとんど同じです。
GL_EXT_shadow_samplers も無く iOS 5 になる前の iPad2 に
似ているかもしれません。
・GPU ベンチマーク
速度はそこそこですが走らせるにあたりいくつか問題がありました。
(1) GL_OUT_OF_MEMORY が出やすい
glDrawElements() で GL_OUT_OF_MEMORY が発生することがあります。
「CPU info/GPU Caps/Extension 等」のページに meminfo の値も追加してみました。
比べてみると GPU に割り当てられていると思われる領域が
101K の場合少ないようです。
ただしこれが本当に GPU memory に影響しているのか、
また GL_OUT_OF_MEMORY の原因なのかどうかはわかりません。
例えば Tegra3 である TF201 も少なくなっています。
その代わり他のデバイスには存在しない DirectMap4k/DirectMap2M という
エントリが存在しており、おそらく他のデバイスとは異なる方法で
GPU メモリを管理していると考えられます。
(2) 3D 描画しているのに CPU clock が低下する
画面を操作している間だけ描画フレームレートが上昇することに
気が付きました。
CPU clock をモニタリングしてみると、ベンチマークの 3D 描画中も
300MHz 程度まで clock が下がっているようです。
画面を連打していると 1.2GHz 近くまで上がるため、ユーザー操作が
ない場合は描画負荷が高くても cpu を寝かせる仕様なのかもしれません。
ハイエンド機ではないので当然かもしれませんが、RAM も少な目で
GPU をあまり活かしきれていないのが少々残念でした。
Android スマートフォンです。
CPU Core は ARM Cortex-A9 1.2GHz の dual、
GPU core は PowerVR SGX543MP2 と意外なほどパワフルです。
・KYOCERA HONEY BEE 101K
GPU である PowerVR SGX543MP2 は iPhone 4S/iPad2 に使われており、
4core 版 SGX543MP4 は iPad 3 や PS Vita で有名です。
ところが Android ではほとんど見かけることがありませんでした。
触る機会があったので試してみました。
・CPU info/GPU Caps/Extension 等
Android なので PVRTC だけでなく ETC1 もサポートされています。
テクスチャサイズが 4096 になっただけで、Extension 等それ以外の
機能は PowerVR SGX540 とほとんど同じです。
GL_EXT_shadow_samplers も無く iOS 5 になる前の iPad2 に
似ているかもしれません。
・GPU ベンチマーク
速度はそこそこですが走らせるにあたりいくつか問題がありました。
(1) GL_OUT_OF_MEMORY が出やすい
glDrawElements() で GL_OUT_OF_MEMORY が発生することがあります。
「CPU info/GPU Caps/Extension 等」のページに meminfo の値も追加してみました。
比べてみると GPU に割り当てられていると思われる領域が
101K の場合少ないようです。
ただしこれが本当に GPU memory に影響しているのか、
また GL_OUT_OF_MEMORY の原因なのかどうかはわかりません。
OS RAM MemTotal (RAM-MemTotal) -------------------------------------------------------------- ZEN Touch2 2.1 256MB 185.2MB 70.8MB ZiiO 7 2.1 512MB 408.3MB 103.7MB LuvPad AD100 2.2 512MB 438.3MB 73.7MB Desire X06HT 2.2 576MB 415.2MB 160.1MB Galaxy S SC-02B 2.2 512MB 302.1MB 209.9MB Xperial arc SO-01C 2.3 512MB 335.4MB 176.6MB Xperial ray SO-03C 2.3 512MB 335.4MB 176.6MB HONEY BEE 101K 2.3 512MB 478.1MB 33.9MB Novo7 Paladin 4.0 512MB 334.9MB 177.0MB SXZ-PD10 4.0 512MB 368.3MB 143.7MB EVO 3D ISW12HT 2.3 1024MB 808.1MB 215.9MB Galaxy S2 SC-02C 2.3 1024MB 836.9MB 187.1MB Galaxy Nexus SC-04D 4.0 1024MB 631.2MB 392.8MB Optimus Pad L-06C 3.1 1024MB 662.3MB 361.7MB Galaxy Tab 10.1 SC-01D 3.2 1024MB 756.7MB 267.3MB EeePad TF201 4.0 1024MB 983.2MB 40.8MB (*1) *1: DirectMap4k/DirectMap2M
例えば Tegra3 である TF201 も少なくなっています。
その代わり他のデバイスには存在しない DirectMap4k/DirectMap2M という
エントリが存在しており、おそらく他のデバイスとは異なる方法で
GPU メモリを管理していると考えられます。
(2) 3D 描画しているのに CPU clock が低下する
画面を操作している間だけ描画フレームレートが上昇することに
気が付きました。
CPU clock をモニタリングしてみると、ベンチマークの 3D 描画中も
300MHz 程度まで clock が下がっているようです。
画面を連打していると 1.2GHz 近くまで上がるため、ユーザー操作が
ない場合は描画負荷が高くても cpu を寝かせる仕様なのかもしれません。
ハイエンド機ではないので当然かもしれませんが、RAM も少な目で
GPU をあまり活かしきれていないのが少々残念でした。
2013/07/25
Android 4.3 と OpenGL ES 3.0
Android 4.3 がリリースされ OpenGL ES 3.0 対応になりました。
OpenGL ES 3.0 は OpenGL 3.x 世代に対応する API セットで、
DirectX では Direct3D 10 に相当します。
GeometryShader はないものの、ES 2.0 世代ではオプションだった多くの
項目が標準となり、PC 向け GPU と比べて機能差が無くなりつつあります。
また D3D10 (ShaderModel 4) 世代の大きな特徴として、データフォーマットの
拡大や GPU リソースの汎用化があげられます。
OpenGL ES 3.0 の登場は、描画以外の GPU 活用につながる
第一歩といえるかもしれません。
実際に Nexus 10 (Android 4.3) で試してみました。
新しい Texture format ETC2/EAC が使えるようになっています。
ASTC はありませんでした。
core 機能が大幅に増えているため Extension 自体は控えめです。
下記ページで ES 2.0 と比べることができます。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Android NDK が更新されていないので今のところ Java API のみとなっているようです。
OpenGL ES 3.0 は OpenGL ES 2.0 と互換性があるので 3.0 の context 上でも
ES 2.0 の NDK アプリケーションがそのまま動作しました。
API に互換性はあるものの、GLSL ES 1.0 と GLSL ES 3.0 では shader の書式が
異なっています。
OpenGL ES 2.0 (GLSL ES 1.0) 用であることを明確に宣言するには shader の
先頭に "#version 100" を追加しておきます。
同様に Nexus 7 にも Android 4.3 を入れてみましたが、
Tegra3 なのでやはり OpenGL ES 3.0 は動きませんでした。
おそらく現時点入手で可能な端末に使われていて OpenGL ES 3.0 対応と思われる
GPU は下記の通りです。
・Snapdragon S4 Pro APQ8064 Adreno 320
・Snapdragon 600 APQ8064T Adreno 320
・Exynos 5 Dual (5250) ARM Mali-T604
関連エントリ
・VIDIA Tegra4 の OpenGL ES 2.0 Extension
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較
・OpenGL ES 3.0 と Shader Model の関係、まとめ wiki の更新
・OpenGL ES 3.0 と OpenGL ES 2.0 の互換性
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
・OpenGL ES 2.0/3.0 Emulator
・OpenGL 4.3 と GL_ARB_ES3_compatibility
OpenGL ES 3.0 は OpenGL 3.x 世代に対応する API セットで、
DirectX では Direct3D 10 に相当します。
GeometryShader はないものの、ES 2.0 世代ではオプションだった多くの
項目が標準となり、PC 向け GPU と比べて機能差が無くなりつつあります。
また D3D10 (ShaderModel 4) 世代の大きな特徴として、データフォーマットの
拡大や GPU リソースの汎用化があげられます。
OpenGL ES 3.0 の登場は、描画以外の GPU 活用につながる
第一歩といえるかもしれません。
実際に Nexus 10 (Android 4.3) で試してみました。
GL_VERSION: OpenGL ES 3.0
GL_RENDERER: Mali-T604
GL_VENDOR: ARM
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
API=300 Shader=300 (VConst=256 PConst=1024)
pconst=1024 vconst=256 vin=16 vout=15 ptex=16 vtex=16 combotex=32 maxrender=4096 maxtexsize=4096 cubetexsize=4096 viewdims=4096
Extension:
GL_EXT_debug_marker
GL_ARM_rgba8
GL_ARM_mali_shader_binary
GL_OES_depth24
GL_OES_depth_texture
GL_OES_depth_texture_cube_map
GL_OES_packed_depth_stencil
GL_OES_rgb8_rgba8
GL_EXT_read_format_bgra
GL_OES_compressed_paletted_texture
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_standard_derivatives
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_required_internalformat
GL_OES_vertex_array_object
GL_OES_mapbuffer
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg
GL_EXT_texture_type_2_10_10_10_REV
GL_OES_fbo_render_mipmap
GL_OES_element_index_uint
GL_EXT_shadow_samplers
GL_KHR_debug
GL_EXT_occlusion_query_boolean
GL_EXT_blend_minmax
GL_EXT_discard_framebuffer
GL_OES_get_program_binary
GL_OES_texture_3D
GL_EXT_texture_storage
GL_EXT_multisampled_render_to_texture
GL_OES_surfaceless_context
GL_ARM_mali_program_binary
Precision:
0: [15 15] 10
1: [15 15] 10
2: [127 127] 23
3: [15 14] 0
4: [15 14] 0
5: [31 30] 0
6: [15 15] 10
7: [15 15] 10
8: [127 127] 23
9: [15 14] 0
10: [15 14] 0
11: [31 30] 0
TextureFormat
00=8b90 GL_PALETTE4_RGB8_OES
01=8b91 GL_PALETTE4_RGBA8_OES
02=8b92 GL_PALETTE4_R5_G6_B5_OES
03=8b93 GL_PALETTE4_RGBA4_OES
04=8b94 GL_PALETTE4_RGB5_A1_OES
05=8b95 GL_PALETTE8_RGB8_OES
06=8b96 GL_PALETTE8_RGBA8_OES
07=8b97 GL_PALETTE8_R5_G6_B5_OES
08=8b98 GL_PALETTE8_RGBA4_OES
09=8b99 GL_PALETTE8_RGB5_A1_OES
10=8d64 GL_ETC1_RGB8_OES
11=9274 GL_COMPRESSED_RGB8_ETC2
12=9275 GL_COMPRESSED_SRGB8_ETC2
13=9278 GL_COMPRESSED_RGBA8_ETC2_EAC
14=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
15=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
16=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
17=9270 GL_COMPRESSED_R11_EAC
18=9272 GL_COMPRESSED_RG11_EAC
19=9271 GL_COMPRESSED_SIGNED_R11_EAC
20=9273 GL_COMPRESSED_SIGNED_RG11_EAC
新しい Texture format ETC2/EAC が使えるようになっています。
ASTC はありませんでした。
core 機能が大幅に増えているため Extension 自体は控えめです。
下記ページで ES 2.0 と比べることができます。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Android NDK が更新されていないので今のところ Java API のみとなっているようです。
OpenGL ES 3.0 は OpenGL ES 2.0 と互換性があるので 3.0 の context 上でも
ES 2.0 の NDK アプリケーションがそのまま動作しました。
API に互換性はあるものの、GLSL ES 1.0 と GLSL ES 3.0 では shader の書式が
異なっています。
OpenGL ES 2.0 (GLSL ES 1.0) 用であることを明確に宣言するには shader の
先頭に "#version 100" を追加しておきます。
同様に Nexus 7 にも Android 4.3 を入れてみましたが、
Tegra3 なのでやはり OpenGL ES 3.0 は動きませんでした。
おそらく現時点入手で可能な端末に使われていて OpenGL ES 3.0 対応と思われる
GPU は下記の通りです。
・Snapdragon S4 Pro APQ8064 Adreno 320
・Snapdragon 600 APQ8064T Adreno 320
・Exynos 5 Dual (5250) ARM Mali-T604
関連エントリ
・VIDIA Tegra4 の OpenGL ES 2.0 Extension
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較
・OpenGL ES 3.0 と Shader Model の関係、まとめ wiki の更新
・OpenGL ES 3.0 と OpenGL ES 2.0 の互換性
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
・OpenGL ES 2.0/3.0 Emulator
・OpenGL 4.3 と GL_ARB_ES3_compatibility
Tegra K1 を搭載した SHILED Tablet が発売されました。
SHIELD Tablet の CPU Core は Tegra 4 同様 32bit Cortex-A15 Quad ですが、
GPU の本気度がこれまでと違います。
ブランドイメージに反して GPU が非力だった Tegra シリーズも、
K1 でようやく NVIDIA らしいスペックになったと言えるでしょう。
・NVIDIA SHIELD
OpenGL ES 3.1 に対応しており、OpenGL 4.x 相当の AEP
「 GL_ANDROID_extension_pack_es31a 」が付いています。
Tegra 2/3 の ULP GeForce は Direct3D 9 世代の GPU から
GLES 2.0 仕様ぎりぎりまで機能を削減したものでした。
Tegra 4 の ULP GeForce は同じ Direct3D 9 世代の GPU core のまま
本来のあるべき機能を復活させたもの。
Tegra K1 は Direct3D 11 世代の GPU core を搭載しています。
Shader Core 数が少ないだけで、対応 API など機能的には desktop GPU との差が
なくなっています。
CPU の VFP Benchmark の結果はこちら。
下記ページにも追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
・VFP Benchmark Log
SHIELD Tablet の CPU Core は Tegra 4 同様 32bit Cortex-A15 Quad ですが、
GPU の本気度がこれまでと違います。
ブランドイメージに反して GPU が非力だった Tegra シリーズも、
K1 でようやく NVIDIA らしいスペックになったと言えるでしょう。
・NVIDIA SHIELD
GL_VENDOR: NVIDIA Corporation GL_RENDERER: NVIDIA Tegra GL_VERSION: OpenGL ES 3.1 340.00 Extension: GL_EXT_debug_marker GL_EXT_blend_minmax GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_EXT_copy_image GL_EXT_debug_label GL_EXT_draw_buffers_indexed GL_EXT_frag_depth GL_EXT_geometry_point_size GL_EXT_geometry_shader GL_EXT_gpu_shader5 GL_EXT_map_buffer_range GL_EXT_occlusion_query_boolean GL_EXT_primitive_bounding_box GL_EXT_robustness GL_EXT_separate_shader_objects GL_EXT_shader_implicit_conversions GL_EXT_shader_integer_mix GL_EXT_shader_io_blocks GL_EXT_shadow_samplers GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_tessellation_point_size GL_EXT_tessellation_shader GL_EXT_texture_border_clamp GL_EXT_texture_buffer GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map_array GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_texture_view GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_texture_compression_astc_ldr GL_NV_bgr GL_NV_bindless_texture GL_NV_blend_equation_advanced GL_NV_blend_equation_advanced_coherent GL_NV_copy_buffer GL_NV_copy_image GL_NV_draw_buffers GL_NV_draw_instanced GL_NV_draw_texture GL_NV_EGL_stream_consumer_external GL_NV_explicit_attrib_location GL_NV_fbo_color_attachments GL_NV_framebuffer_blit GL_NV_framebuffer_multisample GL_NV_generate_mipmap_sRGB GL_NV_instanced_arrays GL_NV_occlusion_query_samples GL_NV_non_square_matrices GL_NV_pack_subimage GL_NV_packed_float GL_NV_packed_float_linear GL_NV_pixel_buffer_object GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_NV_secure_context GL_NV_shadow_samplers_array GL_NV_shadow_samplers_cube GL_NV_sRGB_formats GL_NV_texture_array GL_NV_texture_border_clamp GL_NV_texture_compression_latc GL_NV_texture_compression_s3tc GL_NV_texture_compression_s3tc_update GL_NV_timer_query GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_sample_shading GL_OES_sample_variables GL_OES_shader_image_atomic GL_OES_shader_multisample_interpolation GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_npot GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_stencil8 GL_OES_texture_storage_multisample_2d_array GL_OES_vertex_array_object GL_OES_vertex_half_float GL_ANDROID_extension_pack_es31a
OpenGL ES 3.1 に対応しており、OpenGL 4.x 相当の AEP
「 GL_ANDROID_extension_pack_es31a 」が付いています。
Tegra 2 Cortex-A9 x2 ULP GeForce(8) OpenGL ES 2.0 Tegra 3 Cortex-A9 x4 ULP GeForce(12) OpenGL ES 2.0 Tegra 4 Cortex-A15 x4 ULP GeForce(72) OpenGL ES 2.0 Tegra K1 Cortex-A15 x4 GeForce Kepler(192) OpenGL ES 3.1 AEP/OpenGL 4.4
Tegra 2/3 の ULP GeForce は Direct3D 9 世代の GPU から
GLES 2.0 仕様ぎりぎりまで機能を削減したものでした。
Tegra 4 の ULP GeForce は同じ Direct3D 9 世代の GPU core のまま
本来のあるべき機能を復活させたもの。
Tegra K1 は Direct3D 11 世代の GPU core を搭載しています。
Shader Core 数が少ないだけで、対応 API など機能的には desktop GPU との差が
なくなっています。
CPU の VFP Benchmark の結果はこちら。
SingleT SP max: 17.136 GFLOPS SingleT DP max: 3.431 GFLOPS MultiT SP max: 70.174 GFLOPS MultiT DP max: 14.036 GFLOPS
下記ページにも追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
・VFP Benchmark Log
2015/06/24
Android 5.x OpenGL ES 3.1 と対応 GPU
Android 5.0 から OpenGL ES 3.1 に対応しています。
GPU の対応状況を調べてみました。
今のところ判明している(直接調べた) GPU は下記の通りです。
OpenGL ES 3.0 がサポートされたのは Android 4.3 からです。
上記の結果を見ると、OpenGL ES 3.0 対応 GPU の大半がそのまま
OpenGL ES 3.1 にも対応できていることがわかります。
上記の表にはありませんが、Z37 系の Intel HD Graphcs (Gen7) も
Windows の最新ドライバで OpenGL ES 3.1 に対応しました。(詳細はこちら)
よって今のところ例外は Adreno 300 系だけとなっています。
Adreno 300 (305/306/320/330等) は OpenGL ES 3.0 専用と考えて良さそうです。
もう一つの特殊な例外は iOS です。
サポートしている OpenGL API は ES 3.0 までですが、
Low Level API の Metal を使うことで OpenGL ES 3.1 相当の機能を用いることができます。
OpenGL ES 3.1 対応状況については下記にまとめています。
・OpenGL ES 3.1 対応端末
GPU ごとの詳細はこちら
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Galaxy S6 Mali-T760 は AEP 非搭載ながら ASTC HDR 対応
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
GPU の対応状況を調べてみました。
今のところ判明している(直接調べた) GPU は下記の通りです。
GPU OpenGL API SoC ---------------------------------------------------- Tegra K1 OpenGL ES 3.1 AEP Adreno 420 OpenGL ES 3.1 AEP Snapdragon 805 Adreno 430 OpenGL ES 3.1 AEP Snapdragon 810 Mali-T604 OpenGL ES 3.1 Exynos 5 Mali-T760 OpenGL ES 3.1 Exynos 7 PowerVR G6200 OpenGL ES 3.1 MT8135 PowerVR G6430 OpenGL ES 3.1 Atom Z3580
OpenGL ES 3.0 がサポートされたのは Android 4.3 からです。
上記の結果を見ると、OpenGL ES 3.0 対応 GPU の大半がそのまま
OpenGL ES 3.1 にも対応できていることがわかります。
上記の表にはありませんが、Z37 系の Intel HD Graphcs (Gen7) も
Windows の最新ドライバで OpenGL ES 3.1 に対応しました。(詳細はこちら)
よって今のところ例外は Adreno 300 系だけとなっています。
Adreno 300 (305/306/320/330等) は OpenGL ES 3.0 専用と考えて良さそうです。
もう一つの特殊な例外は iOS です。
サポートしている OpenGL API は ES 3.0 までですが、
Low Level API の Metal を使うことで OpenGL ES 3.1 相当の機能を用いることができます。
GPU API SoC -------------------------------------------------- PowerVR G6430 OpenGL ES 3.0 / Metal A7 PowerVR GX6450 OpenGL ES 3.0 / Metal A8 PowerVR GX6850 OpenGL ES 3.0 / Metal A8X
OpenGL ES 3.1 対応状況については下記にまとめています。
・OpenGL ES 3.1 対応端末
GPU ごとの詳細はこちら
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Galaxy S6 Mali-T760 は AEP 非搭載ながら ASTC HDR 対応
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
以前のテストで Chrome の場合だけ極端に遅かった原因が判明しました。
Chrome の WebGL getError() 呼び出しが非常に重かったためです。
getError() 無しのビルドでは 60fps を超える速度となっています。
JavaScript が遅いわけではありませんでした。
Windows 8.1 Chrome 35 (60fps)

InternetExplorer でも動くようになったので比較してみます。
いずれも fps 値が大きい方が高速です。
fps に幅があるものは、前回のテストに従い描画負荷を変更しているため。
「34-60fps」なら一番重い 1. で 34fps 前後、一番軽い 3. で 60fps 以上
出ていることを意味しています。
以下別の PC のテスト
↓ Chrome 向け 修正の例: Emscripten から出力された *.js の _glGetError() 内にある
return GLctx.getError() を return 0 に変更。
Chrome 以外では glGetError() (WebGL の getError()) があってもなくても
速度には影響がないようです。
IE/Safari 共にかなり高速に動作しています。
これまで IE で動かなかった原因は、オプティマイザが
小さい描画の Index を BYTE Size に変換してしまっていたためでした。
また IE は WebGL Extension の対応度があまり高くないようです。
DXT, float texture はすべてのブラウザが対応していますが、
depth_texture, element_index_uint 未対応は IE だけとなっています。
上の Chrome のキャプチャ画面では depth_texture が用いられています。
↓ IE は depth_texture がないので、Tegra2/3 と同じく ShadowMap に
Color Buffer を使用しています。
Windows 8.1 Internet Explorer 11

HOST GPU によって多少違いがあります。
OS 毎、GPU 毎のより詳しいデータは下記に載せました。
・WebGL Extensions
次回: Emscripten C++/OpenGL ES 2.0 (7) Emscripten の OpenGL API と WebGL
関連エントリ
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (5)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (4)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (3)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (2)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (1)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす 一覧
Chrome の WebGL getError() 呼び出しが非常に重かったためです。
getError() 無しのビルドでは 60fps を超える速度となっています。
JavaScript が遅いわけではありませんでした。
Windows 8.1 Chrome 35 (60fps)

InternetExplorer でも動くようになったので比較してみます。
Core i7-3615QM / Intel HD Graphics 4000 ---------------------------------------------------------- Windows 8.1 Firefox 29 60fps 以上 Windows 8.1 Chrome 35 60fps 以上 (glGetError無し) Windows 8.1 IE 11 34-60fps
いずれも fps 値が大きい方が高速です。
fps に幅があるものは、前回のテストに従い描画負荷を変更しているため。
「34-60fps」なら一番重い 1. で 34fps 前後、一番軽い 3. で 60fps 以上
出ていることを意味しています。
以下別の PC のテスト
Core i7-2720QM / RADEON HD 6750M ---------------------------------------------------------- Mac OSX 10.9 Firefox 29 60fps 以上 Mac OSX 10.9 Chrome 35 60fps 以上 (glGetError無し) Mac OSX 10.9 Safari 7 60fps 以上 Windows 8.1 Firefox 29 60fps 以上 Windows 8.1 Chrome 35 60fps 以上 (glGetError無し) Windows 8.1 IE 11 60fps 以上
AMD Athlon 5350 / GeForce GTX 650 ---------------------------------------------------------- Windows 7 Firefox 29 60fps 以上 Windows 7 Chrome 35 60fps 以上 (glGetError無し) Windows 7 IE 11 50-60fps
Tegra 4 Cortex-A15 / ULP GeForce 72 (Tegra Note 7) ---------------------------------------------------------- Android 4.4 Firefox 29 60fps 以上 Android 4.4 Chrome 35 60fps 以上 (glGetError無し)
↓ Chrome 向け 修正の例: Emscripten から出力された *.js の _glGetError() 内にある
return GLctx.getError() を return 0 に変更。
function _glGetError() {
// First return any GL error generated by the emscripten library_gl.js interop layer.
if (GL.lastError) {
var error = GL.lastError;
GL.lastError = 0/*GL_NO_ERROR*/;
return error;
} else { // If there were none, return the GL error from the browser GL context.
//return GLctx.getError(); // ← 削除
return 0;
}
}
// First return any GL error generated by the emscripten library_gl.js interop layer.
if (GL.lastError) {
var error = GL.lastError;
GL.lastError = 0/*GL_NO_ERROR*/;
return error;
} else { // If there were none, return the GL error from the browser GL context.
//return GLctx.getError(); // ← 削除
return 0;
}
}
Chrome 以外では glGetError() (WebGL の getError()) があってもなくても
速度には影響がないようです。
IE/Safari 共にかなり高速に動作しています。
これまで IE で動かなかった原因は、オプティマイザが
小さい描画の Index を BYTE Size に変換してしまっていたためでした。
また IE は WebGL Extension の対応度があまり高くないようです。
DXT, float texture はすべてのブラウザが対応していますが、
depth_texture, element_index_uint 未対応は IE だけとなっています。
上の Chrome のキャプチャ画面では depth_texture が用いられています。
↓ IE は depth_texture がないので、Tegra2/3 と同じく ShadowMap に
Color Buffer を使用しています。
Windows 8.1 Internet Explorer 11

// IE11
GL_VERSION: WebGL 0.93
GL_RENDERER: Internet Explorer
GL_VENDOR: Microsoft
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00 (WebGL)
Extension:
GL_WEBGL_compressed_texture_s3tc
GL_OES_texture_float
GL_OES_texture_float_linear
GL_EXT_texture_filter_anisotropic
GL_OES_standard_derivatives
// Firefox 29
GL_VERSION: WebGL 1.0
GL_RENDERER: Mozilla
GL_VENDOR: Mozilla
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00 (WebGL)
Extension:
GL_EXT_texture_filter_anisotropic
GL_OES_element_index_uint
GL_OES_standard_derivatives
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float
GL_WEBGL_compressed_texture_s3tc
GL_WEBGL_depth_texture
GL_WEBGL_lose_context
GL_MOZ_WEBGL_lose_context
GL_MOZ_WEBGL_compressed_texture_s3tc
GL_MOZ_WEBGL_depth_texture
// Chrome
GL_VERSION: WebGL 1.0 (OpenGL ES 2.0 Chromium)
GL_RENDERER: WebKit WebGL
GL_VENDOR: WebKit
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00 (WebGL)
Extension:
GL_ANGLE_instanced_arrays
GL_EXT_texture_filter_anisotropic
GL_WEBKIT_EXT_texture_filter_anisotropic
GL_OES_element_index_uint
GL_OES_standard_derivatives
GL_OES_texture_float
GL_OES_texture_float_linear
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_vertex_array_object
GL_WEBGL_compressed_texture_s3tc
GL_WEBKIT_WEBGL_compressed_texture_s3tc
GL_WEBGL_depth_texture
GL_WEBKIT_WEBGL_depth_texture
GL_WEBGL_lose_context
GL_WEBKIT_WEBGL_lose_context
GL_WEBGL_debug_renderer_info
// Safari 7
GL_VERSION: WebGL 1.0 (2.1 ATI-1.22.25)
GL_RENDERER: WebKit WebGL
GL_VENDOR: WebKit
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00 (WebGL)
Extension:
GL_OES_texture_float
GL_OES_standard_derivatives
GL_WEBKIT_EXT_texture_filter_anisotropic
GL_OES_vertex_array_object
GL_OES_element_index_uint
GL_WEBGL_lose_context
GL_WEBKIT_WEBGL_compressed_texture_s3tc
GL_WEBKIT_WEBGL_depth_texture
HOST GPU によって多少違いがあります。
OS 毎、GPU 毎のより詳しいデータは下記に載せました。
・WebGL Extensions
次回: Emscripten C++/OpenGL ES 2.0 (7) Emscripten の OpenGL API と WebGL
関連エントリ
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (5)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (4)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (3)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (2)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす (1)
・Emscripten C++/OpenGL ES 2.0 のアプリケーションをブラウザで動かす 一覧
2013/09/21
iOS7 と iPhone 5s の sRGB 対応とテクスチャフォーマット
iPhone 5s が発売されて OpenGL ES 3.0 対応端末が増えました。
OpenGL ES 3.0 に対応している入手可能な端末としては 3 種類目の GPU になります。
・Nexus 10 ( Android 4.3 + Mali-T604 )
・Nexus 7(2013)/Nexus 4 ( Android 4.3 + Adreno 320 )
・iPhone 5s ( iOS 7 + Apple A7 GPU )
Nexus 10 用に作成していた OpenGL ES 3.0 の描画コードも
iPhone 5s であっさりと動作しました。
やはり Adreno 320 にはまだ少々問題があるように思います。
● sRGB
OpenGL ES 3.0 を利用できるのは Apple A7 を搭載した iPhone 5s だけですが、
iOS 7.0 に更新することで従来の端末でも機能拡張が行われているようです。
その一つが前回の記事で触れている sRGB 対応です。
iPhone 5s の OpenGL ES 3.0 で sRGB を扱えるのは当然ですが、
iPad 4 や iPhone 5 など PowerVR SGX554MP/543MP でも extension で
同等の相互変換がサポートされました。(下記ページも更新)
・OpenGL ES Extension (Mobile GPU)
例えば PVRTC でも GL_EXT_pvrtc_sRGB によって sRGB からリニアへの変換が
行われるようになっています。
・GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
・GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
・GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
・GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
前回の表↓を更新しました。
iOS が対応しているフォーマットは PVRTC (v1) だけで PVRTC2 (v2) は
含まれていないようです。
またフレームバッファに対するリニアからの変換 (GL_EXT_sRGB) も
サポートしています。
iOS はもともと Renderbuffer を直接作っていたので、EGL/WGL のような
機能選択が不要です。
さらに GLK (GLKit) なら 1行変えるだけで対応できてしまい、
Android での苦労が嘘のように簡単でした。
PowerVR SGX535 (iPhone4) は未確認ですが、SGX543MP/554MP では
iOS 7.0 で Apple A7 GPU と同じように動作していることを確認しています。
●テクスチャフォーマット
iOS でも OpenGL ES 3.0 では Android 同様 ETC2/EAC が利用できるように
なっています。
Android など他の環境と互換性を保ちやすくなりました。
Android のすべての端末と iOS ES 3.0 以降は ETC1 の読み出しができます。
Android/iOS 区別なく OpenGL ES 3.0 デバイスでは、
いまのところすべて ETC2/EAC を使うことが出来ます。
関連エントリ
・OpenGL と sRGB
OpenGL ES 3.0 に対応している入手可能な端末としては 3 種類目の GPU になります。
・Nexus 10 ( Android 4.3 + Mali-T604 )
・Nexus 7(2013)/Nexus 4 ( Android 4.3 + Adreno 320 )
・iPhone 5s ( iOS 7 + Apple A7 GPU )
Nexus 10 用に作成していた OpenGL ES 3.0 の描画コードも
iPhone 5s であっさりと動作しました。
やはり Adreno 320 にはまだ少々問題があるように思います。
● sRGB
OpenGL ES 3.0 を利用できるのは Apple A7 を搭載した iPhone 5s だけですが、
iOS 7.0 に更新することで従来の端末でも機能拡張が行われているようです。
その一つが前回の記事で触れている sRGB 対応です。
iPhone 5s の OpenGL ES 3.0 で sRGB を扱えるのは当然ですが、
iPad 4 や iPhone 5 など PowerVR SGX554MP/543MP でも extension で
同等の相互変換がサポートされました。(下記ページも更新)
・OpenGL ES Extension (Mobile GPU)
例えば PVRTC でも GL_EXT_pvrtc_sRGB によって sRGB からリニアへの変換が
行われるようになっています。
・GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
・GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
・GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
・GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
前回の表↓を更新しました。
OpenGL ES 3.0 での sRGB 対応 ----------------------------------------- ETC1 あり(ETC2) ETC2 あり PVRTC (v1) あり (PowerVR のみ) PVRTC2 (v2) あり (PowerVR のみ) ATITC 無し (Adreno のみ) ASTC あり S3TC(DXT1) あり
iOS が対応しているフォーマットは PVRTC (v1) だけで PVRTC2 (v2) は
含まれていないようです。
またフレームバッファに対するリニアからの変換 (GL_EXT_sRGB) も
サポートしています。
iOS はもともと Renderbuffer を直接作っていたので、EGL/WGL のような
機能選択が不要です。
さらに GLK (GLKit) なら 1行変えるだけで対応できてしまい、
Android での苦労が嘘のように簡単でした。
PowerVR SGX535 (iPhone4) は未確認ですが、SGX543MP/554MP では
iOS 7.0 で Apple A7 GPU と同じように動作していることを確認しています。
●テクスチャフォーマット
iOS でも OpenGL ES 3.0 では Android 同様 ETC2/EAC が利用できるように
なっています。
Android など他の環境と互換性を保ちやすくなりました。
ETC1 ETC2/EAC DXT(S3TC) PVRTC(v1) ATITC ---------------------------------------------------------------------- iOS PowerVR ES 2.0 -- -- -- ◎ -- iOS PowerVR? ES 3.0 ◎ ◎ -- ◎ -- Android PowerVR ES 2.0 ◎ -- -- ◎ -- Android Tegra2/3/4 ES 2.0 ◎ -- ◎ -- -- Android Adreno200 ES 2.0 ◎ -- -- -- ◎ Android Adreno300 ES 3.0 ◎ ◎ -- -- ◎ Android Mali400 ES 2.0 ◎ -- -- -- -- Android Mali600 ES 3.0 ◎ ◎ -- -- --
Android のすべての端末と iOS ES 3.0 以降は ETC1 の読み出しができます。
Android/iOS 区別なく OpenGL ES 3.0 デバイスでは、
いまのところすべて ETC2/EAC を使うことが出来ます。
関連エントリ
・OpenGL と sRGB
OpenGL ES 3.2 が登場しました。OpenGL ES 3.1 AEP (Android Extension Pack) の機能が取り込まれています。これまで ES にはなかった GeometryShader や Tessellator などに対応しており、機能面では OpenGL 4.x/Direct3D 11 と完全に並ぶことになります。
おそらく AEP 対応 GPU がそのまま OpenGL ES 3.2 になるのではないかと思われます。
現在発売されている端末で AEP (GL_ANDROID_extension_pack_es31a) が含まれている GPU は下記の通り。
Intel HD Graphics Gen8 も対応しているので、Cherry Trail 搭載 Android 端末が出ればこの一覧に入ることになるでしょう。
シェーダーのバージョンも 3.2 (320 es) です。Version 番号の空きを使い尽くしたので、もし次があるなら番号が飛ぶことになるかもしれません。(GLSL Version 一覧)
NVIDIA の Beta Driver がすでに使えるようになっているので試してみました。
GL_ARB_ES3_2_compatibility で実際に Context を作ることができます。
↓詳細はこちら
・Desktop GPU Extensions
OpenGL ES 3.2 は ASTC 対応ですが、やはり OpenGL 4.5 context のまま Texture を読むとパフォーマンスの警告が出るようです。
また OpenGL 4.5 の方にはかなり気になる Extension が増えています。スレッドを使ったシェーダーのコンパイルが可能になるとのこと。
なお Android もついに低レベル API である Vulkan 対応を発表しています。予想されてきたことではありますが、低レベル API はプラットフォームごとに完全に分かれることになりました。
パフォーマンスだけでなく Mobile / Desktop API の統合や、レガシーな OpenGL API からの脱却などさまざまなメリットもありますが、開発者にとっては悩ましいところです。
関連エントリ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・3D 低レベル API の現状 Direct3D 12/Metal
おそらく AEP 対応 GPU がそのまま OpenGL ES 3.2 になるのではないかと思われます。
現在発売されている端末で AEP (GL_ANDROID_extension_pack_es31a) が含まれている GPU は下記の通り。
Tegra K1 Keper (192) SHIELD Tablet / Nexus 9 Tegra X1 Maxwell (256) SHIELD Adreno 4xx Snapdragon 805/808/810 等
Intel HD Graphics Gen8 も対応しているので、Cherry Trail 搭載 Android 端末が出ればこの一覧に入ることになるでしょう。
シェーダーのバージョンも 3.2 (320 es) です。Version 番号の空きを使い尽くしたので、もし次があるなら番号が飛ぶことになるかもしれません。(GLSL Version 一覧)
NVIDIA の Beta Driver がすでに使えるようになっているので試してみました。
GL_ARB_ES3_2_compatibility で実際に Context を作ることができます。
GL_VERSION: OpenGL ES 3.2 NVIDIA 355.58 GL_RENDERER: GeForce GTX 760/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.20
↓詳細はこちら
・Desktop GPU Extensions
OpenGL ES 3.2 は ASTC 対応ですが、やはり OpenGL 4.5 context のまま Texture を読むとパフォーマンスの警告が出るようです。
また OpenGL 4.5 の方にはかなり気になる Extension が増えています。スレッドを使ったシェーダーのコンパイルが可能になるとのこと。
GL_ARB_parallel_shader_compile
なお Android もついに低レベル API である Vulkan 対応を発表しています。予想されてきたことではありますが、低レベル API はプラットフォームごとに完全に分かれることになりました。
API Platform ------------------------------------------ Direct3D 12 Windows Desktop / Mobile Metal iOS / Mac OS X Vulkan Android
パフォーマンスだけでなく Mobile / Desktop API の統合や、レガシーな OpenGL API からの脱却などさまざまなメリットもありますが、開発者にとっては悩ましいところです。
関連エントリ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
・3D 低レベル API の現状 Direct3D 12/Metal
2007/12/14
バランスWiiボードの解析メモ 2
やはり拡張ポート経由扱いで接続されていました。
アクセス方法は Nunchuk や Classic Controller と同じです。
他の拡張ポート経由のデバイス同様、16 でレジスタに書き込んで初期化を
行えば拡張デバイスの更新情報を取得できます。
例えばレポート番号 0x34 を使った場合下記の形式でデータが取れます。
(AA AA~は BigEndian)
EE にも何らかの値が入っているように見えますが用途は不明です。
センサーは4つ。
バランスボード本体の4本の足の位置に入っているようです。
裏返して足部分だけ押してみると、上の AA~DD の値が個別に
反応する様子がわかります。
センサーの種類は、値の範囲から見て2種類。
(L) が 18000~ 程度
(S) が 2700~ あたり
この2つはそれぞれ精度の担当範囲が異なっているのかもしれません。
対角に配置して精度を補いつつ、向きもわかる構造になっていると
考えられます。
2007/12/17追記: 単なるセンサーのばらつきでした
またこの値は Nunchuk/Classic のような 0x17 デコードが不要です。
実際に 0x04a40000 ~ 0x04a400ff をダンプしてみても、そのまま
素の値が取れているように見えます。
例えば 0x04a400fc は最初から 0xa4 です。
識別に使うと思われる 0x04a400f0~ のライン
その他わかったこと
・電源ボタンは Wii Remote の (A) ボタン相当
・電源ランプは LED1
・Nintendo RVL-WBC-01
●バランスWiiボード の判別アルゴリズム
(1) 0x20 レポートを読み出し、拡張ポートが使われているかチェック
(2) 拡張ポートが使われていなければ Wii コントローラのみ
(3) 拡張ポートへ接続があれば 0x04a400fc を読み出し 0xa4 かチェック
(4) 0xa4 なら 0x17 デコードをしない。0xa4 でなければ 0x17 変換を行う
(5) 0x04a400fe~ff を読み出し判別する。
0x00 0x00 Wiimote+ヌンチャク
0x01 0x01 Wiimote+クラシックコントローラ
0x04 0x02 バランスWiiボード
キャリブレーション等その他の情報は不明。
追記: 解析済みです。解析メモ 3以降を参照してください。
これは blog の1エントリに過ぎないので、他の後日のエントリも参照してください。
参考ページ
・WiiLi.org Wiimote
・WiiLi.org Wiimote/Extension Nunchuk
・WiiLi.org Wiimote/Extension Classic Controller
・WiiBrewWiki Wiimote
リンク
・WiiFit 、バランスWiiボード
関連ページ
・バランスWiiボードの解析メモ 3 / 4
・バランスWiiボードの解析メモ 5
・wiibalancepc PC版体重計 Download
アクセス方法は Nunchuk や Classic Controller と同じです。
他の拡張ポート経由のデバイス同様、16 でレジスタに書き込んで初期化を
行えば拡張デバイスの更新情報を取得できます。
例えばレポート番号 0x34 を使った場合下記の形式でデータが取れます。
34 00 00 AA AA BB BB CC CC DD DD ?? ?? EE .. AA AA 右上 (L) BB BB左上右下 (S) CC CC右下左上 (S) DD DD 左下 (L)
(AA AA~は BigEndian)
EE にも何らかの値が入っているように見えますが用途は不明です。
センサーは4つ。
バランスボード本体の4本の足の位置に入っているようです。
+----------------+ | BB(S) AA(L) | | DD(L) CC(S) | | Power | +----------------+
裏返して足部分だけ押してみると、上の AA~DD の値が個別に
反応する様子がわかります。
(L) が 18000~ 程度
(S) が 2700~ あたり
この2つはそれぞれ精度の担当範囲が異なっているのかもしれません。
対角に配置して精度を補いつつ、向きもわかる構造になっていると
考えられます。
2007/12/17追記: 単なるセンサーのばらつきでした
またこの値は Nunchuk/Classic のような 0x17 デコードが不要です。
実際に 0x04a40000 ~ 0x04a400ff をダンプしてみても、そのまま
素の値が取れているように見えます。
例えば 0x04a400fc は最初から 0xa4 です。
識別に使うと思われる 0x04a400f0~ のライン
04a400f0 : ff ff 00 00 ff ff 00 00 00 00 00 00 a4 20 04 02
その他わかったこと
・電源ボタンは Wii Remote の (A) ボタン相当
・電源ランプは LED1
・Nintendo RVL-WBC-01
●バランスWiiボード の判別アルゴリズム
(1) 0x20 レポートを読み出し、拡張ポートが使われているかチェック
(2) 拡張ポートが使われていなければ Wii コントローラのみ
(3) 拡張ポートへ接続があれば 0x04a400fc を読み出し 0xa4 かチェック
(4) 0xa4 なら 0x17 デコードをしない。0xa4 でなければ 0x17 変換を行う
(5) 0x04a400fe~ff を読み出し判別する。
0x00 0x00 Wiimote+ヌンチャク
0x01 0x01 Wiimote+クラシックコントローラ
0x04 0x02 バランスWiiボード
追記: 解析済みです。解析メモ 3以降を参照してください。
これは blog の1エントリに過ぎないので、他の後日のエントリも参照してください。
参考ページ
・WiiLi.org Wiimote
・WiiLi.org Wiimote/Extension Nunchuk
・WiiLi.org Wiimote/Extension Classic Controller
・WiiBrewWiki Wiimote
リンク
・WiiFit 、バランスWiiボード
関連ページ
・バランスWiiボードの解析メモ 3 / 4
・バランスWiiボードの解析メモ 5
・wiibalancepc PC版体重計 Download
2012/12/13
Adreno 320 Snapdragon S4 Pro APQ8064
HTC J butterfly HTL21 (AQP8064) を手に入れたので、
今更ながらやっと Krait と Adreno 320 を試せるようになりました。
Krait は Qualcomm が開発した ARMv7A CPU の CPU core で
Scorpion の後継にあたります。
ARM でいえば Cortex-A15 の世代に相当し、Apple A6/A6X の CPU core も同様に
この世代に属します。
これら ARM, Qualcomm, Apple 3つの CPU は同じ ARMv7-A の命令
アーキテクチャでアプリケーションに互換性がありますが、
Intel と AMD のように設計や性能は異なります。
この中で Krait が最も先に登場しており、日本でも 5月の HTC J 以降
Snapdragon S4 MSM8960/8260A/8660A 搭載機種が増えています。
むしろ LTE では Krait でないスマートフォンの方が少ないかもしれません。
Snapdragon S4 Pro APQ8064 のもう一つ新しい点は、GPU も世代交代していることです。
GPU Adreno 320 はハードウエア的には OpenGL ES 3.0 に対応しており、
こちらも他社に先駆けて手に入る状態となりました。
実際に調べてみると、OpenGL ES 3.0 の新しい圧縮テクスチャ形式である
ETC2 / EAC に対応していることがわかります。
OpenGL ES 2.0 のままでも列挙されるので、すでに利用できる状態となっています。
ETC1 も同列に列挙されるのは OpenGL ES 2.0 API だからだと思われます。
また GPU Extension に GL_EXT_sRGB が増えています。
sRGB 対応もやはり OpenGL ES 3.0 の新機能です。
Extension の詳細は下記のページに追加しました。
・OpenGL ES Extension (Mobile GPU)
GPU 比較はこちら
・Mobile GPU の比較
いつものベンチマークはデータをとっている最中です。
使った感じは GPU が非常に速いです。
一番重いケースでも 30fps を余裕で超えており、とても Full HD (1920x1080)
でレンダリングしているとは思えません。
傾向としては Adreno 220 と同じでシェーダーの演算負荷に強く、同じ
Unified Shader ながら PowerVR のように面積が増えても極端に処理落ちしません。
演算精度によるペナルティが無いため、プログラマにとっては非常に扱いやすく
かつ演算精度が高いのでレンダリング結果も綺麗です。
ピクセルシェーダーの命令が少なく演算負荷が軽いケースでは PowerVR が
飛び抜けていますが、ピクセル(フラグメント)の演算量が多い場合はおそらく
A5X の PowerVR SGX543MP4 より速く、A6X の SGX554MP4 に近い数値が出るようです。
もちろん条件によるので万能ではありません。
CPU のデータも計測中ですが CPU core 単体では A6/A6X よりも遅いようです。
やはり A6/A6X は速いです。
その代わり core 数が A6/A6X の 2倍 (Quad core) なので、
総合的な能力では十分だと思います。
関連エントリ
・iPad 4 Apple A6X GPU PowerVR SGX554 MP4 の速度
・iPhone 5 / A6 の CPU 速度 その 3
・iPhone 5 / A6 の CPU 速度 その 2
・OpenGL / OpenGL ES ETC1 の互換性と KTX の落とし穴
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
・OpenGL 4.3 と GL_ARB_ES3_compatibility
今更ながらやっと Krait と Adreno 320 を試せるようになりました。
Krait は Qualcomm が開発した ARMv7A CPU の CPU core で
Scorpion の後継にあたります。
ARM でいえば Cortex-A15 の世代に相当し、Apple A6/A6X の CPU core も同様に
この世代に属します。
これら ARM, Qualcomm, Apple 3つの CPU は同じ ARMv7-A の命令
アーキテクチャでアプリケーションに互換性がありますが、
Intel と AMD のように設計や性能は異なります。
ARM Qualcomm Apple --------------------------------------------------------- Cortex-A8/A9 Scorpion vfpv3 ~2012 Cortex-A15 Krait Apple A6 vfpv4 2012~
この中で Krait が最も先に登場しており、日本でも 5月の HTC J 以降
Snapdragon S4 MSM8960/8260A/8660A 搭載機種が増えています。
むしろ LTE では Krait でないスマートフォンの方が少ないかもしれません。
Snapdragon S4 Pro APQ8064 のもう一つ新しい点は、GPU も世代交代していることです。
GPU Adreno 320 はハードウエア的には OpenGL ES 3.0 に対応しており、
こちらも他社に先駆けて手に入る状態となりました。
実際に調べてみると、OpenGL ES 3.0 の新しい圧縮テクスチャ形式である
ETC2 / EAC に対応していることがわかります。
TextureFormat 26 tc[00]=87f9 GL_3DC_X_AMD tc[01]=87fa GL_3DC_XY_AMD tc[02]=8c92 GL_ATC_RGB_AMD tc[03]=8c93 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD tc[04]=87ee GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD tc[05]=8d64 GL_ETC1_RGB8_OES tc[06]=8b90 GL_PALETTE4_RGB8_OES tc[07]=8b91 GL_PALETTE4_RGBA8_OES tc[08]=8b92 GL_PALETTE4_R5_G6_B5_OES tc[09]=8b93 GL_PALETTE4_RGBA4_OES tc[10]=8b94 GL_PALETTE4_RGB5_A1_OES tc[11]=8b95 GL_PALETTE8_RGB8_OES tc[12]=8b96 GL_PALETTE8_RGBA8_OES tc[13]=8b97 GL_PALETTE8_R5_G6_B5_OES tc[14]=8b98 GL_PALETTE8_RGBA4_OES tc[15]=8b99 GL_PALETTE8_RGB5_A1_OES tc[16]=9270 GL_COMPRESSED_R11_EAC tc[17]=9271 GL_COMPRESSED_SIGNED_R11_EAC tc[18]=9272 GL_COMPRESSED_RG11_EAC tc[19]=9273 GL_COMPRESSED_SIGNED_RG11_EAC tc[20]=9274 GL_COMPRESSED_RGB8_ETC2 tc[21]=9275 GL_COMPRESSED_SRGB8_ETC2 tc[22]=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[23]=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[24]=9278 GL_COMPRESSED_RGBA8_ETC2_EAC tc[25]=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
OpenGL ES 2.0 のままでも列挙されるので、すでに利用できる状態となっています。
ETC1 も同列に列挙されるのは OpenGL ES 2.0 API だからだと思われます。
また GPU Extension に GL_EXT_sRGB が増えています。
sRGB 対応もやはり OpenGL ES 3.0 の新機能です。
Extension の詳細は下記のページに追加しました。
・OpenGL ES Extension (Mobile GPU)
GPU 比較はこちら
・Mobile GPU の比較
いつものベンチマークはデータをとっている最中です。
使った感じは GPU が非常に速いです。
一番重いケースでも 30fps を余裕で超えており、とても Full HD (1920x1080)
でレンダリングしているとは思えません。
傾向としては Adreno 220 と同じでシェーダーの演算負荷に強く、同じ
Unified Shader ながら PowerVR のように面積が増えても極端に処理落ちしません。
演算精度によるペナルティが無いため、プログラマにとっては非常に扱いやすく
かつ演算精度が高いのでレンダリング結果も綺麗です。
ピクセルシェーダーの命令が少なく演算負荷が軽いケースでは PowerVR が
飛び抜けていますが、ピクセル(フラグメント)の演算量が多い場合はおそらく
A5X の PowerVR SGX543MP4 より速く、A6X の SGX554MP4 に近い数値が出るようです。
もちろん条件によるので万能ではありません。
CPU のデータも計測中ですが CPU core 単体では A6/A6X よりも遅いようです。
やはり A6/A6X は速いです。
その代わり core 数が A6/A6X の 2倍 (Quad core) なので、
総合的な能力では十分だと思います。
関連エントリ
・iPad 4 Apple A6X GPU PowerVR SGX554 MP4 の速度
・iPhone 5 / A6 の CPU 速度 その 3
・iPhone 5 / A6 の CPU 速度 その 2
・OpenGL / OpenGL ES ETC1 の互換性と KTX の落とし穴
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
・OpenGL 4.3 と GL_ARB_ES3_compatibility
Amazon Fire TV (2015) と Fire TV Stick (2015) が発売されました。
Fire TV は MT8173C を搭載しており Fire (Kindle) 初の 64bit 機となっています。CPU core は Cortex-A72 で ARM のハイエンド系 64bit Core の 2世代目です。ただし 2+2 の big.LITTLE なのでハイパフォーマンス Core の担当は実質 Dual core になります。
GPU も PowerVR GX6250 と、Fire HD 6/7 に使われている Rogue G6200 (Series6) よりも一つ新しい Series6XT になりました。Apple でいえば A8/A8X と同じ世代ですが、Shader core 数は A8/A8X の 1/2~1/4 と少なくなっています。
どちらも世代は新しいものの Core の数は決して多くなく、コストとのバランスを保っている印象です。
Fire TV (2015) で気になっていたのは Developer サイトの公式の Spec 表で OpenGL ES 3.1 AEP に対応しているかのように書かれていたことです。AEP に対応しているのは Series7 以降のはずなので、実機で確認してみました。
下記の通り AEP には非対応でした。
より詳細なデータは下記に掲載しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Fire TV Stick (2015) はスティック状のストリームプレイヤーで Chromecast に似ています。ただし Chromecast と違い普通に Fire OS (Android) が動作しており Native なアプリがローカルで走ります。
ハードウエアの仕様自体は最初に発表された Fire TV Stick 2014 から特に変わっていないようです。Developer サイトの Spec 表でも 2014 モデル時のまま Fire OS 3.0 (API Level 17) と記載されています。
ところが実際に実機を調べたところ、低スペックながら Fire TV 同様 Fire OS 5.0 が動作しており API Level 22 (Android 5.1 相当) であることがわかりました。
GPU は Raspberry Pi と同じ VideoCore IV です。
こちらも詳細は下記のページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Android 5.0 Nexus Player x86 と対応 ABI
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・Amazon Fire TV の性能
Fire TV は MT8173C を搭載しており Fire (Kindle) 初の 64bit 機となっています。CPU core は Cortex-A72 で ARM のハイエンド系 64bit Core の 2世代目です。ただし 2+2 の big.LITTLE なのでハイパフォーマンス Core の担当は実質 Dual core になります。
GPU も PowerVR GX6250 と、Fire HD 6/7 に使われている Rogue G6200 (Series6) よりも一つ新しい Series6XT になりました。Apple でいえば A8/A8X と同じ世代ですが、Shader core 数は A8/A8X の 1/2~1/4 と少なくなっています。
どちらも世代は新しいものの Core の数は決して多くなく、コストとのバランスを保っている印象です。
Device | SoC | RAM | CPU | 64 | GPU | API | |
---|---|---|---|---|---|---|---|
Fire TV 2014 | APQ8064T | 2GB | Krait 300 | 4 | N | Adreno 320 | ES3.0 |
Fire TV 2015 | MT8173C | 2GB | Cortex-A72/A53 | 2+2 | Y | PowerVR GX6250 | ES3.1 |
Fire TV Stick | Broadcom 28155 | 1GB | Cortex-A9 | 2 | N | VideoCore IV | ES2.0 |
Apple TV | Apple A8 | 2GB | Cyclone | 2 | Y | PowerVR GX6450 | Metal |
Nexus Player | Atom Z3560 | 1GB | Silvermont | 4 | N | PowerVR G6430 | ES3.1 |
Fire TV (2015) で気になっていたのは Developer サイトの公式の Spec 表で OpenGL ES 3.1 AEP に対応しているかのように書かれていたことです。AEP に対応しているのは Series7 以降のはずなので、実機で確認してみました。
下記の通り AEP には非対応でした。
// Amazon Fire TV 2015
GL_VERSION: OpenGL ES 3.1 build 1.4@3443629
GL_RENDERER: PowerVR Rogue GX6250
GL_VENDOR: Imagination Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10 build 1.4@3443629
Extension:
GL_EXT_blend_minmax
GL_EXT_color_buffer_float
GL_EXT_discard_framebuffer
GL_EXT_draw_buffers
GL_EXT_multi_draw_arrays
GL_EXT_multisampled_render_to_texture
GL_EXT_occlusion_query_boolean
GL_EXT_read_format_bgra
GL_EXT_robustness
GL_EXT_separate_shader_objects
GL_EXT_shader_framebuffer_fetch
GL_EXT_shader_texture_lod
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_rg
GL_EXT_texture_sRGB_decode
GL_IMG_multisampled_render_to_texture
GL_IMG_program_binary
GL_IMG_read_format
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_compression_pvrtc2
GL_IMG_texture_format_BGRA8888
GL_IMG_texture_npot
GL_KHR_blend_equation_advanced
GL_KHR_blend_equation_advanced_coherent
GL_KHR_debug
GL_KHR_texture_compression_astc_ldr
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth24
GL_OES_depth_texture
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_element_index_uint
GL_OES_fragment_precision_high
GL_OES_get_program_binary
GL_OES_mapbuffer
GL_OES_packed_depth_stencil
GL_OES_required_internalformat
GL_OES_rgb8_rgba8
GL_OES_shader_image_atomic
GL_OES_standard_derivatives
GL_OES_surfaceless_context
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_npot
GL_OES_texture_stencil8
GL_OES_texture_storage_multisample_2d_array
GL_OES_vertex_array_object
GL_OES_vertex_half_float
より詳細なデータは下記に掲載しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Fire TV Stick (2015) はスティック状のストリームプレイヤーで Chromecast に似ています。ただし Chromecast と違い普通に Fire OS (Android) が動作しており Native なアプリがローカルで走ります。
ハードウエアの仕様自体は最初に発表された Fire TV Stick 2014 から特に変わっていないようです。Developer サイトの Spec 表でも 2014 モデル時のまま Fire OS 3.0 (API Level 17) と記載されています。
ところが実際に実機を調べたところ、低スペックながら Fire TV 同様 Fire OS 5.0 が動作しており API Level 22 (Android 5.1 相当) であることがわかりました。
GL_VERSION: OpenGL ES 2.0
GL_RENDERER: VideoCore IV HW
GL_VENDOR: Broadcom
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00
Extension:
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_compressed_paletted_texture
GL_OES_texture_npot
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_EXT_discard_framebuffer
GL_OES_rgb8_rgba8
GL_OES_depth32
GL_OES_packed_depth_stencil
GL_EXT_texture_format_BGRA8888
GL_EXT_debug_marker
GPU は Raspberry Pi と同じ VideoCore IV です。
こちらも詳細は下記のページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Android 5.0 Nexus Player x86 と対応 ABI
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・Amazon Fire TV の性能
2015/06/12
Galaxy S6 Mali-T760 は AEP 非搭載ながら ASTC HDR 対応
Exynos 7 Octa の Mali-T760 は OpenGL ES 3.1 に対応していることを確認しました。
残念ながら AEP (Android Extension Pack) が無いので D3D11 (FeatureLevel11)
相当の Tessellator 等は動きません。
その代わり ASTC 形式の圧縮テクスチャで HDR をサポートしている GPU は
今のところこれだけです。
今のところ判明している ASTC対応 GPU
ASTC 対応 GPU はまだ多くないものの、OpenGL (ES) だけでなく
D3D12/11.3 (FeatureLevel 12以上) や Metal でも使用することができます。
プラットフォームや API を超えて共有できるフォーマットになりつつあります。
下記ページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Desktop GPU でも GeForce (GTX650/GTX750Ti Kepler/Maxwell 等) は
GL_ARB_ES3_1_compatibility にて GL_ANDROID_extension_pack_es31a (AEP)
に対応しています。
GL_KHR_texture_compression_astc_ldr は無いものの、
glGetIntergerv( GL_COMPRESSED_TEXTURE_FORMATS ) では列挙されるので
ASTC Texture を読み込むことができます。
ただしエミュレーションらしくロード時に非圧縮フォーマットに展開されているようです。
関連エントリ
・Direct3D 12 と ASTC 圧縮 Texture
・iPad Air 2 (Apple A8X) の GPU
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)
残念ながら AEP (Android Extension Pack) が無いので D3D11 (FeatureLevel11)
相当の Tessellator 等は動きません。
その代わり ASTC 形式の圧縮テクスチャで HDR をサポートしている GPU は
今のところこれだけです。
Samsung Galaxy S6 Edge Exynos 7420 Android 5.0 GL_RENDERER: Mali-T760 GL_VERSION: OpenGL ES 3.1 GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers GL_OES_texture_compression_astc GL_OES_texture_compression_astc_ldr GL_OES_texture_compression_astc_hdr GL_KHR_debug GL_EXT_occlusion_query_boolean GL_EXT_disjoint_timer_query GL_EXT_blend_minmax GL_EXT_discard_framebuffer GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage GL_EXT_multisampled_render_to_texture GL_OES_surfaceless_context GL_OES_texture_stencil8 GL_EXT_shader_pixel_local_storage GL_ARM_shader_framebuffer_fetch GL_ARM_shader_framebuffer_fetch_depth_stencil GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_texture_sRGB_decode GL_KHR_blend_equation_advanced GL_OES_texture_storage_multisample_2d_array GL_OES_shader_image_atomic
今のところ判明している ASTC対応 GPU
ASTC LDR ASTC HDR AEP OS ------------------------------------------------------------ S805/810 Adreno 400 Y N Y Android 5.0 Tegra K1 Y N Y Android 5.0 Exynos 7 Mali-T760 Y Y N Android 5.0 A8X PowerVR GX6850 Y N N iOS 8
ASTC 対応 GPU はまだ多くないものの、OpenGL (ES) だけでなく
D3D12/11.3 (FeatureLevel 12以上) や Metal でも使用することができます。
プラットフォームや API を超えて共有できるフォーマットになりつつあります。
下記ページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Desktop GPU でも GeForce (GTX650/GTX750Ti Kepler/Maxwell 等) は
GL_ARB_ES3_1_compatibility にて GL_ANDROID_extension_pack_es31a (AEP)
に対応しています。
GL_KHR_texture_compression_astc_ldr は無いものの、
glGetIntergerv( GL_COMPRESSED_TEXTURE_FORMATS ) では列挙されるので
ASTC Texture を読み込むことができます。
ただしエミュレーションらしくロード時に非圧縮フォーマットに展開されているようです。
関連エントリ
・Direct3D 12 と ASTC 圧縮 Texture
・iPad Air 2 (Apple A8X) の GPU
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・Direct3D11/OpenGL 圧縮テクスチャ BPTC, BC6H/BC7 の詳細構造 (2)
2015/01/02
HYPERでんち の更新
2014/10/30
iPad Air 2 (Apple A8X) の GPU
一番大きな違いは ASTC のサポートです。
Metal の時代に今更 OpenGL ES という気もしますが念のため。
A8X では A7 になかった ASTC 圧縮テクスチャ形式が追加されています。
ASTC について詳しくは下記を参照してください。
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
OpenGL ES は 3.0 のままですが、すでに Metal API があるので
無くてもあまり問題は無いと思われます。
Metal では ES 3.1 相当の機能を利用することができます。
下記ページを更新しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・iPhone 5s の Apple A7 GPU
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較
GL_VERSION: OpenGL ES 3.0 Apple A8X GPU - 50.6.10 GL_RENDERER: Apple A8X GPU GL_VENDOR: Apple Inc. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
Metal の時代に今更 OpenGL ES という気もしますが念のため。
A8X では A7 になかった ASTC 圧縮テクスチャ形式が追加されています。
ASTC について詳しくは下記を参照してください。
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
OpenGL ES は 3.0 のままですが、すでに Metal API があるので
無くてもあまり問題は無いと思われます。
Metal では ES 3.1 相当の機能を利用することができます。
Extension:
GL_OES_standard_derivatives
GL_KHR_texture_compression_astc_ldr
GL_EXT_color_buffer_half_float
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_pvrtc_sRGB
GL_EXT_read_format_bgra
GL_EXT_separate_shader_objects
GL_EXT_shader_framebuffer_fetch
GL_EXT_shader_texture_lod
GL_EXT_shadow_samplers
GL_EXT_texture_filter_anisotropic
GL_APPLE_clip_distance
GL_APPLE_color_buffer_packed_float
GL_APPLE_copy_texture_levels
GL_APPLE_rgb_422
GL_APPLE_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_texture_compression_pvrtc
TextureFormat 42
00=8c00 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
01=8c01 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
02=8c02 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
03=8c03 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
04=9270 GL_COMPRESSED_R11_EAC
05=9271 GL_COMPRESSED_SIGNED_R11_EAC
06=9272 GL_COMPRESSED_RG11_EAC
07=9273 GL_COMPRESSED_SIGNED_RG11_EAC
08=9274 GL_COMPRESSED_RGB8_ETC2
09=9275 GL_COMPRESSED_SRGB8_ETC2
10=9278 GL_COMPRESSED_RGBA8_ETC2_EAC
11=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
12=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
13=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
14=93b0 GL_COMPRESSED_RGBA_ASTC_4x4_KHR
15=93b1 GL_COMPRESSED_RGBA_ASTC_5x4_KHR
16=93b2 GL_COMPRESSED_RGBA_ASTC_5x5_KHR
17=93b3 GL_COMPRESSED_RGBA_ASTC_6x5_KHR
18=93b4 GL_COMPRESSED_RGBA_ASTC_6x6_KHR
19=93b5 GL_COMPRESSED_RGBA_ASTC_8x5_KHR
20=93b6 GL_COMPRESSED_RGBA_ASTC_8x6_KHR
21=93b7 GL_COMPRESSED_RGBA_ASTC_8x8_KHR
22=93b8 GL_COMPRESSED_RGBA_ASTC_10x5_KHR
23=93b9 GL_COMPRESSED_RGBA_ASTC_10x6_KHR
24=93ba GL_COMPRESSED_RGBA_ASTC_10x8_KHR
25=93bb GL_COMPRESSED_RGBA_ASTC_10x10_KHR
26=93bc GL_COMPRESSED_RGBA_ASTC_12x10_KHR
27=93bd GL_COMPRESSED_RGBA_ASTC_12x12_KHR
28=93d0 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR
29=93d1 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR
30=93d2 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR
31=93d3 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR
32=93d4 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR
33=93d5 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR
34=93d6 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR
35=93d7 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR
36=93d8 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR
37=93d9 GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR
38=93da GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR
39=93db GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR
40=93dc GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR
41=93dd GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
下記ページを更新しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・iPhone 5s の Apple A7 GPU
・OpenGL ES 3.0 / OpenGL 4.3 ASTC 圧縮テクスチャの比較
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL ES 3.0 / OpenGL 4.3 ETC2 テクスチャ圧縮の比較
2012/08/25
OpenGL / OpenGL ES テクスチャファイルフォーマット KTX と DDS
DXT テクスチャの格納や cubemap, 3D Texture, HDR 形式など、
DDS は非常に便利なファイルフォーマットでした。
ところが DirectX は仕様自体に圧縮テクスチャが含まれているため
DXT,BC 以外のフォーマットが定義されていません。
ATITC や ETC1 など、独自の FourCC で対応しているツールもあります。
同時に PVRTC/PVRTC2、ETC2/EAC や ASTC など、DDS に格納できない
データも増えています。
KTX 形式は OpenGL の値をそのまま格納するので、Extension など
GLenum 値が決まればどんな形式も格納することができます。
今後 PVRTC2, ETC2/EAC, ASTC が出てくることを考えると ktx への
対応をきちんと考えておいた方が良さそうです。
テクスチャのファイルフォーマットについて下記のページにまとめました。
取り敢えず dds, ktx, pvr, pkm の 4 種類。
・Texture File Format
関連エントリ
・Android OpenGL ES 2.0 の圧縮テクスチャ
・Direct3D10 と DDS テクスチャフォーマット
・DirectX SDK November 2007 Gather と 新DDS フォーマット
DDS は非常に便利なファイルフォーマットでした。
ところが DirectX は仕様自体に圧縮テクスチャが含まれているため
DXT,BC 以外のフォーマットが定義されていません。
ATITC や ETC1 など、独自の FourCC で対応しているツールもあります。
同時に PVRTC/PVRTC2、ETC2/EAC や ASTC など、DDS に格納できない
データも増えています。
KTX 形式は OpenGL の値をそのまま格納するので、Extension など
GLenum 値が決まればどんな形式も格納することができます。
今後 PVRTC2, ETC2/EAC, ASTC が出てくることを考えると ktx への
対応をきちんと考えておいた方が良さそうです。
テクスチャのファイルフォーマットについて下記のページにまとめました。
取り敢えず dds, ktx, pvr, pkm の 4 種類。
・Texture File Format
関連エントリ
・Android OpenGL ES 2.0 の圧縮テクスチャ
・Direct3D10 と DDS テクスチャフォーマット
・DirectX SDK November 2007 Gather と 新DDS フォーマット
2012/01/21
ASUS Eee Pad TF201 Tegra3 の GPU 速度
Transformer Prime, EeePad TF201 手に入れました。
NVIDIA の新しい Mobile プロセッサ Tegra 3 を搭載しています。
CPU は Cortex-A9 の quad core で GPU は ULP GeForce 12 core 版
となります。
CPU は 4 core 認識しています。Tegra2 と違い NEON あります。
GPU の方は Tegra2 と比べて特に機能的な違いがありませんでした。
depth は 16bit のままで depth_texture もありません。
・Mobile GPU の機能比較
Extension は下記のページに追加しました。
・OpenGL ES Extension
● GPU 速度
いつもの pixel 負荷の高い描画テストを走らせてみました。
Tegra2 と比べて 3倍弱といった数値になっています。
shader core は Pixel が 2倍らしいので、Mali400 と同じ表現を
使えば MP2 相当です。2倍以上の性能差は動作クロックの違いだと
考えられます。
他の GPU との比較は下記のページにまとめました。
・Mobile GPU bench mark
pix/sec の欄を見ると、速度的にはほぼ 3世代目グループである
Mali-400MP4/Adreno220/SGX543MP2 に並んでいることがわかります。
NVIDIA といえば GPU のイメージが強いですが Tegra はむしろ逆です。
優先しているのは CPU の方で、半世代先行した設計で Quad 化を
実現しています。
それに対して GPU は決して突出した性能ではなく、やっとライバルに
並んだところです。
関連エントリ
・OpenGL ES 2.0 Mobile GPU の比較、重いテクスチャ
・頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)
・OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
・A5 PowerVR SGX543MP2 は iOS 5 だと速い
・さらに OpenGL ES 2.0 Mobile GPU の速度比較
・OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
NVIDIA の新しい Mobile プロセッサ Tegra 3 を搭載しています。
CPU は Cortex-A9 の quad core で GPU は ULP GeForce 12 core 版
となります。
CPU は 4 core 認識しています。Tegra2 と違い NEON あります。
Processor : ARMv7 Processor rev 9 (v7l) processor : 0 BogoMIPS : 1992.29 processor : 1 BogoMIPS : 1992.29 processor : 2 BogoMIPS : 1992.29 processor : 3 BogoMIPS : 1992.29 Features : swp half thumb fastmult vfp edsp neon vfpv3 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 9
GPU の方は Tegra2 と比べて特に機能的な違いがありませんでした。
depth は 16bit のままで depth_texture もありません。
・Mobile GPU の機能比較
GL_VERSION: OpenGL ES 2.0 12.01014 GL_RENDERER: NVIDIA Tegra 3 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 1.00
Extension は下記のページに追加しました。
・OpenGL ES Extension
● GPU 速度
いつもの pixel 負荷の高い描画テストを走らせてみました。
Tegra2 と比べて 3倍弱といった数値になっています。
(2) light 3 (ambient + directional x2 + point ) ----------------------------------------------------- Tegra 3 / ULP GeForce(12) 15.70fps EeePad TF201 Tegra 2 / ULP GeForce(8) 5.74fps ICONIA TAB A500 (3) light 1 (ambient + directional ) ----------------------------------------------------- Tegra 3 / ULP GeForce(12) 30.10fps EeePad TF201 Tegra 2 / ULP GeForce(8) 12.10fps ICONIA TAB A500
shader core は Pixel が 2倍らしいので、Mali400 と同じ表現を
使えば MP2 相当です。2倍以上の性能差は動作クロックの違いだと
考えられます。
他の GPU との比較は下記のページにまとめました。
・Mobile GPU bench mark
pix/sec の欄を見ると、速度的にはほぼ 3世代目グループである
Mali-400MP4/Adreno220/SGX543MP2 に並んでいることがわかります。
NVIDIA といえば GPU のイメージが強いですが Tegra はむしろ逆です。
優先しているのは CPU の方で、半世代先行した設計で Quad 化を
実現しています。
それに対して GPU は決して突出した性能ではなく、やっとライバルに
並んだところです。
Group3 | Adreno 220, PVR SGX543MP2, Mali-400MP4, ULP GeForce(12,Tegra3) Group2 | Adreno 205, PVR SGX530/535/540, ULP GeForce(8,Tegra250) Group1 | Adreno 200, AMD Z430
関連エントリ
・OpenGL ES 2.0 Mobile GPU の比較、重いテクスチャ
・頂点性能の比較 その2 (OpenGL ES 2.0 Mobile GPU)
・OpenGL ES 2.0 Mobile GPU の頂点性能を比較する
・A5 PowerVR SGX543MP2 は iOS 5 だと速い
・さらに OpenGL ES 2.0 Mobile GPU の速度比較
・OpenGL ES 2.0 Mobile GPU の速度比較 (dual core世代) 更新
2015/07/08
Intel HD Graphics Gen 8 は Open GL 4.4/OpenGL ES 3.1 AEP 対応 (Broadwell/Cherry Trail/Braswell)
Broadwell 世代の Intel HD Graphics (Iris Pro) は OpenGL 4.4 に対応していることがわかりました。また ES3 Compatibility では OpenGL ES 3.1 Context を作成可能で GL_ANDROID_extension_pack_es31a が含まれます。つまり OpenGL ES 3.1 AEP です。
今後 Cerry Trail 搭載 Android 端末が登場したら同じように OpenGL ES 3.1 AEP に対応しているものと思われます。
この世代の GPU には、Core i の Broadwell だけでなく Atom 系 CPU Airmont を搭載した Cherry Trail や Braswell も含まれます。
実際にこれらのデータは Braswell Celeron N3150 で調べています。
Intel HD Graphics の世代と対応 API まとめ (より詳しくはこちら)
詳細な結果は下記ページに掲載しました。
・Desktop GPU Extensions
上のページに掲載した "Intel HD Graphics Gen 8 (Braswell Celeron N3150)" の Extension 一覧を見ると、OpenGL 4.4 でも ASTC に Native で対応していることがわかります。
GeForce の Fermi/Kepler/Maxwell1 では Emulation でしたが、今後は Desktop GPU でも ASTC 対応が増えてくるものと思われます。
また Atom CPU (Airmont) の Braswell も DirectX12 (Direct3D 12) API に対応していることを確認しました。CPU 性能はあまり変わっていませんが、内蔵 GPU においては Bay Trail との差は非常に大きいようです。
↓こちらの表も更新しています。
・Direct3D 12 (DirectX 12) Windows 詳細
D3D12 API からみた Feature Options は今のところ Gen7.5 と変わっていないようです。
ただし、今後ドライバの更新等で仕様が変わる可能性があります。
関連エントリ
・Atom プロセッサの比較
・Direct3D 12 (DirectX12) GPU と API の対応表
・DirectX 12 (Direct3D 12) と GPU の対応
・Desktop GPU と OpenGL ES 3.1 API
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・CPU 負荷が低い 新しい 3D API
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
今後 Cerry Trail 搭載 Android 端末が登場したら同じように OpenGL ES 3.1 AEP に対応しているものと思われます。
# Braswell Celeron N3150 Windows 10 x64 GL_VERSION: 4.4.0 - Build 10.18.15.4235 GL_RENDERER: Intel(R) HD Graphics GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: 4.40 - Build 10.18.15.4235
# Braswell Celeron N3150 Windows 10 x64 GL_VERSION: OpenGL ES 3.1 - Build 10.18.15.4235 GL_RENDERER: Intel(R) HD Graphics GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10 - Build 10.18.15.4235
この世代の GPU には、Core i の Broadwell だけでなく Atom 系 CPU Airmont を搭載した Cherry Trail や Braswell も含まれます。
実際にこれらのデータは Braswell Celeron N3150 で調べています。
Intel HD Graphics の世代と対応 API まとめ (より詳しくはこちら)
世代 | FeatureLevel | OpenGL | OpenGL ES | D3D12 | ASTC | |
---|---|---|---|---|---|---|
Gen 7 | 11_0 | 4.0 | 3.1 | N | N | Ivy Bridge/Bay Trail |
Gen 7.5 | 11_1 | 4.3 | 3.1 | Y | N | Haswell |
Gen 8 | 11_1 | 4.4 | 3.1 AEP | Y | Y | Broadwell/Cherry Trail/Braswell |
詳細な結果は下記ページに掲載しました。
・Desktop GPU Extensions
上のページに掲載した "Intel HD Graphics Gen 8 (Braswell Celeron N3150)" の Extension 一覧を見ると、OpenGL 4.4 でも ASTC に Native で対応していることがわかります。
GeForce の Fermi/Kepler/Maxwell1 では Emulation でしたが、今後は Desktop GPU でも ASTC 対応が増えてくるものと思われます。
Extension より GL_KHR_texture_compression_astc_ldr GL_ANDROID_extension_pack_es31a
また Atom CPU (Airmont) の Braswell も DirectX12 (Direct3D 12) API に対応していることを確認しました。CPU 性能はあまり変わっていませんが、内蔵 GPU においては Bay Trail との差は非常に大きいようです。
↓こちらの表も更新しています。
・Direct3D 12 (DirectX 12) Windows 詳細
D3D12 API からみた Feature Options は今のところ Gen7.5 と変わっていないようです。
ただし、今後ドライバの更新等で仕様が変わる可能性があります。
関連エントリ
・Atom プロセッサの比較
・Direct3D 12 (DirectX12) GPU と API の対応表
・DirectX 12 (Direct3D 12) と GPU の対応
・Desktop GPU と OpenGL ES 3.1 API
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・CPU 負荷が低い 新しい 3D API
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
Amazon の新しい Tablet である Fire HD 6 は、Android 4.4 ベースの
Fire OS 4.1 を搭載しています。
Android 4.4 、API Level 19 になったことで GPU が対応していれば
OpenGL ES 3.0 が使えるようになりました。
下記は Fire HD 6 の結果です。
SoC は MediaTek MT8135 で、非対称の 4 core CPU に PowerVR G6200。
Extension と対応している圧縮テクスチャフォーマットは下記の通り。
ETC2/EAC だけでなく PVRTC2 (PVRTCv2) にも対応していることがわかります。
同じ Series 6 でも iOS では PVRTCv2 に対応していませんでした。
PVRTCv2 は ETC2 と同じように、上位互換性を保ちつつモード分岐による
画質の向上が施された 2世代目の圧縮フォーマットです。
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
CPU は Cortex-A15 x2 と Cortex-A7 x2 の big.LITTLE 構成です。
実際に試してみると、HMP が有効らしくアプリケーションからは 4 core と
認識されていることがわかります。
負荷をかけた状態は下記の通り。4 core ともアクティブです。
ミドルクラスでも Cortex-A7 Quad の端末が増えている中、
価格帯 1万円前後ながら Cortex-A15 を搭載している点が大きな特徴と言えます。
Cortex-A15 と Cortex-A7 は数倍の性能差があるので、
HMP (GTS) ではスケジューラがどのようにタスクを割り振るのか興味あるところです。
下記ページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
Fire OS 4.1 を搭載しています。
Android 4.4 、API Level 19 になったことで GPU が対応していれば
OpenGL ES 3.0 が使えるようになりました。
下記は Fire HD 6 の結果です。
GL_VERSION: OpenGL ES 3.0 build 1.3@2876724 GL_RENDERER: PowerVR Rogue Han GL_VENDOR: Imagination Technologies GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00 build 1.3@2876724
SoC は MediaTek MT8135 で、非対称の 4 core CPU に PowerVR G6200。
Extension と対応している圧縮テクスチャフォーマットは下記の通り。
Extension:
GL_OES_rgb8_rgba8
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_element_index_uint
GL_OES_mapbuffer
GL_OES_fragment_precision_high
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_EGL_sync
GL_OES_required_internalformat
GL_OES_depth_texture
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_OES_texture_npot
GL_OES_surfaceless_context
GL_EXT_discard_framebuffer
GL_EXT_multi_draw_arrays
GL_EXT_multisampled_render_to_texture
GL_EXT_shader_texture_lod
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_format_BGRA8888
GL_EXT_blend_minmax
GL_EXT_texture_rg
GL_EXT_occlusion_query_boolean
GL_EXT_color_buffer_float
GL_EXT_shader_framebuffer_fetch
GL_EXT_separate_shader_objects
GL_EXT_robustness
GL_EXT_draw_buffers
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_compression_pvrtc2
GL_IMG_texture_npot
GL_IMG_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_program_binary
GL_IMG_multisampled_render_to_texture
GL_KHR_debug
TextureFormat 17
00=8c01 GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
01=8c03 GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
02=8c00 GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
03=8c02 GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
04=9137 GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
05=9138 GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
06=8d64 GL_ETC1_RGB8_OES
07=9274 GL_COMPRESSED_RGB8_ETC2
08=9275 GL_COMPRESSED_SRGB8_ETC2
09=9278 GL_COMPRESSED_RGBA8_ETC2_EAC
10=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC
11=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
12=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
13=9271 GL_COMPRESSED_SIGNED_R11_EAC
14=9270 GL_COMPRESSED_R11_EAC
15=9273 GL_COMPRESSED_SIGNED_RG11_EAC
16=9272 GL_COMPRESSED_RG11_EAC
ETC2/EAC だけでなく PVRTC2 (PVRTCv2) にも対応していることがわかります。
同じ Series 6 でも iOS では PVRTCv2 に対応していませんでした。
PVRTCv2 は ETC2 と同じように、上位互換性を保ちつつモード分岐による
画質の向上が施された 2世代目の圧縮フォーマットです。
1世代目 2世代目 ------------------- ETC1 ETC2/EAC PVRTCv1 PVRTCv2
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
PVRTCv1 PVRTCv2 ETC1 ETC2/EAC ---------------------------------------------------------- Android PowerVR Series 5 Y - Y - Android PowerVR Series 6 Y Y Y Y iOS PowerVR Series 5 Y - - - iOS PowerVR Series 6 Y - Y*1 Y *1 ETC2 は ETC1 の上位互換性があるため ETC1 の読み込みも可能
CPU は Cortex-A15 x2 と Cortex-A7 x2 の big.LITTLE 構成です。
実際に試してみると、HMP が有効らしくアプリケーションからは 4 core と
認識されていることがわかります。
負荷をかけた状態は下記の通り。4 core ともアクティブです。
$ cat /sys/devices/system/cpu/online 0-3 $ cat /proc/cpuinfo Processor : ARMv7 Processor rev 3 (v7l) processor : 0 BogoMIPS : 31.81 Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xc07 CPU revision : 3 Processor : ARMv7 Processor rev 3 (v7l) processor : 1 BogoMIPS : 31.81 Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xc07 CPU revision : 3 Processor : ARMv7 Processor rev 2 (v7l) processor : 2 BogoMIPS : 35.06 Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x3 CPU part : 0xc0f CPU revision : 2 Processor : ARMv7 Processor rev 2 (v7l) processor : 3 BogoMIPS : 26.00 Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4 idiva idivt CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x3 CPU part : 0xc0f CPU revision : 2 Hardware : MT8135 Revision : 000f 000a Serial : 0000000000000000
ミドルクラスでも Cortex-A7 Quad の端末が増えている中、
価格帯 1万円前後ながら Cortex-A15 を搭載している点が大きな特徴と言えます。
Cortex-A15 と Cortex-A7 は数倍の性能差があるので、
HMP (GTS) ではスケジューラがどのようにタスクを割り振るのか興味あるところです。
下記ページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・OpenGL 4.3/GLES 3.0 次の圧縮テクスチャ ASTC
・OpenGL 4.3/ES 3.0 ETC2 Texture 圧縮の仕組み (PVRTC2,ASTC)
2015/06/25
Desktop GPU と OpenGL ES 3.1 API
OpenGL ES は Mobile 等で用いられる API ですが、Desktop 向け OpenGL にも
積極的に取り込まれており互換性が保たれるようになってきました。
OpenGL 4.5 では GL_ARB_ES3_1_compatibility をサポートし、
OpenGL ES 3.1 API としても使うことができます。
2015/06/25 現在 Windows での対応状況 (beta driver 含む)
Intel と GeForce は OpenGL ES 3.1 Context を作り直す必要があります。
RADEON の場合は OpenGL 4.5 Context のまま使用します。
Desktop GPU 上で OpenGL ES を使う方法については下記にまとめています。
・Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境
Intel HD Graphics (D3D11世代) は OpenGL 4.5 に対応していませんが、
新しいドライバでは OpenGL ES 3.1 に対応しています。
具体的には Ivy Bridge 世代の Intel HD Graphics 4000/2500 以降で、
BayTrail の HD Graphics も含まれます。
GeForce のように GL_ANDROID_extension_pack_es31a (AEP) はありませんが、
Tessellator/GeometryShader など一部の機能は独自に対応が行われているようです。
OpenGL ES 3.1 context には下記の extension が含まれていることがわかります。
・Intel Developer Zone : Tessellation for OpenGL ES 3.1 on Android
GeForce は OpenGL ES 3.1 context で AEP をサポートしています。
ただし GPU によっては、AEP で必要な一部機能 (ASTC Texture) がソフトウエアで
エミュレーションされているようです。
NVIDIA は Mobile 向けに GLES Emulator Library をリリースしていないので
それを兼ねているのかもしれません。
RADEON は OpenGL 4.x そのままなので特に機能制限ありません。
よっていずれも GLES API ながら OpenGL 4.x 相当の機能が使えることになります。
GPU ごとの詳細は下記に載せています。
それぞれ可能な範囲で OpenGL ES 3.1 context の結果も含めました。
・Desktop GPU Extensions
関連エントリ
・Android 5.x OpenGL ES 3.1 と対応 GPU
・Galaxy S6 Mali-T760 は AEP 非搭載ながら ASTC HDR 対応
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
積極的に取り込まれており互換性が保たれるようになってきました。
OpenGL 4.5 では GL_ARB_ES3_1_compatibility をサポートし、
OpenGL ES 3.1 API としても使うことができます。
2015/06/25 現在 Windows での対応状況 (beta driver 含む)
Windows Desktop API Mobile API ------------------------------------------------------------- GeForce OpenGL 4.5 OpenGL ES 3.1 AEP RADEON OpenGL 4.5 OpenGL ES 3.1 Intel 4000 (Gen7) OpenGL 4.0 OpenGL ES 3.1 IvyBridge世代 Intel 4600 (7.5) OpenGL 4.3 OpenGL ES 3.1 Haswell世代
Intel と GeForce は OpenGL ES 3.1 Context を作り直す必要があります。
RADEON の場合は OpenGL 4.5 Context のまま使用します。
Desktop GPU 上で OpenGL ES を使う方法については下記にまとめています。
・Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境
Intel HD Graphics (D3D11世代) は OpenGL 4.5 に対応していませんが、
新しいドライバでは OpenGL ES 3.1 に対応しています。
具体的には Ivy Bridge 世代の Intel HD Graphics 4000/2500 以降で、
BayTrail の HD Graphics も含まれます。
Intel HD Graphics 4000 (Ivy Bridge) Windows 8.1 x64 GL_VERSION: OpenGL ES 3.1 - Build 10.18.10.4226 GL_RENDERER: Intel(R) HD Graphics 4000 GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.1 - Build 10.18.10.4226
Intel HD Graphics (BayTrail-T Atom Z3740) Windows 10 x86 GL_VERSION: OpenGL ES 3.1 - Build 10.18.10.3993 GL_RENDERER: Intel(R) HD Graphics GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.1 - Build 10.18.10.3993
Intel HD Graphics 4600 (Haswell) Windows 10 x64 GL_VERSION: OpenGL ES 3.1 - Build 10.18.15.4235 GL_RENDERER: Intel(R) HD Graphics 4600 GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10 - Build 10.18.15.4235
GeForce のように GL_ANDROID_extension_pack_es31a (AEP) はありませんが、
Tessellator/GeometryShader など一部の機能は独自に対応が行われているようです。
OpenGL ES 3.1 context には下記の extension が含まれていることがわかります。
GL_INTEL_tessellation GL_INTEL_geometry_shader
・Intel Developer Zone : Tessellation for OpenGL ES 3.1 on Android
GeForce は OpenGL ES 3.1 context で AEP をサポートしています。
ただし GPU によっては、AEP で必要な一部機能 (ASTC Texture) がソフトウエアで
エミュレーションされているようです。
NVIDIA は Mobile 向けに GLES Emulator Library をリリースしていないので
それを兼ねているのかもしれません。
RADEON は OpenGL 4.x そのままなので特に機能制限ありません。
よっていずれも GLES API ながら OpenGL 4.x 相当の機能が使えることになります。
GPU ごとの詳細は下記に載せています。
それぞれ可能な範囲で OpenGL ES 3.1 context の結果も含めました。
・Desktop GPU Extensions
関連エントリ
・Android 5.x OpenGL ES 3.1 と対応 GPU
・Galaxy S6 Mali-T760 は AEP 非搭載ながら ASTC HDR 対応
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・Android Nexus 6 Adreno 420 も OpenGL ES 3.1 AEP 対応 (Direct3D 11相当)
・Android 5.0 Nexus 10 Mali-T604 は OpenGL ES 3.1 対応
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・iPad Air 2 (Apple A8X) の GPU
・NVIDIA SHIELD Tablet Tegra K1 は OpenGL ES 3.1 で Extension Pack 対応
・OpenGL ES 3.1 は OpenGL 4.x 相当で ComputeShader に対応
手持ち端末のアップデート続きです。
● ASUS MeMO Pad 7 ME176 (2014)
ME176 は BayTrail を搭載した Android Tablet です。Atom Z35** ではなく Windows Tablet に使われているものと同じ Z37** が使われています。そのため GPU も PowerVR ではなく Intel HD Graphics Gen7 になっています。
Android 5.0 への更新で OpenGL ES 3.1 が使えるようになりました。現時点で Android の OpenGL ES 3.1 対応を確認した GPU をまとめると下記の通り。
同じ Atom でも Z35** の PowerVR G6430 とは異なり、Intel HD Graphics Gen7 は Windows 上で Direct3D11 に対応しています。Android でも AEP には非対応なものの独自の Extension により GS や Tessellator が使えるようになっています。AEP でないのは ASTC に対応していないことが関係しているのかもしれません。
逆に Mali-T760/PVR GX6250 は GS/Tessellator がない代わりに ASTC 対応です。
MeMO Pad 7 ME176 の OpenGL ES 3.1 における Extension 等の詳細は下記ページに追加しました。Android 5.0 でも 64bit には非対応のままでした。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
また下記ページも更新しています。
・OpenGL / OpenGL ES 2.0 / OpenGL ES 3.2
OpenGLES 3.0 対応で 3.1 非対応な GPU は今のところ Adreno 300 だけとなっています。また Intel HD Graphics も Gen8 以降は AEP 対応であることが判明しています。
● ZOTAC Tegra Note 7 (2013)
更新によって Android 5.1 になりました。SHIELD 同様 NVIDIA 自身が販売しているデバイスなので、比較的こまめに新しい OS がリリースされています。4.2 から 5.1 まできちんとサポートしてきたのは好印象です。ただし Tegra 4 なので OS は新しくても OpenGL ES 2.0 のままです。
● Amazon Fire HD 6 (2014)
Android 5.1 (API Level 22) 相当の Fire OS 5 がリリースされています。性能は非力ですが OpenGL ES 3.1 対応です。
● Kindle Fire HDX 7 (2013)
Snapdragon 800 搭載で、今回取り上げた 4台の中では最も性能が高いハードウエアとなっています。しかしながら OS の更新は Fire OS 4.5 (Android 4.4 API Level 19 相当) までで Fire OS 5 には非対応でした。Kindle/Fire 系はデイバスの種類が限られているものの最新 OS の提供打ち切りがかなり早い印象です。特に Adreno 420 搭載なのに 3.1 AEP が使えない Fire HDX 8.9 (2014) は少々残念です。
iOS ではスペック上の問題さえなければ新しい OS が提供されているので、Fire も OS を継続してサポートしていればプラットフォームとしてもう少し開発しやすかったように思います。
・Amazon: Device and Feature Specifications
関連エントリ
・Android 端末のアップデート (1) Android Wear バージョン一覧と新しいアーキテクチャ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・ASUS MeMO Pad 7 ME176 で OpenGL ES 3.0 が復活
・Android の新しい GPU BayTrail-T Intel HD Graphics
● ASUS MeMO Pad 7 ME176 (2014)
ME176 は BayTrail を搭載した Android Tablet です。Atom Z35** ではなく Windows Tablet に使われているものと同じ Z37** が使われています。そのため GPU も PowerVR ではなく Intel HD Graphics Gen7 になっています。
Android 5.0 への更新で OpenGL ES 3.1 が使えるようになりました。現時点で Android の OpenGL ES 3.1 対応を確認した GPU をまとめると下記の通り。
GPU | API | SoC |
---|---|---|
NVIDIA Tegra K1 | OpenGL ES 3.1 AEP | Tegra K1 |
Adreno 420/430 | OpenGL ES 3.1 AEP | Snapdargon 810/805 |
ARM Mail-T604 | OpenGL ES 3.1 | Exynos 5 Dual (5250) |
ARM Mail-T760 | OpenGL ES 3.1 | Exynos 7 Octa (7420) |
PowerVR G6430 Rogue | OpenGL ES 3.1 | BayTrail-T Z3560 |
PowerVR G6200 Rogue | OpenGL ES 3.1 | MediaTek MT8135 |
PowerVR GX6250 Series6XT | OpenGL ES 3.1 | MediaTek MT8173C |
Intel HD Graphics Gen7 | OpenGL ES 3.1 | BayTrail-T Z3745 |
同じ Atom でも Z35** の PowerVR G6430 とは異なり、Intel HD Graphics Gen7 は Windows 上で Direct3D11 に対応しています。Android でも AEP には非対応なものの独自の Extension により GS や Tessellator が使えるようになっています。AEP でないのは ASTC に対応していないことが関係しているのかもしれません。
逆に Mali-T760/PVR GX6250 は GS/Tessellator がない代わりに ASTC 対応です。
GPU | API | GS/TS | ASTC |
---|---|---|---|
NVIDIA Tegra K1 | OpenGL ES 3.1 AEP | Y | Y(L) |
Adreno 420/430 | OpenGL ES 3.1 AEP | Y | Y(L) |
ARM Mail-T604 | OpenGL ES 3.1 | N | N |
ARM Mail-T760 | OpenGL ES 3.1 | N | Y(H) |
PowerVR G6430 Rogue | OpenGL ES 3.1 | N | N |
PowerVR G6200 Rogue | OpenGL ES 3.1 | N | N |
PowerVR GX6250 Series6XT | OpenGL ES 3.1 | N | Y(L) |
Intel HD Graphics Gen7 | OpenGL ES 3.1 | Y | N |
MeMO Pad 7 ME176 の OpenGL ES 3.1 における Extension 等の詳細は下記ページに追加しました。Android 5.0 でも 64bit には非対応のままでした。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
また下記ページも更新しています。
・OpenGL / OpenGL ES 2.0 / OpenGL ES 3.2
OpenGLES 3.0 対応で 3.1 非対応な GPU は今のところ Adreno 300 だけとなっています。また Intel HD Graphics も Gen8 以降は AEP 対応であることが判明しています。
● ZOTAC Tegra Note 7 (2013)
更新によって Android 5.1 になりました。SHIELD 同様 NVIDIA 自身が販売しているデバイスなので、比較的こまめに新しい OS がリリースされています。4.2 から 5.1 まできちんとサポートしてきたのは好印象です。ただし Tegra 4 なので OS は新しくても OpenGL ES 2.0 のままです。
● Amazon Fire HD 6 (2014)
Android 5.1 (API Level 22) 相当の Fire OS 5 がリリースされています。性能は非力ですが OpenGL ES 3.1 対応です。
● Kindle Fire HDX 7 (2013)
Snapdragon 800 搭載で、今回取り上げた 4台の中では最も性能が高いハードウエアとなっています。しかしながら OS の更新は Fire OS 4.5 (Android 4.4 API Level 19 相当) までで Fire OS 5 には非対応でした。Kindle/Fire 系はデイバスの種類が限られているものの最新 OS の提供打ち切りがかなり早い印象です。特に Adreno 420 搭載なのに 3.1 AEP が使えない Fire HDX 8.9 (2014) は少々残念です。
iOS ではスペック上の問題さえなければ新しい OS が提供されているので、Fire も OS を継続してサポートしていればプラットフォームとしてもう少し開発しやすかったように思います。
Device | FireOS | Android | API | SoC | GPU | |
---|---|---|---|---|---|---|
Fire TV Stick | 2015 | 5.0 | 5.1 | 22 | Broadcomm 28155 | VideoCore IV |
Fire TV | 2015 | 5.0 | 5.1 | 22 | MT8173 | PowerVR GX6250 |
Fire | 2015 | 5.0 | 5.1 | 22 | MT8127 | Mai-450 |
Fire HD 8/10 | 2015 | 5.0 | 5.1 | 22 | MT3135 | PowerVR G6200 |
Fire HD 6/7 | 2014 | 5.0 | 5.1 | 22 | MT8135 | PowerVR G6200 |
Fire HDX 8.9 | 2014 | 4.5 | 4.4 | 19 | Snapdargon 805 | Adreno 420 |
Fire HDX 7/8.9 | 2013 | 4.5 | 4.4 | 19 | Snapdargon 800 | Adreno 330 |
Fire HD 7 | 2013 | 4.5 | 4.4 | 19 | TI OMAP4470 | PowerVR SGX544 |
Fire HD 8.9 | 2012 | 4.0 | 4.0 | 15 | TI OMAP4470 | PowerVR SGX544 |
Fire HD 7 | 2012 | 4.0 | 4.0 | 15 | TI OMAP4460 | PowerVR SGX540 |
Fire | 2012 | 4.0 | 4.0 | 15 | TI OMAP4430 | PowerVR SGX540 |
・Amazon: Device and Feature Specifications
関連エントリ
・Android 端末のアップデート (1) Android Wear バージョン一覧と新しいアーキテクチャ
・Desktop GPU と OpenGL ES 3.1 API
・Android 5.x OpenGL ES 3.1 と対応 GPU
・(Kindle) Fire HD 6 は OpenGL ES 3.0 対応で非対称 4 core CPU
・ASUS MeMO Pad 7 ME176 で OpenGL ES 3.0 が復活
・Android の新しい GPU BayTrail-T Intel HD Graphics
2012/11/02
iPad 4 Apple A6X GPU PowerVR SGX554 MP4 の速度
iPad 4 のベンチマークスコアを追加しました。
Apple A6X の GPU はこれまでの PowerVR SGX543 とは別のもので、
PowerVR SGX554 でした。
同じ 4 core でも性能的に公称 2倍。
実際のベンチマークでも 2~3 倍の速度が出ています。
・Mobile GPU bench mark
Retina で Pixel 数が 4倍もあるにもかかわらず、
実際の動作速度で iPad 2 を超えているケースも少なくありません。
描画だけでなく CPU core 自体も大きく高速化されており、
システム全体として非常にパワフルになった印象です。
特に PowerVR SGX554 はシェーダーの演算能力自体が上がっているようで、
これまで苦手としてきたシェーダー負荷が高いケースでもきちんと速度が
出るようになっています。
間違いなく現時点では最速に分類され、
Retina や Mobile GPU であることを言い訳にできなくなっています。
ただし今のところ Extension に違いはなく、PVRTC2 や OpenGL ES 3.0
に向けた新しいフューチャーに対応しているかどうかは不明です。
今年になって CPU core も GPU core も世代交代が進んでいます。
A6, Krait, Cortex-A15 といった CPU core だけでなく、
Adreno 320, Mali-T604 等 OpenGL ES 3.0 世代の GPU も揃って来ました。
あとは OS や SDK の対応を待つばかりです。
OS の対応が始まれば世代交代はさらに早まるものと考えられます。
関連エントリ
・iPhone 5 / iPod touch 5 の GPU 速度
・iPad 3 PowerVR SGX543MP4 の速度
Apple A6X の GPU はこれまでの PowerVR SGX543 とは別のもので、
PowerVR SGX554 でした。
同じ 4 core でも性能的に公称 2倍。
実際のベンチマークでも 2~3 倍の速度が出ています。
・Mobile GPU bench mark
Retina で Pixel 数が 4倍もあるにもかかわらず、
実際の動作速度で iPad 2 を超えているケースも少なくありません。
描画だけでなく CPU core 自体も大きく高速化されており、
システム全体として非常にパワフルになった印象です。
特に PowerVR SGX554 はシェーダーの演算能力自体が上がっているようで、
これまで苦手としてきたシェーダー負荷が高いケースでもきちんと速度が
出るようになっています。
間違いなく現時点では最速に分類され、
Retina や Mobile GPU であることを言い訳にできなくなっています。
ただし今のところ Extension に違いはなく、PVRTC2 や OpenGL ES 3.0
に向けた新しいフューチャーに対応しているかどうかは不明です。
今年になって CPU core も GPU core も世代交代が進んでいます。
A6, Krait, Cortex-A15 といった CPU core だけでなく、
Adreno 320, Mali-T604 等 OpenGL ES 3.0 世代の GPU も揃って来ました。
あとは OS や SDK の対応を待つばかりです。
OS の対応が始まれば世代交代はさらに早まるものと考えられます。
関連エントリ
・iPhone 5 / iPod touch 5 の GPU 速度
・iPad 3 PowerVR SGX543MP4 の速度
Nexus 7 (2013) が発売されたので、
Adreno 320 上でも OpenGL ES 3.0 のテストができるようになりました。
現時点で OpenGL ES 3.0 を走らせるには、
Android 4.3 と OpenGL ES 3.0 対応 GPU が必要です。
現在 OpenGL ES 3.0 + Android 4.3 に対応しているのは上記 2機種です。
(おそらく明後日 30日発売の Nexus 4 も可能だと思われます)
新しい Nexus 7 を下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Qualcomm Snapdragon APQ8064 自体は、昨年末から採用端末が多数
登場しているので、今となってはあまり目新しいものではないかもしれません。
ですが、AQP8064 は CPU core, GPU core の両方が世代交代した
アーキテクチャとなっており、開発用途では非常に興味深い内容となっています。
当初から ETC2 など OpenGL ES 3.0 の仕様が部分的に含まれていましたし、
3DMark でもかなり優秀な成績を収めています。
でもこれはまだ DX10 対応 GPU で DX9 のデモを走らせているようなもの。
Android 4.3 + OpenGL ES 3.0 でようやく GPU の世代に一致したシェーダーを
走らせることができるようになります。
以下 Nexus 7 (2013) からの抜粋L
下記は Nexus 10 の Mali-T604 との比較
Mali では Fragment で使える Uniform 数の方が Vertex よりも多いですが
Adreno では少なくなっているようです。
少々特殊な 896 / 224 という数値は OpenGL ES 3.0 の仕様を満たしています。
むしろ Adreno に合わせた数値(仕様)だと思われます。
実際にプログラムを走らせてみたのですが、残念ながら
Adreno 320 の OpenGL ES 3.0 ではまだ複雑なシェーダーが正しく動いていません。
簡単なシェーダーと、OpenGL ES 2.0 互換モードでは動作を確認できました。
Shader の Link 時に Internal error が発生しているので、
原因を調べているところです。
関連エントリ
・Android 4.3 と OpenGL ES 3.0
・Nexus 10 CPU Cortex-A15 の速度
・Nexus 10 GPU Mali-T604
・3DMark Android 版の結果から
Adreno 320 上でも OpenGL ES 3.0 のテストができるようになりました。
現時点で OpenGL ES 3.0 を走らせるには、
Android 4.3 と OpenGL ES 3.0 対応 GPU が必要です。
SoC CPU GPU --------------------------------------------------------------- Nexus 10 Exynos5 Dual Cortex-A15 x2 Mali-T604 Nexus 7 (2013) Snapdragon APQ8064 Krait x4 Adreno 320
現在 OpenGL ES 3.0 + Android 4.3 に対応しているのは上記 2機種です。
(おそらく明後日 30日発売の Nexus 4 も可能だと思われます)
新しい Nexus 7 を下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
Qualcomm Snapdragon APQ8064 自体は、昨年末から採用端末が多数
登場しているので、今となってはあまり目新しいものではないかもしれません。
ですが、AQP8064 は CPU core, GPU core の両方が世代交代した
アーキテクチャとなっており、開発用途では非常に興味深い内容となっています。
当初から ETC2 など OpenGL ES 3.0 の仕様が部分的に含まれていましたし、
3DMark でもかなり優秀な成績を収めています。
でもこれはまだ DX10 対応 GPU で DX9 のデモを走らせているようなもの。
Android 4.3 + OpenGL ES 3.0 でようやく GPU の世代に一致したシェーダーを
走らせることができるようになります。
以下 Nexus 7 (2013) からの抜粋L
GL_VERSION: OpenGL ES 3.0 V@14.0 AU@ (CL@)
GL_RENDERER: Adreno (TM) 320
GL_VENDOR: Qualcomm
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
Extension:
GL_AMD_compressed_ATC_texture
GL_AMD_performance_monitor
GL_AMD_program_binary_Z400
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_robustness
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_type_2_10_10_10_REV
GL_NV_fence
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth_texture
GL_OES_depth24
GL_OES_EGL_image
GL_OES_EGL_image_external
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_fragment_precision_high
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_depth_texture_cube_map
GL_OES_rgb8_rgba8
GL_OES_standard_derivatives
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_vertex_type_10_10_10_2
GL_OES_vertex_array_object
GL_QCOM_alpha_test
GL_QCOM_binning_control
GL_QCOM_driver_control
GL_QCOM_perfmon_global_mode
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_tiled_rendering
GL_QCOM_writeonly_rendering
GL_EXT_sRGB
GL_EXT_texture_filter_anisotropic
GL_EXT_color_buffer_float
GL_EXT_color_buffer_half_float
下記は Nexus 10 の Mali-T604 との比較
Nexus 7 (2013) Nexus 10 Adreno 320 Mali-T604 ----------------------------------------------------------------- === GL3:texture GL_MAX_3D_TEXTURE_SIZE 1024 4096 GL_MAX_TEXTURE_SIZE 4096 4096 GL_MAX_ARRAY_TEXTURE_LAYERS 256 4096 GL_MAX_TEXTURE_LOD_BIAS 15.984375 255.996094 GL_MAX_CUBE_MAP_TEXTURE_SIZE 4096 4096 GL_MAX_RENDERBUFFER_SIZE 4096 4096 GL_MAX_DRAW_BUFFERS 4 4 GL_MAX_COLOR_ATTACHMENTS 4 4 GL_MAX_VIEWPORT_DIMS 4096 4096 === GL3:elements GL_MAX_ELEMENTS_INDICES -1 16777216 GL_MAX_ELEMENTS_VERTICES -1 16777216 === GL3:vertex GL_MAX_VERTEX_ATTRIBS 16 16 GL_MAX_VERTEX_OUTPUT_COMPONENTS 69 64 === GL3:pixel GL_MAX_FRAGMENT_INPUT_COMPONENTS 71 60 === GL3:program GL_MIN_PROGRAM_TEXEL_OFFSET -8 -8 GL_MAX_PROGRAM_TEXEL_OFFSET 7 7 GL_MAX_VARYING_COMPONENTS 64 60 GL_MAX_VARYING_VECTORS 16 15 === GL3:output stream GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 64 64 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 4 4 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 4 4 GL_MAX_SAMPLES 4 4 === GL3:uniform block GL_MAX_VERTEX_UNIFORM_COMPONENTS 1024 1024 GL_MAX_VERTEX_UNIFORM_VECTORS 256 256 GL_MAX_VERTEX_UNIFORM_BLOCKS 12 12 GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS -- 50176 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 896 4096 GL_MAX_FRAGMENT_UNIFORM_VECTORS 224 1024 GL_MAX_FRAGMENT_UNIFORM_BLOCKS 12 GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 197504 53248 GL_MAX_UNIFORM_BUFFER_BINDINGS 24 36 GL_MAX_UNIFORM_BLOCK_SIZE 65536 16384 GL_MAX_COMBINED_UNIFORM_BLOCKS 24 24 === GL3:tex GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 16 16 GL_MAX_TEXTURE_IMAGE_UNITS 16 16 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 32 32
Mali では Fragment で使える Uniform 数の方が Vertex よりも多いですが
Adreno では少なくなっているようです。
少々特殊な 896 / 224 という数値は OpenGL ES 3.0 の仕様を満たしています。
むしろ Adreno に合わせた数値(仕様)だと思われます。
実際にプログラムを走らせてみたのですが、残念ながら
Adreno 320 の OpenGL ES 3.0 ではまだ複雑なシェーダーが正しく動いていません。
簡単なシェーダーと、OpenGL ES 2.0 互換モードでは動作を確認できました。
Shader の Link 時に Internal error が発生しているので、
原因を調べているところです。
関連エントリ
・Android 4.3 と OpenGL ES 3.0
・Nexus 10 CPU Cortex-A15 の速度
・Nexus 10 GPU Mali-T604
・3DMark Android 版の結果から
2014/10/12
ASUS MeMO Pad 7 ME176 で OpenGL ES 3.0 が復活
ASUS MeMO Pad 7 ME176 の最新ファームウエアで
再び OpenGL ES 3.0 が使えるようになっています。
以前の記事はこちら。
・Android BayTrail ME176 で OpenGL ES 3.0 が使えない
下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Android BayTrail ME176 で OpenGL ES 3.0 が使えない
・Android の新しい GPU BayTrail-T Intel HD Graphics
再び OpenGL ES 3.0 が使えるようになっています。
Android 4.4.2 JP-3.2.23.182 GL_VERSION: OpenGL ES 3.0 - Build CL-260519-CI-15.33-24169 GL_RENDERER: Intel(R) HD Graphics for BayTrail GL_VENDOR: Intel GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.0 - Build CL-260519-CI-15.33-24169
以前の記事はこちら。
・Android BayTrail ME176 で OpenGL ES 3.0 が使えない
下記ページに追加しました。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
関連エントリ
・Android BayTrail ME176 で OpenGL ES 3.0 が使えない
・Android の新しい GPU BayTrail-T Intel HD Graphics
2011/10/09
Android HTC EVO 3D GPU Adreno 220 の速度
HTC EVO 3D の 3D 描画能力のテスト。
第三世代の Snapdragon で、Adreno 220 を搭載しています。
以前の比較とはシェーダーが多少違います。
背景+複数キャラクタ+ライティング+Shadow map あり。
画面サイズが違うので単純には比較できませんが、秒間のピクセル数に
変換しても Mali-400MP には及びませんでした。
ただし Adreno は mobile GPU の中でも描画機能が非常に充実しており
ピクセルの演算精度も高くなっています。
第二世代の Adreno 205 (Snapdragon MSM8255 1GHz) 比では 2倍以上高速
なので十分良い数値と言えます。
以下は分岐を伴う、より複雑なライティングのシェーダーでのテスト。
下記ページにも追加しています。
・OpenGL ES 2.0 Mobile GPU 比較
・Mobile GPU Extension
関連エントリ
・OpenGL ES 2.0 shader の演算精度
・Android Galaxy S2 ARM Mali-400 MP は速い (2)
第三世代の Snapdragon で、Adreno 220 を搭載しています。
以前の比較とはシェーダーが多少違います。
Mali-400MP 800×480 : 56fps (20.5Mpix/sec) Exynos 4210 S5PC210 1.2GHz Adreno 220 960×540 : 39fps (19.4Mpix/sec) Snapdragon MSM8660 1.2GHz
背景+複数キャラクタ+ライティング+Shadow map あり。
画面サイズが違うので単純には比較できませんが、秒間のピクセル数に
変換しても Mali-400MP には及びませんでした。
ただし Adreno は mobile GPU の中でも描画機能が非常に充実しており
ピクセルの演算精度も高くなっています。
第二世代の Adreno 205 (Snapdragon MSM8255 1GHz) 比では 2倍以上高速
なので十分良い数値と言えます。
以下は分岐を伴う、より複雑なライティングのシェーダーでのテスト。
Mali-400MP 800×480 : 19.6fps (7.2Mpix/sec) Adreno 220 960×540 : 13.7fps (6.8Mpix/sec)
下記ページにも追加しています。
・OpenGL ES 2.0 Mobile GPU 比較
・Mobile GPU Extension
関連エントリ
・OpenGL ES 2.0 shader の演算精度
・Android Galaxy S2 ARM Mali-400 MP は速い (2)
2012/08/12
OpenGL 4.3 と GL_ARB_ES3_compatibility
NVIDIA の beta driver 305.53 で OpenGL 4.3 を試してみました。
以下は GL_ARB_ES3_compatibility を走らせた結果です。
すでに ETC2/EAC が利用可能となっていることがわかります。
ちなみに 305.53 の OpenGL 4.3 でも ETC2/EAC は有効です。
ETC2 は ETC1 と上位互換なので、Desktop GPU でも ETC1 による描画が
可能となります。
ETC1 は 4x2 pixel あたり 1色しか使えませんでしたが、
ETC2 では DXT 同様 4x4 で 2色使えるよう拡張されています。
単純なグラデーション限定ですが独立した 3色の指定も可能です。
EAC との組み合わせでほぼ DXT1/DXT5/3DC の代用が可能なので、
今後は共通の圧縮テクスチャフォーマットとして ETC2 が使われて
いくのかも知れません。
より詳細な extension はこちらに追記しました。
・Mobile GPU の OpenGL Extension
・Desktop GPU の OpenGL Extension
GLSL の version は、OpenGL と OpenGL ES で見事に重ならないように
なっています。
OpenGL ES 3.0 Emulator も出ています。
・Mali Developer Center: OpenGL ES 3.0 Emulator
・QDevNet : Mobile Gaming & Graphics Optimization (Adreno™)
Adreno は ETC2 がありませんでした。
以下は GL_ARB_ES3_compatibility を走らせた結果です。
すでに ETC2/EAC が利用可能となっていることがわかります。
GL_VERSION: OpenGL ES 3.0 305.53 GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00 TextureFormat 23 tc[00]=83f0 GL_COMPRESSED_RGB_S3TC_DXT1_EXT tc[01]=83f2 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT tc[02]=83f3 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT tc[03]=8b90 GL_PALETTE4_RGB8 tc[04]=8b91 GL_PALETTE4_RGBA8 tc[05]=8b92 GL_PALETTE4_R5_G6_B5 tc[06]=8b93 GL_PALETTE4_RGBA4 tc[07]=8b94 GL_PALETTE4_RGB5_A1 tc[08]=8b95 GL_PALETTE8_RGB8 tc[09]=8b96 GL_PALETTE8_RGBA8 tc[10]=8b97 GL_PALETTE8_R5_G6_B5 tc[11]=8b98 GL_PALETTE8_RGBA4 tc[12]=8b99 GL_PALETTE8_RGB5_A1 tc[13]=9274 GL_COMPRESSED_RGB8_ETC2 tc[14]=9275 GL_COMPRESSED_SRGB8_ETC2 tc[15]=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[16]=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[17]=9278 GL_COMPRESSED_RGBA8_ETC2_EAC tc[18]=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC tc[19]=9270 GL_COMPRESSED_R11_EAC tc[20]=9271 GL_COMPRESSED_SIGNED_R11_EAC tc[21]=9272 GL_COMPRESSED_RG11_EAC tc[22]=9273 GL_COMPRESSED_SIGNED_RG11_EAC
ちなみに 305.53 の OpenGL 4.3 でも ETC2/EAC は有効です。
GL_VERSION: 4.3.0 GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 4.30 NVIDIA via Cg compiler pconst=2048 vconst=4096 vin=16 vout=124 ptex=32 vtex=32 combotex=192 maxrender=16384 maxtexsize=16384 cubetexsize=16384 viewdims=16384 blocks ver=14 frag=14 blocksize=65536 combined=84 geometry const=2048 tex=32 block=14 out=1024 outT=1024 comb=231424 tess ctrl const=2048 tex=32 block=14 out=128 outT=4216 in=128 comb=231424 tess eval const=2048 tex=32 block=14 out=128 patch=120 in=128 comb=231424 TextureFormat 23 tc[00]=83f0 GL_COMPRESSED_RGB_S3TC_DXT1_EXT tc[01]=83f2 GL_COMPRESSED_RGBA_S3TC_DXT3_EXT tc[02]=83f3 GL_COMPRESSED_RGBA_S3TC_DXT5_EXT tc[03]=8b90 GL_PALETTE4_RGB8 tc[04]=8b91 GL_PALETTE4_RGBA8 tc[05]=8b92 GL_PALETTE4_R5_G6_B5 tc[06]=8b93 GL_PALETTE4_RGBA4 tc[07]=8b94 GL_PALETTE4_RGB5_A1 tc[08]=8b95 GL_PALETTE8_RGB8 tc[09]=8b96 GL_PALETTE8_RGBA8 tc[10]=8b97 GL_PALETTE8_R5_G6_B5 tc[11]=8b98 GL_PALETTE8_RGBA4 tc[12]=8b99 GL_PALETTE8_RGB5_A1 tc[13]=9274 GL_COMPRESSED_RGB8_ETC2 tc[14]=9275 GL_COMPRESSED_SRGB8_ETC2 tc[15]=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[16]=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[17]=9278 GL_COMPRESSED_RGBA8_ETC2_EAC tc[18]=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC tc[19]=9270 GL_COMPRESSED_R11_EAC tc[20]=9271 GL_COMPRESSED_SIGNED_R11_EAC tc[21]=9272 GL_COMPRESSED_RG11_EAC tc[22]=9273 GL_COMPRESSED_SIGNED_RG11_EAC
ETC2 は ETC1 と上位互換なので、Desktop GPU でも ETC1 による描画が
可能となります。
ETC1 は 4x2 pixel あたり 1色しか使えませんでしたが、
ETC2 では DXT 同様 4x4 で 2色使えるよう拡張されています。
単純なグラデーション限定ですが独立した 3色の指定も可能です。
EAC との組み合わせでほぼ DXT1/DXT5/3DC の代用が可能なので、
今後は共通の圧縮テクスチャフォーマットとして ETC2 が使われて
いくのかも知れません。
より詳細な extension はこちらに追記しました。
・Mobile GPU の OpenGL Extension
・Desktop GPU の OpenGL Extension
GLSL の version は、OpenGL と OpenGL ES で見事に重ならないように
なっています。
OpenGL ES 2.0 GLSL ES 1.0 #version 100 (GLSL 1.1+) OpenGL 2.0 GLSL 1.1 #version 110 OpenGL 2.1 GLSL 1.2 #version 120 OpenGL 3.0 GLSL 1.3 #version 130 OpenGL 3.1 GLSL 1.4 #version 140 OpenGL 3.2 GLSL 1.5 #version 150 OpenGL ES 3.0 GLSL ES 3.0 #version 300 es (GLSL 3.3-) OpenGL 3.3 GLSL 3.3 #version 330 OpenGL 4.0 GLSL 4.0 #version 400 OpenGL 4.1 GLSL 4.1 #version 410 OpenGL 4.2 GLSL 4.2 #version 420 OpenGL 4.3 GLSL 4.3 #version 430
OpenGL ES 3.0 Emulator も出ています。
・Mali Developer Center: OpenGL ES 3.0 Emulator
・QDevNet : Mobile Gaming & Graphics Optimization (Adreno™)
GL_VERSION: OpenGL ES 3.0 GL_RENDERER: OpenGL ES Emulator Revision r2p0-00rel0 GL_VENDOR: ARM Ltd. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00 pconst=512 vconst=1024 vin=16 vout=31 ptex=32 vtex=32 combotex=192 maxrender=16384 maxtexsize=16384 cubetexsize=16384 viewdims=16384 TextureFormat 10 tc[00]=9270 GL_COMPRESSED_R11_EAC tc[01]=9272 GL_COMPRESSED_RG11_EAC tc[02]=9274 GL_COMPRESSED_RGB8_ETC2 tc[03]=9276 GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[04]=9278 GL_COMPRESSED_RGBA8_ETC2_EAC tc[05]=9271 GL_COMPRESSED_SIGNED_R11_EAC tc[06]=9273 GL_COMPRESSED_SIGNED_RG11_EAC tc[07]=9279 GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC tc[08]=9277 GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 tc[09]=9275 GL_COMPRESSED_SRGB8_ETC2
Adreno は ETC2 がありませんでした。
GL_VERSION: OpenGL ES 3.0 Confetti Special Effects Build 01 GL_RENDERER: Qualcomm OpenGL ES 3.0 Emulator GL_VENDOR: Qualcomm GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL 3.00 pconst=224 vconst=256 vin=15 vout=8 ptex=8 vtex=1 combotex=9 maxrender=2048 maxtexsize=1024 cubetexsize=1024 viewdims=2048 TextureFormat 16 tc[00]=8c92 GL_ATC_RGB_AMD tc[01]=8c93 GL_ATC_RGBA_EXPLICIT_ALPHA_AMD tc[02]=87ee GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD tc[03]=87f9 GL_3DC_X_AMD tc[04]=87fa GL_3DC_XY_AMD tc[05]=8d64 GL_ETC1_RGB8_OES tc[06]=8b90 GL_PALETTE4_RGB8 tc[07]=8b91 GL_PALETTE4_RGBA8 tc[08]=8b92 GL_PALETTE4_R5_G6_B5 tc[09]=8b93 GL_PALETTE4_RGBA4 tc[10]=8b94 GL_PALETTE4_RGB5_A1 tc[11]=8b95 GL_PALETTE8_RGB8 tc[12]=8b96 GL_PALETTE8_RGBA8 tc[13]=8b97 GL_PALETTE8_R5_G6_B5 tc[14]=8b98 GL_PALETTE8_RGBA4 tc[15]=8b99 GL_PALETTE8_RGB5_A1
2009/09/14
OpenGL や GLSL の互換性
Direct3D の HLSL コンパイラは Microsoft が用意しており、共通のバイトコードを
生成しています。
実行時はさらにドライバが GPU 毎のネイティブコードに最適化&変換を行っています。
一見二度手間ですが、最初の最適化は共通バイトコードへの変換時に済んでいます。
時間のかかる巨大なシェーダーでも事前に変換しておくことが可能だし、コンパイラ部の
最適化の恩恵はすべての GPU で受けられます。
ドライバも共通コードからの変換だけ行えばよいので、互換性も比較的維持しやすいのでは
ないかと考えられます。
その代わり一度バイナリにしてしまうと、コンパイルした時点のコンパイラの能力である程度
固定されます。あとからコンパイラが強化される可能性もあるし、GPU が ShaderModel 5.0
対応になっても、3.0 向けにコンパイルしたシェーダーで能力を出し切れるとは限りません。
OpenGL の GLSL の場合 API が受け取るのは生のソースコードです。
コンパイルそのものが GPU ドライバの役目となっていて、中間の共通コードがありません。
動的にコンパイルするメリットは常にハードに最適なプロファイルを選べることです。
逆にデメリットとしては、コンパイル時間がかかるのではないかとの懸念もありますが
もっと別の問題もあるようです。
今まで GeForce で組み立ててきたコードを RADEON で走らせてみました。
環境は下記の通り。
● Version 指定
RADEON の GLSL では「#version」はソースコードの先頭にないとエラーになります。
・#version の前にプリプロセッサ命令があるだけでもだめ。
・glShaderSource() に複数のソースコードを渡している場合、最初のコードの先頭でないとだめ。2番目以降のソースコードには記述できない。
この挙動は OpenGLES 2.0 の GLSL と同じです。また GLSLangSpec.Full.1.40.05.pdf
を見ても、#version の前に許されるのはコメントとホワイトスぺースのみと記載されています。
こちらの動作の方が正解でした。
ただプリプロセッサ命令も許されていないので、複数のターゲット間で互換性ととる場合に
version 指定を分岐できないのは不便です。C 言語側の Shader Loader 部分に手を加えて、
独自のプリプロセッサを追加するなどの対策が必要かもしれません。
● precision 指定
OpenGL ES の GLSL から取り入れた仕様として precision 指定があります。
宣言時に変数が必要とする精度のヒントを与えます。
highp, middlep, lowp の 3段階ありますが
・GeForce は in/out 宣言の前に必要
・RADEON は in/out 宣言の後ろ書かないとエラー
RADEON の場合必ず何らかの精度指定が必須で、個別指定かまたはデフォルトの
precision 行が必要です。GeForce は無くても通ります。
とりあえず最初にデフォルト宣言をしておけばどちらでも通ります。
細かく個別に宣言をしている場合は注意。
ドキュメントを見る限り RADEON の方が正しいようです。
全体的に GeForce の方が判定が緩く RADEON の方が厳密になっています。
GPU のドライバ毎にコンパイラの仕様が異なっている可能性を考えると、
Direct3D + HLSL のように共通化されている方が楽だと思います。
慣れるまではこれらの互換性の維持に苦労しそうです。
●OpenGL 3.1
現段階で OpenGL 3.2/GLSL 1.5 に対応しているのは GeForce 190.57 だけです。
RADEON で試すにあたって OpenGL 3.1/GLSL 1.4 で動作するように修正しました。
GeForce の場合、最初に wglCreateContext() で作った Context がすでに
OpenGL 3.x に対応していました。
wglCreateContextAttribsARB() で作り直さなくても動作します。
RADEON の場合 OpenGL 2.1 だったので、wglCreateContextAttribsARB() が必要です。
でもシェーダーバージョンは同じ。
● Extension の判定
GeForce 190.57 を Version 3.1 で作り直した場合のはまりです。
Extension の判定で glGetString( GL_EXTENSIONS ) を参照していましたが、
Context を作り直すとエラーになります。
ドキュメントをよく見ると glGetString( GL_EXTENSIONS ) は古い仕様で、
OpenGL 3.x の場合は
を用いるのが正しいやり方のようです。
WGL_CONTEXT_FLAGS_ARB を 0 にしても
WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB がセットされてしまうことが
原因のようです。
190.62 では WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB を指定しない限り
大丈夫でした。
互換性周りはまだ慣れてないせいか、または出来るだけ共通で動かそうと欲張っている
せいか苦労しています。
Direct3D の場合問題になる互換性はハードウエア能力の差でした。
その後 Direct3D 10 では完全に足並みが揃って、GeForce も RADEON もほとんど
区別せずに同じシェーダーが動くようになっています。
OpenGL ではハードウエア能力の違いよりも、まだまだドライバの差が表面化している感じです。
API 仕様が決まっても、安定するまでしばらく時間がかかるのかもしれません。
関連エントリ
・OpenGL の同期と描画速度の測定
・OpenGL のはじめ方 (2) wgl
・OpenGL 3.2 GeometryShader をもう少し使ってみる
・OpenGL GLSL のバージョン
・OpenGL 3.2 の GeometryShader
・OpenGL のはじめ方
生成しています。
実行時はさらにドライバが GPU 毎のネイティブコードに最適化&変換を行っています。
一見二度手間ですが、最初の最適化は共通バイトコードへの変換時に済んでいます。
時間のかかる巨大なシェーダーでも事前に変換しておくことが可能だし、コンパイラ部の
最適化の恩恵はすべての GPU で受けられます。
ドライバも共通コードからの変換だけ行えばよいので、互換性も比較的維持しやすいのでは
ないかと考えられます。
その代わり一度バイナリにしてしまうと、コンパイルした時点のコンパイラの能力である程度
固定されます。あとからコンパイラが強化される可能性もあるし、GPU が ShaderModel 5.0
対応になっても、3.0 向けにコンパイルしたシェーダーで能力を出し切れるとは限りません。
OpenGL の GLSL の場合 API が受け取るのは生のソースコードです。
コンパイルそのものが GPU ドライバの役目となっていて、中間の共通コードがありません。
動的にコンパイルするメリットは常にハードに最適なプロファイルを選べることです。
逆にデメリットとしては、コンパイル時間がかかるのではないかとの懸念もありますが
もっと別の問題もあるようです。
今まで GeForce で組み立ててきたコードを RADEON で走らせてみました。
環境は下記の通り。
GeForce 9800GT 190.62 (GL 3.1 GLSL 1.4) WHQL GeForce GTX280 190.57 (GL 3.2 GLSL 1.5) RADEON HD 4760 Catalyst 9.9 (GL 3.1 GLSL 1.4)
● Version 指定
RADEON の GLSL では「#version」はソースコードの先頭にないとエラーになります。
・#version の前にプリプロセッサ命令があるだけでもだめ。
・glShaderSource() に複数のソースコードを渡している場合、最初のコードの先頭でないとだめ。2番目以降のソースコードには記述できない。
この挙動は OpenGLES 2.0 の GLSL と同じです。また GLSLangSpec.Full.1.40.05.pdf
を見ても、#version の前に許されるのはコメントとホワイトスぺースのみと記載されています。
こちらの動作の方が正解でした。
ただプリプロセッサ命令も許されていないので、複数のターゲット間で互換性ととる場合に
version 指定を分岐できないのは不便です。C 言語側の Shader Loader 部分に手を加えて、
独自のプリプロセッサを追加するなどの対策が必要かもしれません。
● precision 指定
OpenGL ES の GLSL から取り入れた仕様として precision 指定があります。
宣言時に変数が必要とする精度のヒントを与えます。
highp, middlep, lowp の 3段階ありますが
・GeForce は in/out 宣言の前に必要
・RADEON は in/out 宣言の後ろ書かないとエラー
RADEON の場合必ず何らかの精度指定が必須で、個別指定かまたはデフォルトの
precision 行が必要です。GeForce は無くても通ります。
とりあえず最初にデフォルト宣言をしておけばどちらでも通ります。
細かく個別に宣言をしている場合は注意。
precision highp float;
ドキュメントを見る限り RADEON の方が正しいようです。
全体的に GeForce の方が判定が緩く RADEON の方が厳密になっています。
GPU のドライバ毎にコンパイラの仕様が異なっている可能性を考えると、
Direct3D + HLSL のように共通化されている方が楽だと思います。
慣れるまではこれらの互換性の維持に苦労しそうです。
●OpenGL 3.1
現段階で OpenGL 3.2/GLSL 1.5 に対応しているのは GeForce 190.57 だけです。
RADEON で試すにあたって OpenGL 3.1/GLSL 1.4 で動作するように修正しました。
GeForce の場合、最初に wglCreateContext() で作った Context がすでに
OpenGL 3.x に対応していました。
wglCreateContextAttribsARB() で作り直さなくても動作します。
RADEON の場合 OpenGL 2.1 だったので、wglCreateContextAttribsARB() が必要です。
でもシェーダーバージョンは同じ。
// GeForce 190.57 // wglCreateContext() GL VERSION: 3.2.0 GL RENDERER: GeForce GTX 280/PCI/SSE2 GL VENDOR: NVIDIA Corporation GL SHADING_LANGUAGE_VERSION: 1.50 NVIDIA via Cg compiler ↓ // wglCreateContextAttribsARB() GL VERSION: 3.1.0 GL RENDERER: GeForce GTX 280/PCI/SSE2 GL VENDOR: NVIDIA Corporation GL SHADING_LANGUAGE_VERSION: 1.40 NVIDIA via Cg compiler // GeForce 190.62 // wglCreateContext() GL_VERSION: 3.1.0 GL_RENDERER: GeForce 9800 GT/PCI/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 1.40 NVIDIA via Cg compiler ↓ // wglCreateContextAttribsARB() GL_VERSION: 3.1.0 GL_RENDERER: GeForce 9800 GT/PCI/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 1.40 NVIDIA via Cg compiler
// RADEON 9.9 // wglCreateContext() GL_VERSION: 2.1.8918 GL_RENDERER: ATI Radeon HD 4600 Series GL_VENDOR: ATI Technologies Inc. GL_SHADING_LANGUAGE_VERSION: 1.40 ↓ // wglCreateContextAttribsARB() GL_VERSION: 3.1.8918 GL_RENDERER: ATI Radeon HD 4600 Series GL_VENDOR: ATI Technologies Inc. GL_SHADING_LANGUAGE_VERSION: 1.40
● Extension の判定
GeForce 190.57 を Version 3.1 で作り直した場合のはまりです。
Extension の判定で glGetString( GL_EXTENSIONS ) を参照していましたが、
Context を作り直すとエラーになります。
ドキュメントをよく見ると glGetString( GL_EXTENSIONS ) は古い仕様で、
OpenGL 3.x の場合は
glGetIntegerv( GL_NUM_EXTENSIONS, .. ) glGetStringi( GL_EXTENSIONS, .. )
を用いるのが正しいやり方のようです。
WGL_CONTEXT_FLAGS_ARB を 0 にしても
WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB がセットされてしまうことが
原因のようです。
190.62 では WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB を指定しない限り
大丈夫でした。
互換性周りはまだ慣れてないせいか、または出来るだけ共通で動かそうと欲張っている
せいか苦労しています。
Direct3D の場合問題になる互換性はハードウエア能力の差でした。
その後 Direct3D 10 では完全に足並みが揃って、GeForce も RADEON もほとんど
区別せずに同じシェーダーが動くようになっています。
OpenGL ではハードウエア能力の違いよりも、まだまだドライバの差が表面化している感じです。
API 仕様が決まっても、安定するまでしばらく時間がかかるのかもしれません。
関連エントリ
・OpenGL の同期と描画速度の測定
・OpenGL のはじめ方 (2) wgl
・OpenGL 3.2 GeometryShader をもう少し使ってみる
・OpenGL GLSL のバージョン
・OpenGL 3.2 の GeometryShader
・OpenGL のはじめ方
2014/02/08
Linux 他 X11 で OpenGL 4 を使う
X11 (X window) では Platform Interface に GLX を用います。
Display が本当に意味を持つのは X11 ならではで、egl の API 仕様も
X window のプログラムを見ると納得です。
(1) pixel format の選択
サーバーが対応しているピクセルフォーマットから必要なものを選択しています。
フォーマットの組み合わせは GPU やドライバによって異なります。
X native の API にも似たような仕組みとして XVisualInfo があります。
GLXFBConfig は GLX による拡張で、XVisualInfo* の代わりに用いることが可能です。
Windows でも Win32 API に PIXELFORMATDESCRIPTOR (ChoosePixelFormat())
がありました。WGL Extension の WGL_ARB_pixel_format
(wglChoosePixelFormatARB()) はこれを置き換えるもので、
XVisualInfo と GLXFBConfig との関係に似ています。
もし XCreateColormap などで Visual (XVisualInfo) が必要になったら
下記のように取得すれば OK です。
上の visual_info は config_array 同様 XFree() が必要です。
egl のような wrapper を作る場合、メモリ管理を伴うのは少々都合が悪い
場合があります。
GLXFBConfig をそのまま保持せずに、ID に紐付けておくと管理が楽になります。
この fb_config_id があれば GLXConfig が一意に定まるわけです。
fb_config_id から GLXFBConfig を取り出す方法は下記の通り。
XVisualInfo を得る方法はすでに述べた通りですが、GLXFBConfig から
直接 VisualID を求めることもできます。
(2) Context の作成
任意の Version の OpenGL Context を作成するには GLX_ARB_create_context
( glXCreateContextAttribsARB() ) が必要です。
試した下記の環境ではデフォルトで OpenGL 4.3 が選択されていたので、
場合によっては使わなくても問題ないかもしれません。
・Ubuntu 13.10 desktop x86_64
・GeForce GTX650
・NVIDIA binary Xorg driver 319
Core Profile のみ、OpenGL ES 2.0 互換 Profile の指定など、細かい設定を
行うならやはり glXCreateContextAttribsARB() が必要です。
他にも glX extension を利用する場合が考えられるので、
API の取得はまとめて管理した方が良いでしょう。
glX extension だけでなく、GL 4.x の各命令でも API の取得が必要になります。
4番目の True は Direct Rendering の指定です。
本来の X protocol はネットワーク透過なのでアプリケーションからドライバに
直接アクセスできませんが、ローカルサーバー利用時は条件によって可能になります。
現在の context が Direct Rendering 可能な状態 (DRI) かどうかは
glXIsDirect() で確認することができます。
・GL_ARB_create_context
(3) Window の作成
GLXFBConfig が決まった時点で Window を作れるので (2) との順番は任意。
(4) MakeCurrent
Window は GLXDrawable です。
これでレンダリングできますが、OpenGL 2 以降の API を用いるには
個別に glXGetProcAddress() して関数を用意する必要があります。
(5) OpenGL API の取得
ゼロから始めるとここが一番手間かもしれません。
ただしこの流れは Windows で OpenGL を用いる場合と完全に同一です。
API 名 Table の作成、API の取り出しコードは Windows と共有することができます。
・OpenGL のはじめ方 (Windows)
下記は API Table の例です。
OpenGL 4.x の glcorearb.h からスクリプトで自動変換して生成しています。
この方法だと、新しい API や extension 対応ドライバがリリースされたら
即座に対応することができます。
Platform Interface のまとめ
Windows/Linux X11 は GetProcAddress() が必要ですが対応ドライバがあれば
新しい API をすぐ使えます。
OSX はそのまま OpenGL を使えて手間いらずですが 10.9 は OpenGL 4.1 まで。
OSX + XQuartz (HD4000) は残念ながら 2.1 でした。
Nexus 7 (2012) + Ubuntu desktop のように OpenGL ES 2.0 対応 GPU の
Linux では GLX ではなく X11 上で EGL + OpenGL ES 2.0 API が使えます。
Raspberry Pi や 旧 NetWalker のように、X が動いても OpenGL 未対応の場合
フレームバッファに直接レンダリングすることになります。
この場合も EGL なので、Window の有無にかかわらず利用できる EGL は互換性が
取りやすくなっています。
関連エントリ
・Mac OS X 10.9 Mavericks の OpenGL 4.1 対応と Windows 8.1 Intel HD 4000 Driver
・Mac OS X で OpenGL の描画 (Xcode5/retina)
・Nexus 7 (2012) Ubuntu desktop 上での開発とバッテリー設定
・NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (3)
・OpenGL のはじめ方
Display が本当に意味を持つのは X11 ならではで、egl の API 仕様も
X window のプログラムを見ると納得です。
Display* display= NULL; int screen= 0; display= XOpenDisplay( NULL ); screen= DefaultScreen( display );
(1) pixel format の選択
static int attrib_list[]= { GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, GLX_DOUBLEBUFFER, True, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, None }; int n_items= 0; GLXFBConfig* config_array= glXChooseFBConfig( display, screen, attrib_list, &n_items ); 〜 if( n_items ){ GLXFBConfig fb_config= config_array[0]; 〜 } XFree( config_array );
サーバーが対応しているピクセルフォーマットから必要なものを選択しています。
フォーマットの組み合わせは GPU やドライバによって異なります。
X native の API にも似たような仕組みとして XVisualInfo があります。
GLXFBConfig は GLX による拡張で、XVisualInfo* の代わりに用いることが可能です。
Windows でも Win32 API に PIXELFORMATDESCRIPTOR (ChoosePixelFormat())
がありました。WGL Extension の WGL_ARB_pixel_format
(wglChoosePixelFormatARB()) はこれを置き換えるもので、
XVisualInfo と GLXFBConfig との関係に似ています。
もし XCreateColormap などで Visual (XVisualInfo) が必要になったら
下記のように取得すれば OK です。
// GLXFBConfig -> XVisualInfo XVisualInfo* visual_info= glXGetVisualFromFBConfig( display, fb_config ); 〜 XFree( visual_info );
上の visual_info は config_array 同様 XFree() が必要です。
egl のような wrapper を作る場合、メモリ管理を伴うのは少々都合が悪い
場合があります。
GLXFBConfig をそのまま保持せずに、ID に紐付けておくと管理が楽になります。
// GLXFBConfig -> fb_config_id int fb_config_id= 0; glXGetFBConfigAttrib( display, fb_config, GLX_FBCONFIG_ID, &fb_config_id );
この fb_config_id があれば GLXConfig が一意に定まるわけです。
fb_config_id から GLXFBConfig を取り出す方法は下記の通り。
// fb_config_id -> GLXFBConfig int attr_list[]= { GLX_FBCONFIG_ID, fb_config_id, None }; int n_items= 0; GLXFBConfig* fb_config_ptr= glXChooseFBConfig( display, screen, attr_list, &n_items ); assert( n_items == 1 ); GLXFBConfig fb_config= fb_config_ptr[0]; 〜 XFree( fb_config_ptr );
XVisualInfo を得る方法はすでに述べた通りですが、GLXFBConfig から
直接 VisualID を求めることもできます。
// GLXFBConfig -> VisualID int visual_id= 0; glXGetFBConfigAttrib( display, config_array[0], GLX_VISUAL_ID, &visual_id );
(2) Context の作成
任意の Version の OpenGL Context を作成するには GLX_ARB_create_context
( glXCreateContextAttribsARB() ) が必要です。
試した下記の環境ではデフォルトで OpenGL 4.3 が選択されていたので、
場合によっては使わなくても問題ないかもしれません。
・Ubuntu 13.10 desktop x86_64
・GeForce GTX650
・NVIDIA binary Xorg driver 319
Core Profile のみ、OpenGL ES 2.0 互換 Profile の指定など、細かい設定を
行うならやはり glXCreateContextAttribsARB() が必要です。
// Extension API glXCreateContextAttribsARB() の取り出し
PFNGLXCREATECONTEXTATTRIBSARBPROC f_glXCreateContextAttribsARB=
(PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress(
(const GLubyte*)"glXCreateContextAttribsARB" );
// OpenGL 4.3 context 作成
static int att_command[]= {
GLX_CONTEXT_MAJOR_VERSION_ARB, 4,
GLX_CONTEXT_MINOR_VERSION_ARB, 3,
GLX_CONTEXT_FLAGS_ARB, 0,
GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB,
None
};
GLXContext context= f_glXCreateContextAttribsARB( display, fb_config, 0, True, att_command );
他にも glX extension を利用する場合が考えられるので、
API の取得はまとめて管理した方が良いでしょう。
glX extension だけでなく、GL 4.x の各命令でも API の取得が必要になります。
4番目の True は Direct Rendering の指定です。
本来の X protocol はネットワーク透過なのでアプリケーションからドライバに
直接アクセスできませんが、ローカルサーバー利用時は条件によって可能になります。
現在の context が Direct Rendering 可能な状態 (DRI) かどうかは
glXIsDirect() で確認することができます。
・GL_ARB_create_context
(3) Window の作成
GLXFBConfig が決まった時点で Window を作れるので (2) との順番は任意。
XVisualInfo* visual_info= glXGetVisualFromFBConfig( display, fb_config ); Window root= RootWindow( NativeDisplay, screen ); XSetWindowAttributes attr; attr.background_pixel= 0; attr.border_pixel= 0; attr.colormap= XCreateColormap( display, root, visual_info->visual, AllocNone ); attr.event_mask= 0 |StructureNotifyMask |ExposureMask |KeyPressMask |KeyReleaseMask |ButtonPressMask |ButtonReleaseMask ; Window win= XCreateWindow( display, root, x, y, width, height, 0, // border visual_info->depth, InputOutput, visual_info->visual, CWBorderPixel|CWColormap|CWEventMask, &attr ); XFree( visual_info ); visual_info= NULL; XMapWindow( display, win ); XFlush( display );
(4) MakeCurrent
glXMakeCurrent( display, win, context );
Window は GLXDrawable です。
これでレンダリングできますが、OpenGL 2 以降の API を用いるには
個別に glXGetProcAddress() して関数を用意する必要があります。
(5) OpenGL API の取得
ゼロから始めるとここが一番手間かもしれません。
ただしこの流れは Windows で OpenGL を用いる場合と完全に同一です。
API 名 Table の作成、API の取り出しコードは Windows と共有することができます。
・OpenGL のはじめ方 (Windows)
下記は API Table の例です。
OpenGL 4.x の glcorearb.h からスクリプトで自動変換して生成しています。
この方法だと、新しい API や extension 対応ドライバがリリースされたら
即座に対応することができます。
// flatlib3 GL_HeaderParser.py // linux/GLFunction_GL4.inc void (APIENTRY *p_glBlendColor)( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); void (APIENTRY *p_glBlendEquation)( GLenum mode ); void (APIENTRY *p_glDrawRangeElements)( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices ); 〜 void (APIENTRY *p_glTexPageCommitmentARB)( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident ); // total=525 ImportListType ImportList_GL4[]= { { "glBlendColor", (void*)&p_glBlendColor }, { "glBlendEquation", (void*)&p_glBlendEquation }, { "glDrawRangeElements", (void*)&p_glDrawRangeElements }, { "glTexImage3D", (void*)&p_glTexImage3D }, { "glTexSubImage3D", (void*)&p_glTexSubImage3D }, 〜 { "glGetNamedStringARB", (void*)&p_glGetNamedStringARB }, { "glGetNamedStringivARB", (void*)&p_glGetNamedStringivARB }, { "glTexPageCommitmentARB", (void*)&p_glTexPageCommitmentARB }, { NULL, NULL } }; // total=525
// flatlib3 GL_HeaderParser.py // linux/GLFunction_GL4.h extern void (APIENTRY *p_glBlendColor)( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); inline void glBlendColor( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ) { FL_GLAPI_ASSERT( p_glBlendColor ); return p_glBlendColor( red, green, blue, alpha ); } extern void (APIENTRY *p_glBlendEquation)( GLenum mode ); inline void glBlendEquation( GLenum mode ) { FL_GLAPI_ASSERT( p_glBlendEquation ); return p_glBlendEquation( mode ); } extern void (APIENTRY *p_glDrawRangeElements)( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices ); inline void glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices ) { FL_GLAPI_ASSERT( p_glDrawRangeElements ); return p_glDrawRangeElements( mode, start, end, count, type, indices ); } 〜
Platform Interface のまとめ
Windows WGL GL4.x wglGetProcAddress() Linux X11 GLX GL4.x glXGetProcAddress() OSX NSOpenGL GL4.1 OSX + X11 GLX GL2.1 (XQuartz + HD4000) Linux X11 + ES EGL ES2/3 Android EGL ES2/3 iOS GLK/EAGL ES2/3
Windows/Linux X11 は GetProcAddress() が必要ですが対応ドライバがあれば
新しい API をすぐ使えます。
OSX はそのまま OpenGL を使えて手間いらずですが 10.9 は OpenGL 4.1 まで。
OSX + XQuartz (HD4000) は残念ながら 2.1 でした。
Nexus 7 (2012) + Ubuntu desktop のように OpenGL ES 2.0 対応 GPU の
Linux では GLX ではなく X11 上で EGL + OpenGL ES 2.0 API が使えます。
Raspberry Pi や 旧 NetWalker のように、X が動いても OpenGL 未対応の場合
フレームバッファに直接レンダリングすることになります。
この場合も EGL なので、Window の有無にかかわらず利用できる EGL は互換性が
取りやすくなっています。
関連エントリ
・Mac OS X 10.9 Mavericks の OpenGL 4.1 対応と Windows 8.1 Intel HD 4000 Driver
・Mac OS X で OpenGL の描画 (Xcode5/retina)
・Nexus 7 (2012) Ubuntu desktop 上での開発とバッテリー設定
・NetWalker PC-Z1 i.MX515 OpenGL ES 2.0 (3)
・OpenGL のはじめ方
2014/07/08
Android Wear LG G Watch の GPU (スペック)
LG G Watch を入手したので CPU/GPU を調べてみました。
プロセッサは Snapdragon 400 MSM8226、1.2GHz で 4 core あります。
GPU は Adreno 305。
Low End ですが 300番台なので OpenGL ES 3.0 に対応しています。
SmartQ ZWatch は Single Core かつ 3D GPU も無かったので、
比較すると LG G Watch がかなり高性能に見えます。
RAM 容量以外はおそらく低価格帯のスマートフォンと同等でしょう。
2014/07/11修正 (実測結果)
・Smart Watch スペック一覧
その代わり Z Watch のような Wi-Fi やヘッドホン端子は無く、単独での利用は考えられていません。
通信は Bluetooth だけ。ペアリングした親機 (Android 端末) が必要です。
Android Wear では adb も親機を介した bluetooth 経由で接続できるようになっています。
付属の充電クレードルを使えば、今までどおりの USB 接続もできるようです。
下記のページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
・SmartWatch スペック一覧
2014/07/11訂正: 実測結果より cpu0 しか使われておらず実質 single core 700MHz 相当でした(詳細はこちら)
関連エントリ
・Android SmartWatch ZWatch で 3Dゲーム (ChiRaKS)
・Android SmartWatch スマートウオッチのスペック比較表
・Android SmartWatch SmartQ ZWatch (4) アプリの管理
・Android SmartWatch SmartQ ZWatch (3) 腕に関数電卓
・Android SmartWatch SmartQ ZWatch (2)
・Android 4.1 SmartWatch SmartQ Z Watch
プロセッサは Snapdragon 400 MSM8226、1.2GHz で 4 core あります。
GPU は Adreno 305。
Low End ですが 300番台なので OpenGL ES 3.0 に対応しています。
SmartQ ZWatch は Single Core かつ 3D GPU も無かったので、
比較すると LG G Watch がかなり高性能に見えます。
2014/07/11修正 (実測結果)
・Smart Watch スペック一覧
その代わり Z Watch のような Wi-Fi やヘッドホン端子は無く、単独での利用は考えられていません。
通信は Bluetooth だけ。ペアリングした親機 (Android 端末) が必要です。
Android Wear では adb も親機を介した bluetooth 経由で接続できるようになっています。
付属の充電クレードルを使えば、今までどおりの USB 接続もできるようです。
LG G Watch Android 4.4W
Qualcomm Snapdragon 400 MSM8226
Cortex-A7 1.2GHz Quad core, Adreno 305
RAM 512MB
-------------------
CPU
-------------------
processor : 0
model name : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 3
processor : 1
model name : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 3
processor : 2
model name : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 3
processor : 3
model name : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 3
Hardware : Qualcomm MSM 8226 DORY (Flattened Device Tree)
Revision : 0007
Serial : 0000000000000000
-------------------
GPU
-------------------
GL_VERSION: OpenGL ES 3.0 V@84.0 AU@ (CL@)
GL_RENDERER: Adreno (TM) 305
GL_VENDOR: Qualcomm
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
Extension:
GL_AMD_compressed_ATC_texture
GL_AMD_performance_monitor
GL_AMD_program_binary_Z400
GL_EXT_debug_label
GL_EXT_debug_marker
GL_EXT_discard_framebuffer
GL_EXT_robustness
GL_EXT_texture_format_BGRA8888
GL_EXT_texture_type_2_10_10_10_REV
GL_NV_fence
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_depth_texture
GL_OES_depth24
GL_OES_EGL_image
GL_OES_EGL_sync
GL_OES_EGL_image_external
GL_OES_element_index_uint
GL_OES_fbo_render_mipmap
GL_OES_fragment_precision_high
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_depth_texture_cube_map
GL_OES_rgb8_rgba8
GL_OES_standard_derivatives
GL_OES_texture_3D
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_texture_half_float_linear
GL_OES_texture_npot
GL_OES_vertex_half_float
GL_OES_vertex_type_10_10_10_2
GL_OES_vertex_array_object
GL_QCOM_alpha_test
GL_QCOM_binning_control
GL_QCOM_driver_control
GL_QCOM_perfmon_global_mode
GL_QCOM_extended_get
GL_QCOM_extended_get2
GL_QCOM_tiled_rendering
GL_QCOM_writeonly_rendering
GL_EXT_sRGB
GL_EXT_sRGB_write_control
GL_EXT_texture_sRGB_decode
GL_EXT_texture_filter_anisotropic
GL_EXT_multisampled_render_to_texture
GL_EXT_color_buffer_float
GL_EXT_color_buffer_half_float
GL_EXT_disjoint_timer_query
下記のページを更新しました
・CPU/GPU OpenGL ES Extension (Mobile GPU)
・SmartWatch スペック一覧
2014/07/11訂正: 実測結果より cpu0 しか使われておらず実質 single core 700MHz 相当でした(詳細はこちら)
関連エントリ
・Android SmartWatch ZWatch で 3Dゲーム (ChiRaKS)
・Android SmartWatch スマートウオッチのスペック比較表
・Android SmartWatch SmartQ ZWatch (4) アプリの管理
・Android SmartWatch SmartQ ZWatch (3) 腕に関数電卓
・Android SmartWatch SmartQ ZWatch (2)
・Android 4.1 SmartWatch SmartQ Z Watch
GeForce GTX970 (新 Maxwell) は DirectX12 の Feature Level 12_1 に対応していることを確認しました。
同じ Maxwell でも、GeForce GTX900 では ROV 及び Conservative Rasterization など新しいハードウエア機能に対応していることがわかります。ただし Resource Binding/Heap Tier は Kelper/旧Maxwell 世代と変わらず、リソースの上限は残ったままです。他の GPU 含めたより詳しい表は下記ページに載せています。
・Direct3D 12 (DirectX 12) Windows 詳細
これらの新しい機能自体は GPU が対応していれば Direct3D 11.3 でも使用できます。
DirectX の API Version は下記のように細かく別れています。API Version が古いと新しい機能を利用することができません。ID3D11Device2/ID3D11Device3 のように必要な機能に対応した Interface を使う必要があります。
D3D12 で使える Feature Level は今のところ下記の 4 種類で API Version とは異なっています。こちらは実際に GPU が対応している機能をグループ化したものです。option 扱いの個別の機能を 1つ 1つ判定するのは面倒ですが、Feature Level 毎に必須の機能を決めておくことでまとめて区別しやすくなります。OpenGL の Extension と GL Version 番号の関係に似ているかもしれません。
GPU の機能面に注目する場合は、どの API に対応しているかよりも、どの FeatureLevel に属しているかの方が重要となります。Direct3D11 対応と書かれていても FeatureLevel 9_1 の可能性もあるからです。
下記のページにも同じ表を載せています。
・Direct3D (Direct3D/12/11/10)
GeForce GTX970 の OpenGL の結果も下記に追加しました。
・Desktop GPU Extensions
↓ Maxwell v1 との違い
OpenGL ES 3.1 AEP 対応も他の GeForce と同じです。Extension に違いはありますが ASTC は Emulation となっています。今のところ HW 対応を確認した GPU は Intel HD Graphics (Gen8) のみ。
関連エントリ
・3D 低レベル API の現状 Direct3D 12/Metal
・Intel HD Graphics Gen 8 は Open GL 4.4/OpenGL ES 3.1 AEP 対応 (Broadwell/Cherry Trail/Braswell)
・Direct3D 12 (DirectX12) GPU と API の対応表
・DirectX 12 (Direct3D 12) と GPU の対応
・Desktop GPU と OpenGL ES 3.1 API
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・CPU 負荷が低い 新しい 3D API
RADEON | GeForce | GeForce | Intel HD | |
R3 8400 | GTX 970 | GTX 750 Ti | Graphics | |
GCN 1.1 HSA | Maxwell 2 | Maxwell | Gen 8 | |
15.200.1023 | 353.30 | 353.30 | 10.18.15.4235 | |
FEATURE_LEVEL | 12_0 | 12_1 | 11_0 | 11_1 |
DoublePrec | true | true | true | true |
OMLogicOp | true | true | true | true |
MinPrecision | NONE | NONE | NONE | NONE |
TiledResTier | Tier 2 | Tier 3 | Tier 1 | -- |
ResBindingTier | Tier 3 | Tier 2 | Tier 2 | Tier 1 |
StencilRef | true | false | false | false |
TypedUAVFormat | true | true | true | false |
ROV Supported | false | true | false | true |
ConservativeRas | -- | Tier 1 | -- | -- |
GPUVAddrBits | 38 | 38 | 31 | 31 |
StdSwizzle64K | false | false | false | false |
CrossNodeTier | -- | -- | -- | -- |
CrossAdaptTex | false | false | false | false |
VPAndRTArray | false | false | false | true |
ResHeapTier | Tier 2 | Tier 1 | Tier 1 | Tier 2 |
同じ Maxwell でも、GeForce GTX900 では ROV 及び Conservative Rasterization など新しいハードウエア機能に対応していることがわかります。ただし Resource Binding/Heap Tier は Kelper/旧Maxwell 世代と変わらず、リソースの上限は残ったままです。他の GPU 含めたより詳しい表は下記ページに載せています。
・Direct3D 12 (DirectX 12) Windows 詳細
これらの新しい機能自体は GPU が対応していれば Direct3D 11.3 でも使用できます。
DirectX の API Version は下記のように細かく別れています。API Version が古いと新しい機能を利用することができません。ID3D11Device2/ID3D11Device3 のように必要な機能に対応した Interface を使う必要があります。
Direct3D 11.0 Windows 7 (Vista) Direct3D 11.1 Windows 8 (7) Direct3D 11.2 Windows 8.1 Direct3D 11.3 Windows 10 Direct3D 12 Windows 10
D3D12 で使える Feature Level は今のところ下記の 4 種類で API Version とは異なっています。こちらは実際に GPU が対応している機能をグループ化したものです。option 扱いの個別の機能を 1つ 1つ判定するのは面倒ですが、Feature Level 毎に必須の機能を決めておくことでまとめて区別しやすくなります。OpenGL の Extension と GL Version 番号の関係に似ているかもしれません。
Feature Level 11_0 Fermi/Kepler/Maxwell1 Feature Level 11_1 GCN 1.0/Intel HD Graphics Iris Gen7.5/8 Feature Level 12_0 GCN 1.1/1.2 Feature Level 12_1 Maxwell2
GPU の機能面に注目する場合は、どの API に対応しているかよりも、どの FeatureLevel に属しているかの方が重要となります。Direct3D11 対応と書かれていても FeatureLevel 9_1 の可能性もあるからです。
下記のページにも同じ表を載せています。
・Direct3D (Direct3D/12/11/10)
GeForce GTX970 の OpenGL の結果も下記に追加しました。
・Desktop GPU Extensions
GL_VERSION: 4.5.0 NVIDIA 353.30 GL_RENDERER: GeForce GTX 970/PCIe/SSE2 GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: 4.50 NVIDIA
↓ Maxwell v1 との違い
GL_AMD_vertex_shader_viewport_index GL_AMD_vertex_shader_layer GL_EXT_post_depth_coverage GL_EXT_raster_multisample GL_EXT_sparse_texture2 GL_EXT_texture_filter_minmax GL_NV_conservative_raster GL_NV_conservative_raster_dilate GL_NV_fill_rectangle GL_NV_fragment_coverage_to_color GL_NV_fragment_shader_interlock GL_NV_framebuffer_mixed_samples GL_NV_geometry_shader_passthrough GL_NV_path_rendering_shared_edge GL_NV_sample_locations GL_NV_sample_mask_override_coverage GL_NV_shader_atomic_fp16_vector GL_NV_viewport_array2
OpenGL ES 3.1 AEP 対応も他の GeForce と同じです。Extension に違いはありますが ASTC は Emulation となっています。今のところ HW 対応を確認した GPU は Intel HD Graphics (Gen8) のみ。
関連エントリ
・3D 低レベル API の現状 Direct3D 12/Metal
・Intel HD Graphics Gen 8 は Open GL 4.4/OpenGL ES 3.1 AEP 対応 (Broadwell/Cherry Trail/Braswell)
・Direct3D 12 (DirectX12) GPU と API の対応表
・DirectX 12 (Direct3D 12) と GPU の対応
・Desktop GPU と OpenGL ES 3.1 API
・GeForce の OpenGL 4.5 ES3_1_Compatibility は AEP 対応
・CPU 負荷が低い 新しい 3D API
2012/08/24
サンコー Androidスティック with DUALCORE の GPU
サンコーの Android スティック ANDHDM2S を触る機会がありました。
・Androidスティック with DUALCORE
とりあえず dual core であることを確認。
CPU は NEON 使用可能で GPU は PowerVR SGX530 でした。
adb の usb ドライバは android_winusb.inf の書き換えだけで
つながりました。
関連ページ
・日本で発売された端末全リスト
・Androidスティック with DUALCORE
とりあえず dual core であることを確認。
CPU は NEON 使用可能で GPU は PowerVR SGX530 でした。
-------------------
CPU
-------------------
Processor : ARMv7 Processor rev 2 (v7l)
processor : 0
BogoMIPS : 1061.68
processor : 1
BogoMIPS : 1064.96
Features : swp half thumb fastmult vfp edsp neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x1
CPU part : 0xc09
CPU revision : 2
Hardware : EMXX
Revision : 0420
Serial : 0000000000000000
-------------------
GPU
-------------------
GL_VERSION: OpenGL ES 2.0
GL_RENDERER: PowerVR SGX 530
GL_VENDOR: Imagination Technologies
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00
pconst=64 vconst=128 vin=16 vout=8 ptex=8 vtex=8 combotex=8 maxrender=2048 maxtexsize=2048 cubetexsize=2048 viewdims=2048
Extension:
GL_OES_rgb8_rgba8
GL_OES_depth24
GL_OES_vertex_half_float
GL_OES_texture_float
GL_OES_texture_half_float
GL_OES_element_index_uint
GL_OES_mapbuffer
GL_OES_fragment_precision_high
GL_OES_compressed_ETC1_RGB8_texture
GL_OES_EGL_image
GL_OES_required_internalformat
GL_OES_depth_texture
GL_OES_get_program_binary
GL_OES_packed_depth_stencil
GL_OES_standard_derivatives
GL_OES_vertex_array_object
GL_OES_egl_sync
GL_EXT_multi_draw_arrays
GL_EXT_texture_format_BGRA8888
GL_EXT_discard_framebuffer
GL_EXT_shader_texture_lod
GL_IMG_shader_binary
GL_IMG_texture_compression_pvrtc
GL_IMG_texture_stream2
GL_IMG_texture_npot
GL_IMG_texture_format_BGRA8888
GL_IMG_read_format
GL_IMG_program_binary
GL_IMG_multisampled_render_to_texture
adb の usb ドライバは android_winusb.inf の書き換えだけで
つながりました。
%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0002 %CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0002&MI_01
関連ページ
・日本で発売された端末全リスト
Android 4.3 で OpenGL ES 3.0 が導入されましたが、Adreno 320 では
一部動作に問題がありました。
具体的には Uniform Block を使用すると glLinkProgram でエラーが発生します。
Android 4.4 ではこの問題が直っており、正しく動作することが確認できました。
GPU のドライバが更新されたためだと考えられます。
以前の症状について詳しくは こちら。
他にも glIntergerv() (Query) の値など修正が入っているようです。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
OpenGL ES 3.0 が動くデバイスもかなり増えてきました。
Android 4.4 なら Nexus 7 (2013) が使えるので、動作確認は比較的容易に
なったのではないかと思います。
ただ実際のアプリケーションでは、確実に OS が更新されるとわかっている
Nexus 以外で利用するのは正直厳しいと言えます。
他にも OpenGL ES 3.0 が使えるかどうかの判定がうまくいかないことがあります。
・OpenGL ES : Checking OpenGL ES Version
GPU によっては 3.0 を渡して Context を作ってもエラーにならず、
OpenGL ES 1.1 の Context を返すものがあります。
(おそらくドライバが 2.0 かそれ以外で判別している)
2番目の Version 番号を使う方法は Android ではうまくいきます。
Nexus 10, Nexus 7 (2013) ともに 2.0 context を作っても GL_VERSION は
3.0 を返すためです。
ただし iOS や PC では作成した context と同じバージョン文字列を返すので
少々不自然な気もします。
関連エントリ
・iPhone 5s の Apple A7 GPU
・Adreno 320 の OpenGL ES 3.0 と Uniform Block
・Nexus 7 (2013) の Adreno 320 と OpenGL ES 3.0 (Android 4.3)
一部動作に問題がありました。
具体的には Uniform Block を使用すると glLinkProgram でエラーが発生します。
Android 4.4 ではこの問題が直っており、正しく動作することが確認できました。
GPU のドライバが更新されたためだと考えられます。
以前の症状について詳しくは こちら。
# Nexus 7 (2013) Android 4.3 GL_VERSION: OpenGL ES 3.0 V@14.0 GL_RENDERER: Adreno (TM) 320 GL_VENDOR: Qualcomm GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
# Nexus 7 (2013) Android 4.4 GL_VERSION: OpenGL ES 3.0 V@53.0 AU@ (CL@3776187) GL_RENDERER: Adreno (TM) 320 GL_VENDOR: Qualcomm GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
他にも glIntergerv() (Query) の値など修正が入っているようです。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
OpenGL ES 3.0 が動くデバイスもかなり増えてきました。
Android 4.4 なら Nexus 7 (2013) が使えるので、動作確認は比較的容易に
なったのではないかと思います。
ただ実際のアプリケーションでは、確実に OS が更新されるとわかっている
Nexus 以外で利用するのは正直厳しいと言えます。
他にも OpenGL ES 3.0 が使えるかどうかの判定がうまくいかないことがあります。
・OpenGL ES : Checking OpenGL ES Version
GPU によっては 3.0 を渡して Context を作ってもエラーにならず、
OpenGL ES 1.1 の Context を返すものがあります。
(おそらくドライバが 2.0 かそれ以外で判別している)
2番目の Version 番号を使う方法は Android ではうまくいきます。
Nexus 10, Nexus 7 (2013) ともに 2.0 context を作っても GL_VERSION は
3.0 を返すためです。
ただし iOS や PC では作成した context と同じバージョン文字列を返すので
少々不自然な気もします。
関連エントリ
・iPhone 5s の Apple A7 GPU
・Adreno 320 の OpenGL ES 3.0 と Uniform Block
・Nexus 7 (2013) の Adreno 320 と OpenGL ES 3.0 (Android 4.3)
2013/01/09
Qualcomm APQ8064 GPU Adreno 320 の速度
今までテストに使用してきたプログラムが安定して動作しないため
Adreno 320 では速度の計測ができていませんでした。
LG Optimus G LGL21 を借りることができたのでもう一度テストしてみました。
・Mobile GPU ベンチ OpenGL ES 2.0
・CPU benchmark
・OpenGL ES Extension (Mobile GPU)
GPU bench の (1) 以外は 60fps に達するため数値が出ていません。
GPU 性能が上がったため、もはやこのテストは計測に向いていないことになります。
また Adreno 320 は OpenGL ES 3.0 世代の GPU ですが、
現在の OS から使う限り API は OpenGL ES 2.0 になります。
GPU 性能をまだ引き出せていない可能性があります。
テストプログラムのエラーの原因は特定のケースでシェーダーのコンパイルが
エラーになるもので、回避方法はわかったもののまだ詳しい条件が
特定できていません。
VFP test では HTC J HTL21 よりも良い結果が出ています。
Krait の FP 性能は Swift に並ぶ新 core であることがよくわかります。
前回のテスト時はクロックが上限まで上がっていなかった可能性があります。
HTC J butterfly が修理から戻ってきたらもう一度計測してみたいと思っています。
関連エントリ
・Adreno 320 Snapdragon S4 Pro APQ8064
Adreno 320 では速度の計測ができていませんでした。
LG Optimus G LGL21 を借りることができたのでもう一度テストしてみました。
・Mobile GPU ベンチ OpenGL ES 2.0
・CPU benchmark
・OpenGL ES Extension (Mobile GPU)
GPU bench の (1) 以外は 60fps に達するため数値が出ていません。
GPU 性能が上がったため、もはやこのテストは計測に向いていないことになります。
また Adreno 320 は OpenGL ES 3.0 世代の GPU ですが、
現在の OS から使う限り API は OpenGL ES 2.0 になります。
GPU 性能をまだ引き出せていない可能性があります。
テストプログラムのエラーの原因は特定のケースでシェーダーのコンパイルが
エラーになるもので、回避方法はわかったもののまだ詳しい条件が
特定できていません。
VFP test では HTC J HTL21 よりも良い結果が出ています。
(1) (2) (3) (4) (5) (6) iPad3 Touch5 EVO 3D iPad4 Butterfly OptimusG A5X A5 8660 A6X 8064 8064 C-A9 C-A9 Scorpion Swift Krait Krait ---------------------------------------------------------------- a:mat44 neon_AQ 4.784 5.979 2.879 1.204 1.919 1.354 b:mat44 neon_BQ 2.408 3.008 1.146 1.266 1.273 0.930 c:mat44 neon_AD 4.781 5.974 3.079 1.554 2.453 1.862 d:mat44 neon_BD 2.406 3.007 1.440 1.344 2.041 1.521 e:fadds A 4.010 5.013 3.460 2.882 3.791 2.831 f:fmuls A 4.010 5.012 4.361 2.953 3.671 2.793 g:fmacs A 4.012 5.011 4.034 5.763 7.334 5.599 h:vfma.f32 A ----- ----- ----- 5.765 3.725 2.743 i:vadd.f32 D A 4.111 5.136 3.493 2.877 3.706 2.724 j:vmul.f32 D A 4.110 5.136 3.502 2.950 3.667 2.767 k:vmla.f32 D A 4.512 5.650 3.638 2.951 7.557 5.462 l:vadd.f32 Q A 8.023 10.036 3.408 2.878 3.677 2.717 m:vmul.f32 Q A 8.022 10.028 3.427 2.952 3.647 2.741 n:vmla.f32 Q A 8.025 10.028 3.400 2.955 7.362 5.446 o:vfma.f32 D A ----- ----- ----- 2.494 3.676 2.709 p:fadds B 4.014 5.013 5.972 5.757 4.664 3.388 q:fmuls B 5.013 6.265 5.960 5.760 4.583 3.384 r:fmacs B 8.023 10.024 8.573 11.521 8.266 6.246 s:vfma.f32 B ----- ----- ----- 11.519 4.611 3.622 t:vadd.f32 D B 4.113 5.137 5.945 2.881 4.746 3.406 u:vmul.f32 D B 4.118 5.145 5.098 2.951 4.680 3.454 v:vmla.f32 D B 9.027 11.278 8.498 5.757 8.361 6.140 w:vadd.f32 Q B 8.021 10.023 5.950 2.879 4.702 3.481 x:vmul.f32 Q B 8.029 10.023 5.095 2.951 4.595 3.412 y:vmla.f32 Q B 9.026 11.277 8.497 5.762 8.464 6.249 z:vfma.f32 D B ----- ----- ----- 5.759 4.660 3.413 --------------------------------------------------------------- ↑数値は実行時間(秒) 数値が小さい方が速い (1)=Apple iPad 3 A5X ARM Cortex-A9 x2 1.0GHz (2)=Apple iPod touch 5 A5 ARM Cortex-A9 x2 0.8GHz (3)=HTC EVO 3D ISW12HT MSM8660 Scorpion x2 1.2GHz (4)=Apple iPad 4 A6X A6 (swift) x2 ?GHz (5)=HTC J butterfly HTL21 APQ8064 Krait x4 1.5GHz (6)=LG Optimus G LGL21 APQ8064 Krait x4 1.5GHz
Krait の FP 性能は Swift に並ぶ新 core であることがよくわかります。
前回のテスト時はクロックが上限まで上がっていなかった可能性があります。
HTC J butterfly が修理から戻ってきたらもう一度計測してみたいと思っています。
関連エントリ
・Adreno 320 Snapdragon S4 Pro APQ8064
2011/08/05
Android Galaxy S2 ARM Mali-400 MP
ベンチは走らせてませんが 3D 描画は速い。
今まで試した Android の中では最速でした。
● GPU
Unified でなく unit が独立しているせいもあるかもしれませんが、
比較的長い pixel shader も意外なほど動きます。
その代わり extension は少な目です。
・Mobile GPU の比較
float 系テクスチャや圧縮頂点フォーマットが無いようです。
また圧縮テクスチャが ETC1 だけに制限されるのも、他の GPU との
大きな違いとなっています。
今の Mobile GPU はそれぞれ何かしらのトレードオフがあり全部入りはありません。
例えば Adreno 200 は演算ユニットが高精度固定、Unified で頂点機能も豊富、
低帯域対策は TBR と ATITC。その代わり頂点キャッシュなし。
PVR SGX535 は TBDR + PVRTC で全体的なスループットが高いがシェーダーの
演算精度をどこまで落とせるかが最適化の要。
Tegra2 は TBR でない代わりに転送量削減で 16bit depth 固定など。
Mali-400MP はまた違った特徴を持っているようです。
● CPU
Cortex-A9 1.2GHz dual。iPad2 同様 neon ありです。
今まで触ったハードで A9 neon 無しは Tegra2 だけでした。
モバイルでの 3D ゲームも現実的なレベルだと思います。
デスクトップ GPU との差はまだまだですが、意外にすぐ追いつかれるかも
しれません。
関連エントリ
・iPad2 A5 と浮動小数演算 VFP/NEON
・Android OpenGL ES 2.0 の圧縮テクスチャ
・Tegra2 Cortex-A9 と浮動小数演算
・Snapdragon と浮動小数演算速度
今まで試した Android の中では最速でした。
● GPU
GL_VERSION: OpenGL ES 2.0 GL_RENDERER: Mali-400 MP GL_VENDOR: ARM GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 [GL_OES_texture_npot] [GL_OES_compressed_ETC1_RGB8_texture] [GL_OES_standard_derivatives] [GL_OES_EGL_image] [GL_OES_depth24] [GL_ARM_rgba8] [GL_ARM_mali_shader_binary] [GL_OES_depth_texture] [GL_OES_packed_depth_stencil] API=0 Shader=100 pconst=1024 vconst=128 vin=16 vout=12 ptex=8 vtex=0 combotex=8 maxrender=4096 maxtexsize=4096 cubetexsize=1024 viewdims=4096 TextureFormat 1 tc[00]=8d64 GL_ETC1_RGB8_OES
Unified でなく unit が独立しているせいもあるかもしれませんが、
比較的長い pixel shader も意外なほど動きます。
その代わり extension は少な目です。
・Mobile GPU の比較
float 系テクスチャや圧縮頂点フォーマットが無いようです。
また圧縮テクスチャが ETC1 だけに制限されるのも、他の GPU との
大きな違いとなっています。
今の Mobile GPU はそれぞれ何かしらのトレードオフがあり全部入りはありません。
例えば Adreno 200 は演算ユニットが高精度固定、Unified で頂点機能も豊富、
低帯域対策は TBR と ATITC。その代わり頂点キャッシュなし。
PVR SGX535 は TBDR + PVRTC で全体的なスループットが高いがシェーダーの
演算精度をどこまで落とせるかが最適化の要。
Tegra2 は TBR でない代わりに転送量削減で 16bit depth 固定など。
Mali-400MP はまた違った特徴を持っているようです。
● CPU
Cortex-A9 1.2GHz dual。iPad2 同様 neon ありです。
今まで触ったハードで A9 neon 無しは Tegra2 だけでした。
Processor : ARMv7 Processor rev 1 (v7l) processor : 0 BogoMIPS : 1592.52 processor : 1 BogoMIPS : 1592.52 Features : swp half thumb fastmult vfp edsp neon vfpv3 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x2 CPU part : 0xc09 CPU revision : 1
モバイルでの 3D ゲームも現実的なレベルだと思います。
デスクトップ GPU との差はまだまだですが、意外にすぐ追いつかれるかも
しれません。
関連エントリ
・iPad2 A5 と浮動小数演算 VFP/NEON
・Android OpenGL ES 2.0 の圧縮テクスチャ
・Tegra2 Cortex-A9 と浮動小数演算
・Snapdragon と浮動小数演算速度
2013/09/05
OpenGL と sRGB
一般的な画像はモニタに合わせてガンマ補正した非線形なデータになっています。
そのまま演算に用いると正しい結果が得られないため、事前にリニア値への
変換が必要になります。
同様に出力時は元のモニタ用の色空間に戻します。
・入力時 sRGB → Linear 変換
・出力時 Linear → sRGB 変換
OpenGL (2.1/3.0) や OpenGL ES 3.0 以降は標準である sRGB 色空間に対応しており、
リニア値との相互変換ができるようになっています。
変換が行われるのは上記のようにテクスチャの読み込みと、フレームバッファへの
書き込みのタイミングです。
●入力時
intenal format に sRGB 形式であることを指定できます。
テクスチャフェッチで同時に Linear に展開されます。
圧縮フォーマットも同様です。
変換は RGB のみで Alpha は含まれません。
OpenGL 4.x RADEON/GeForce/Intel HD 4000、OpenGL ES 3.0 Mali-T604 で
動作を確認しています。
OpenGL ES 2.0 で用いられていた GPU 固有の圧縮フォーマットには sRGB 形式が
定義されていないものがあります。
現在わかっている情報からまとめると下記の通り。
ETC1 に対応する sRGB フォーマットがありませんが、ETC2 が上位互換なので
GL_COMPRESSED_SRGB8_ETC2 で読み込むことが出来ます。
OpenGL ES 3.0 GPU は ETC2/EAC に対応しているので、SRGB 形式が必要なら
ETC2 を選択することになるかと思います。
フィルタリングに関与できないので厳密ではありませんが、
シェーダーで Linear に変換することも可能です。
ガンマ補正はデータ圧縮の一種といえるので、sRGB 8bit を展開すると
リニア値は 8bit 以上の精度が必要となります。
●出力時
フレームバッファが sRGB 形式で作られている場合、書き込み時に変換が行われます。
自分で作る場合は簡単で、Texture 同様に internal format に sRGB 形式を指定します。
OS が用意する Default Framebuffer の場合は wgl や egl を用いて
SRGB 対応のフォーマットを選んでおく必要があります。
ただし Windows 7/8 + RADEON/GeForce では、特に何もしなくても SRGB 形式となっており
glEnable( GL_FRAMEBUFFER_SRGB ) だけで意図した結果が得られるようです。
逆に Intel HD 4000 (9.18.10.3165) では、下記の方法で SRGB バッファを選択しても
Default Framebuffer での変換がうまく出来ませんでした。
wgl を使った選択手段は下記のとおり。
1. wgl extension の wglChoosePixelFormatARB() を取得
2. 必要なパラメータ(attribute) を指定して wglChoosePixelFormatARB() で候補を選ぶ
3. 得られた Config 値を SetPixelFormat() に渡す
Intel HD 4000 でも自分で Framebuffer を用意した場合は
glEnable( GL_FRAMEBUFFER_SRGB ) の設定が結果に影響を与えていることを確認できます。
ただし OpenGL 4.0 では結果をそのまま出力する手段が見つかりませんでした。
glBlitFramebuffer() や Texture としての読み込みは、ソースが sRGB の場合に
リニア変換されてしまうので、元が Linear か sRGB か区別出来ないからです。
よって Default Framebuffer に転送する場合にシェーダーでもう一度再エンコードが
必要となります。
OpenGL 4.2 以降ならメモリイメージとして転送できるので、もっと良い方法が
あるかもしれません。
OpenGL ES 3.0 (Mali-T604) では GL_FRAMEBUFFER_SRGB による切り替えが
できないので、Framebuffer に対して正しく変換されているかどうか確認できませんでした。
SRGB はブレンドの結果に影響を与えるので、ブレンド結果を比べれば
機能していること確認できるのではないかと思っています。
入力側は容易でしたが、出力側は必ずしも統一した挙動になってくれないようです。
Framebuffer が HDR の場合リニアのまま格納できるので、互換性を考えると
最終的にシェーダーで変換するのが一番なのかもしれません。
関連エントリ
・OpenGL 3.x/4.x のシェーダー GLSL とメモリアクセス命令
・OpenGL 4.x Program Pipeline Object (Separate Shader Object)
・OpenGL 4.2/4.3 Shader Resource と Buffer API
・OpenGL ES 3.0/OpenGL 4.x Uniform Block
・OpenGL の各バージョンと GLSL の互換性
・OpenGL のエラー判定と OpenGL 4.3 Debug Output
・OpenGL ES 3.0/OpenGL 4.4 Texture Object と Sampler Object
・OpenGL ES 3.0 と Vertex Array Object
そのまま演算に用いると正しい結果が得られないため、事前にリニア値への
変換が必要になります。
同様に出力時は元のモニタ用の色空間に戻します。
・入力時 sRGB → Linear 変換
・出力時 Linear → sRGB 変換
OpenGL (2.1/3.0) や OpenGL ES 3.0 以降は標準である sRGB 色空間に対応しており、
リニア値との相互変換ができるようになっています。
変換が行われるのは上記のようにテクスチャの読み込みと、フレームバッファへの
書き込みのタイミングです。
●入力時
intenal format に sRGB 形式であることを指定できます。
テクスチャフェッチで同時に Linear に展開されます。
圧縮フォーマットも同様です。
// Linear glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data ); glCompressedTexImage2D( GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, w, h, 0, size, data ); glCompressedTexImage2D( GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, w, h, 0, size, data ); // sRGB glTexImage2D( GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data ); glCompressedTexImage2D( GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ETC2, w, h, 0, size, data ); glCompressedTexImage2D( GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, w, h, 0, size, data );
変換は RGB のみで Alpha は含まれません。
OpenGL 4.x RADEON/GeForce/Intel HD 4000、OpenGL ES 3.0 Mali-T604 で
動作を確認しています。
OpenGL ES 2.0 で用いられていた GPU 固有の圧縮フォーマットには sRGB 形式が
定義されていないものがあります。
現在わかっている情報からまとめると下記の通り。
OpenGL ES 3.0 での sRGB ---------------------------------------- ETC1 あり(ETC2) ETC2 あり PVRTC 無し (PowerVR のみ) PVRTC2 無し (PowerVR のみ) ATITC 無し (Adreno のみ) ASTC あり S3TC(DXT1) あり
ETC1 に対応する sRGB フォーマットがありませんが、ETC2 が上位互換なので
GL_COMPRESSED_SRGB8_ETC2 で読み込むことが出来ます。
OpenGL ES 3.0 GPU は ETC2/EAC に対応しているので、SRGB 形式が必要なら
ETC2 を選択することになるかと思います。
フィルタリングに関与できないので厳密ではありませんが、
シェーダーで Linear に変換することも可能です。
ガンマ補正はデータ圧縮の一種といえるので、sRGB 8bit を展開すると
リニア値は 8bit 以上の精度が必要となります。
●出力時
フレームバッファが sRGB 形式で作られている場合、書き込み時に変換が行われます。
自分で作る場合は簡単で、Texture 同様に internal format に sRGB 形式を指定します。
// Renderbuffer glGenRenderbuffers( 1, &ColorBuffer ); glBindRenderbuffer( GL_RENDERBUFFER, ColorBuffer ); glRenderbufferStorage( GL_RENDERBUFFER, GL_SRGB8_ALPHA8, w, h ); glBindRenderbuffer( GL_RENDERBUFFER, 0 ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, FrameBuffer ); glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, ColorBuffer ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); // Texture glGenTextures( 1, &ColorTexture ); glBindTexture( GL_TEXTURE_2D, ColorTexture ); glTexImage2D( GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); glBindTexture( GL_TEXTURE_2D, 0 ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, FrameBuffer ); glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorTexture, 0 ); glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 );
OS が用意する Default Framebuffer の場合は wgl や egl を用いて
SRGB 対応のフォーマットを選んでおく必要があります。
ただし Windows 7/8 + RADEON/GeForce では、特に何もしなくても SRGB 形式となっており
glEnable( GL_FRAMEBUFFER_SRGB ) だけで意図した結果が得られるようです。
逆に Intel HD 4000 (9.18.10.3165) では、下記の方法で SRGB バッファを選択しても
Default Framebuffer での変換がうまく出来ませんでした。
wgl を使った選択手段は下記のとおり。
1. wgl extension の wglChoosePixelFormatARB() を取得
2. 必要なパラメータ(attribute) を指定して wglChoosePixelFormatARB() で候補を選ぶ
3. 得られた Config 値を SetPixelFormat() に渡す
static const int PixelFormat_Attr[]= {
WGL_DRAW_TO_WINDOW_ARB, TRUE,
WGL_SUPPORT_OPENGL_ARB, TRUE,
WGL_DOUBLE_BUFFER_ARB, TRUE,
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
WGL_COLOR_BITS_ARB, 32,
WGL_RED_BITS_ARB, 8,
WGL_GREEN_BITS_ARB, 8,
WGL_BLUE_BITS_ARB, 8,
WGL_ALPHA_BITS_ARB, 8,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 8,
WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, TRUE,
0
};
int ChooseConfig()
{
int pixelformat= 0;
if( !p_wglChoosePixelFormatARB ){ // extension の確認
return ChoosePixelFormat( hDC, &PixelFormat_Default );
}
const unsigned int FORMAT_ARRAY_SIZE= 16;
int FormatArray[FORMAT_ARRAY_SIZE];
unsigned int array_size= 0;
if( !wglChoosePixelFormatARB( hDC, PixelFormat_Attr, NULL, FORMAT_ARRAY_SIZE, FormatArray, &array_size ) ){
return 0;
}
return FormatArray[0];
}
void SetPixelFormat()
{
int pixelformat= ChooseConfig();
if( !pixelformat ){
// error
}
SetPixelFormat( hDC, pixelformat, NULL );
}
Intel HD 4000 でも自分で Framebuffer を用意した場合は
glEnable( GL_FRAMEBUFFER_SRGB ) の設定が結果に影響を与えていることを確認できます。
ただし OpenGL 4.0 では結果をそのまま出力する手段が見つかりませんでした。
glBlitFramebuffer() や Texture としての読み込みは、ソースが sRGB の場合に
リニア変換されてしまうので、元が Linear か sRGB か区別出来ないからです。
よって Default Framebuffer に転送する場合にシェーダーでもう一度再エンコードが
必要となります。
OpenGL 4.2 以降ならメモリイメージとして転送できるので、もっと良い方法が
あるかもしれません。
OpenGL ES 3.0 (Mali-T604) では GL_FRAMEBUFFER_SRGB による切り替えが
できないので、Framebuffer に対して正しく変換されているかどうか確認できませんでした。
SRGB はブレンドの結果に影響を与えるので、ブレンド結果を比べれば
機能していること確認できるのではないかと思っています。
入力側は容易でしたが、出力側は必ずしも統一した挙動になってくれないようです。
Framebuffer が HDR の場合リニアのまま格納できるので、互換性を考えると
最終的にシェーダーで変換するのが一番なのかもしれません。
// GLSL const float SCALE_0= 1.0/12.92; const float SCALE_1= 1.0/1.055; const float OFFSET_1= 0.055 * SCALE_1; float SRGBToLinear_F( float color ) { if( color <= 0.04045 ){ return color * SCALE_0; } return pow( color * SCALE_1 + OFFSET_1, 2.4 ); } float LinearToSRGB_F( float color ) { color= clamp( color, 0.0, 1.0 ); if( color < 0.0031308 ){ return color * 12.92; } return 1.055 * pow( color, 0.41666 ) - 0.055; } vec3 LinearToSRGB_V( vec3 color ) { return vec3( LinearToSRGB_F( color.x ), LinearToSRGB_F( color.y ), LinearToSRGB_F( color.z ) ); } vec3 SRGBToLinear_V( vec3 color ) { return vec3( SRGBToLinear_F( color.x ), SRGBToLinear_F( color.y ), SRGBToLinear_F( color.z ) ); }
関連エントリ
・OpenGL 3.x/4.x のシェーダー GLSL とメモリアクセス命令
・OpenGL 4.x Program Pipeline Object (Separate Shader Object)
・OpenGL 4.2/4.3 Shader Resource と Buffer API
・OpenGL ES 3.0/OpenGL 4.x Uniform Block
・OpenGL の各バージョンと GLSL の互換性
・OpenGL のエラー判定と OpenGL 4.3 Debug Output
・OpenGL ES 3.0/OpenGL 4.4 Texture Object と Sampler Object
・OpenGL ES 3.0 と Vertex Array Object
2015/03/01
Nexus Player を GamePad&Mouse で使う、他
Google の Android TV 端末、Nexus Player を使ってみました。
UI は一般の Android とは大きく異なり TV を意識したもの。
操作は付属のリモコンを使うので Apple TV に似ています。
・Google Nexus Player
大きく異なっているのは単体でアプリが動作することで、Google Play Store からダウンロードできます。
ただし専用&対応アプリしか出てこないらしく検索してもタイトルは多くありません。
HOME に並んでるものもゲームとムービー等のコンテンツのみで実用系アプリは無し。
Chrome や GMail なども無く、検索でもこの辺りのアプリが見当たりませんでした。
micro USB 端子があるので PC につなげば adb 接続できます。
開発者メニューを有効にするには設定の端末情報から「 ビルド 」を何度も選択する必要あり。
USB 経由で install した場合は普通の Android アプリも動くようです。
ただし HOME 画面にはアイコンが表示されないため、実行には少々手間がかかります。
1. 設定 → アプリ → ダウンロードしたアプリ
2. 一覧から選択してから「開く」
HOME画面に表示させる場合は intent-filter の設定が必要です。
application に isGame="true" があるとアプリではなくゲーム側に分類されます。
通常の Android アプリを走らせた場合タッチ操作はできませんが、
vfpbenchmark のように標準の UI を使ったものはリモコンだけで操作できました。
(vfp benchmark の結果はこちら)
また USB Host が有効なので、タッチ操作が必要なアプリでもマウスを繋げばそれなりに使用することが出来ます。
BACK や HOME ボタンはないので、マウスの場合もリモコンは必要になります。
同様に USB を使った接続では PS3 や Xbox360 (USB版) のゲームコントローラも使うことが出来ました。
この辺りも通常の Android 端末と同様です。
専用のゲームパッドがなくてもひと通りゲーム操作できます。
ただし USB 接続は adb と併用できないので、ゲーム開発にはワイヤレスのコントローラが欲しくなります。
下記追加しました
・VFP Benchmark Log
・CPU/GPU OpenGL ES Extension (Mobile GPU)
GPU は Intel HD Graphics ではなく Apple A7 世代と同じ PowerVR G6430 です。
関連エントリ
・Android 5.0 Nexus Player x86 と対応 ABI
・iOS7 対応 SteelSeries Stratus ワイヤレスゲームコントローラー
・Android 用ゲームパッド BUFFALO Zeemote JS1 H
・Android 3.1 と GamePad のイベントの詳細 (2)
・Android 3.1 と GamePad のイベントコード
UI は一般の Android とは大きく異なり TV を意識したもの。
操作は付属のリモコンを使うので Apple TV に似ています。
・Google Nexus Player
大きく異なっているのは単体でアプリが動作することで、Google Play Store からダウンロードできます。
ただし専用&対応アプリしか出てこないらしく検索してもタイトルは多くありません。
HOME に並んでるものもゲームとムービー等のコンテンツのみで実用系アプリは無し。
Chrome や GMail なども無く、検索でもこの辺りのアプリが見当たりませんでした。
micro USB 端子があるので PC につなげば adb 接続できます。
開発者メニューを有効にするには設定の端末情報から「 ビルド 」を何度も選択する必要あり。
USB 経由で install した場合は普通の Android アプリも動くようです。
ただし HOME 画面にはアイコンが表示されないため、実行には少々手間がかかります。
1. 設定 → アプリ → ダウンロードしたアプリ
2. 一覧から選択してから「開く」
HOME画面に表示させる場合は intent-filter の設定が必要です。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
application に isGame="true" があるとアプリではなくゲーム側に分類されます。
<application android:isGame="true">
通常の Android アプリを走らせた場合タッチ操作はできませんが、
vfpbenchmark のように標準の UI を使ったものはリモコンだけで操作できました。
(vfp benchmark の結果はこちら)
また USB Host が有効なので、タッチ操作が必要なアプリでもマウスを繋げばそれなりに使用することが出来ます。
BACK や HOME ボタンはないので、マウスの場合もリモコンは必要になります。
同様に USB を使った接続では PS3 や Xbox360 (USB版) のゲームコントローラも使うことが出来ました。
この辺りも通常の Android 端末と同様です。
専用のゲームパッドがなくてもひと通りゲーム操作できます。
ただし USB 接続は adb と併用できないので、ゲーム開発にはワイヤレスのコントローラが欲しくなります。
下記追加しました
・VFP Benchmark Log
・CPU/GPU OpenGL ES Extension (Mobile GPU)
GPU は Intel HD Graphics ではなく Apple A7 世代と同じ PowerVR G6430 です。
関連エントリ
・Android 5.0 Nexus Player x86 と対応 ABI
・iOS7 対応 SteelSeries Stratus ワイヤレスゲームコントローラー
・Android 用ゲームパッド BUFFALO Zeemote JS1 H
・Android 3.1 と GamePad のイベントの詳細 (2)
・Android 3.1 と GamePad のイベントコード
2014/11/08
Nexus 9 Tegra K1 と ARM 64bit Denver
iPhone 5s に遅れることおよそ 1年、
64bit 対応の Android と ARM64 端末がリリースされました。
Nexus 9 の CPU core は NVIDIA の Denver。
少々わかりにくいですが "processor" の行が 2つあるので dual core です。
vfpbenchmark は下記のとおり。
single core 時の浮動小数点演算能力はほぼ SHILED Tablet (Cortex-A15 2.2GHz)
と同等で、トータル性能では Core 数の分だけ落ちています。
あくまで 32bit の結果なので後ほど 64bit (AArch64) でも試してみたいと思います。
arm64-v8a, armeabi-v7a, armeabi 3つの ABI に対応していました。
Android が現在 NDK でサポートしている ABI は下記の 7種類です。
ちなみに iOS で開発用の lib を作ると 5種類。
GPU は OpenGL ES 3.1 の Context を返します。
対応しているテクスチャフォーマットは DXT, ETC1, ETC2/EAC, ASTC 。
詳細は下記ページに掲載しています。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
64bit 対応の Android と ARM64 端末がリリースされました。
Nexus 9 の CPU core は NVIDIA の Denver。
Processor : NVIDIA Denver 1.0 rev 0 (aarch64) processor : 0 processor : 1 Features : fp asimd aes pmull sha1 sha2 crc32 CPU implementer : 0x4e CPU architecture: AArch64 CPU variant : 0x0 CPU part : 0x000 CPU revision : 0 Hardware : Flounder Revision : 0000 Serial : 0000000000000000
少々わかりにくいですが "processor" の行が 2つあるので dual core です。
$ cat /sys/devices/system/cpu/online 0-1
vfpbenchmark は下記のとおり。
single core 時の浮動小数点演算能力はほぼ SHILED Tablet (Cortex-A15 2.2GHz)
と同等で、トータル性能では Core 数の分だけ落ちています。
あくまで 32bit の結果なので後ほど 64bit (AArch64) でも試してみたいと思います。
// Nexus 9 ARCH: ARMv7A CPU core: 2 VFP: VFPv4-D32 NEON FMA: Yes NEON: Yes SingleT SP max: 17.799 GFLOPS SingleT DP max: 4.423 GFLOPS MultiT SP max: 34.582 GFLOPS MultiT DP max: 8.719 GFLOPS
ro.product.cpu.abi=arm64-v8a ro.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi ro.product.cpu.abilist32=armeabi-v7a,armeabi ro.product.cpu.abilist64=arm64-v8a
arm64-v8a, armeabi-v7a, armeabi 3つの ABI に対応していました。
Android が現在 NDK でサポートしている ABI は下記の 7種類です。
armeabi ARMv5TE armeabi-v7a ARMv7A VFPv3-D16 softfp (VFPv3-D32, NEON, hard-float) arm64-v8a ARMv8A (AArch64) x86 x86 (IA-32) x86_64 x64 mips MIPS32-R1 miips64 MIPS64
ちなみに iOS で開発用の lib を作ると 5種類。
armv7 ARMv7A VFPv3-D32+NEON softfp armv7s ARMv7A VFPv4-D32+NEON softfp arm64 ARMv8A (AArch64) i386 x86 simulator x86_64 x86_64 simulator
GPU は OpenGL ES 3.1 の Context を返します。
GL_VERSION: OpenGL ES 3.1 NVIDIA 343.00 GL_RENDERER: NVIDIA Tegra GL_VENDOR: NVIDIA Corporation GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10
対応しているテクスチャフォーマットは DXT, ETC1, ETC2/EAC, ASTC 。
詳細は下記ページに掲載しています。
・CPU/GPU OpenGL ES Extension (Mobile GPU)
・Android Adreno 320 OpenGL ES 3.0 (Nexus 7 2013)

・Android Adreno 320 OpenGL ES 2.0 (HTC J butterfly HTL21 )

・Android Mali-T604 OpenGL ES 3.0 (Nexus 10 2012)


・Android Tegra 4 ULP GeForce(72) OpenGL ES 2.0 (Tegra Note 7)

・Android Tegra 3 ULP GeForce(12) OpenGL ES 2.0 (Nexus 7 2012)

・iOS7 PowerVR SGX543MP3 OpenGL ES 2.0 (iPhone 5)

・iOS7 PowerVR G6430 OpenGL ES 3.0 (iPhone 5s)

・RK3066 Mali-400MP4 OpenGL ES 2.0 (MOMO7)

・Vivante GC4000 OpenGL ES 2.0 (dtab 01)

OpenGL ES 2.0 デバイスの大半は GL_OES_depth_texture だけに対応しており
フィルタはかかりません。
depth_texture が無い Tegra2/3 は ColorBuffer で代用しています。
Tegra 4 は OpenGL ES 2.0 ですが Extension で GL_EXT_shadow_samplers に
対応しておりハードウエアで sampling できるようになっています。
同じように iOS の PowerVR Series5XT も OpenGL ES 2.0 ながら早くから
GL_EXT_shadow_samplers に対応していました。
iOS5/6 の当初は PCF もなく見た目が全く変わらなかったのですが、
iOS7 ではいつの間にかフィルタがかかるようになっていました。
なお同じ PowerVR Series5XT の GPU でも Android では残念ながら
shadow_samplers が使えない場合が多いです。
OpenGL ES 3.0 以降は PC 同様そのまま shadow samplers が使えます。
ただし結果は GPU やドライバによってかなり差があるようで、
Adreno 320 や PowerVR G6430 が 4 tap PCF のみ。
逆に Mali-T604 のフィルタは他より質が高くなっています。
Tegra 2 → Tegra 3 は core 数(速度) が違うだけで機能は全く同一でした。
対して Tegra 4 の GPU は、Tegra2/3 と比べると大幅に拡張されています。
機能面で見ればほぼ別 GPU といえるほど差があるのですが、
OpenGL ES 3.0 未対応など先行する他 GPU より見劣りする部分もあります。
DX9 世代の G70 ベースの限界なのか、それとも単に Tegra2/3 で
削っていた能力を元に戻しただけなのかもしれません。
一般的に NVIDIA に期待するイメージは強力な GPU でしょう。
ですがこれまでの Tegra は真逆で CPU に偏重した作りでした。
次の Tegra K1 以降はようやく NVIDIA らしい GPU になりそうです。
関連エントリ
・OpenGL ES 2.0 Adreno 330, Tegra 4 の GPU 速度

・Android Adreno 320 OpenGL ES 2.0 (HTC J butterfly HTL21 )

・Android Mali-T604 OpenGL ES 3.0 (Nexus 10 2012)


・Android Tegra 4 ULP GeForce(72) OpenGL ES 2.0 (Tegra Note 7)

・Android Tegra 3 ULP GeForce(12) OpenGL ES 2.0 (Nexus 7 2012)

・iOS7 PowerVR SGX543MP3 OpenGL ES 2.0 (iPhone 5)

・iOS7 PowerVR G6430 OpenGL ES 3.0 (iPhone 5s)

・RK3066 Mali-400MP4 OpenGL ES 2.0 (MOMO7)

・Vivante GC4000 OpenGL ES 2.0 (dtab 01)

OpenGL ES 2.0 デバイスの大半は GL_OES_depth_texture だけに対応しており
フィルタはかかりません。
depth_texture が無い Tegra2/3 は ColorBuffer で代用しています。
Tegra 4 は OpenGL ES 2.0 ですが Extension で GL_EXT_shadow_samplers に
対応しておりハードウエアで sampling できるようになっています。
同じように iOS の PowerVR Series5XT も OpenGL ES 2.0 ながら早くから
GL_EXT_shadow_samplers に対応していました。
iOS5/6 の当初は PCF もなく見た目が全く変わらなかったのですが、
iOS7 ではいつの間にかフィルタがかかるようになっていました。
なお同じ PowerVR Series5XT の GPU でも Android では残念ながら
shadow_samplers が使えない場合が多いです。
OpenGL ES 3.0 以降は PC 同様そのまま shadow samplers が使えます。
ただし結果は GPU やドライバによってかなり差があるようで、
Adreno 320 や PowerVR G6430 が 4 tap PCF のみ。
逆に Mali-T604 のフィルタは他より質が高くなっています。
OS OpenGL depth-tex sh-sample PCF Linear ----------------------------------------------------------------- APQ8064 Adreno 320 A44 ES 3.0 ◎ ◎ ◎ -- APQ8064 Adreno 320 A41 ES 2.0 ◎ -- -- -- Exynos5 Dual Mali-T604 A44 ES 3.0 ◎ ◎ ◎ ◎ Tegra 4 ULP GeForce(72) A43 ES 2.0 ◎ ◎ ◎ ◎ Tegra 3 ULP GeForce(12) A44 ES 2.0 -- -- -- -- A6 PowerVR SGX543MP3 i70 ES 2.0 ◎ ◎ ◎ ◎ A7 PowerVR G6430 i70 ES 3.0 ◎ ◎ ◎ -- K3V2 Vivante GC4000 A41 ES 2.0 ◎ -- -- -- RK3066 Mali-400MP4 A41 ES 2.0 ◎ -- -- -- OMAP4430 PowerVR SGX540 A42 ES 2.0 ◎ -- -- --
Tegra 2 → Tegra 3 は core 数(速度) が違うだけで機能は全く同一でした。
対して Tegra 4 の GPU は、Tegra2/3 と比べると大幅に拡張されています。
機能面で見ればほぼ別 GPU といえるほど差があるのですが、
OpenGL ES 3.0 未対応など先行する他 GPU より見劣りする部分もあります。
DX9 世代の G70 ベースの限界なのか、それとも単に Tegra2/3 で
削っていた能力を元に戻しただけなのかもしれません。
一般的に NVIDIA に期待するイメージは強力な GPU でしょう。
ですがこれまでの Tegra は真逆で CPU に偏重した作りでした。
次の Tegra K1 以降はようやく NVIDIA らしい GPU になりそうです。
関連エントリ
・OpenGL ES 2.0 Adreno 330, Tegra 4 の GPU 速度
2009/09/04
OpenGL GLSL のバージョン
GeometryShader 利用時に GLSL のバージョンの違いが問題になったのでまとめてみました。
・Wikipedia GLSL
OpenGL ES 2.0 の GLSL は、GLSL ES または ESSL と呼ばれています。
上の対応表では OpenGL 2.0 / GLSL 1.1 の列にありますが、GLSL ES 1.0 自体は
GLSL 1.2 の機能も含まれています。実際は OpenGL 2.0~2.1 の中間になります。
OpenGL 2.0 で GLSL が core に組み込まれました。
OpenGL 3.0 / GLSL 1.3 で大きな仕様変更があり、シェーダーも固定機能の排除が
進められています。attribute/varying が in/out に変更になったのもここです。
Direct3D との対応付けは難しいですが、おそらく OpenGL 2.0 が Direct3D 9、
OpenGL 3.0 が ShaderModel 4.0 の Direct3D 10 に近い位置づけです。
実際はここまで明確な区別が無く、もっと入り組んでいるし互換性も保たれています。
機能拡張も段階的に進められています。
例えば OpenGL 3.1 で Uniform Block / Uniform Buffer が追加されていて、
これはちょうど Direct3D 10 の ConstantBuffer に相当するものです。
OpenGL 3.2 では Geometry Shader が入りました。
GLES と GLSL ES (ESSL) は「 #ifdef GL_ES 」で区別できます。
昨日はむりやり define して動かしましたが、下記のような定義でシェーダーを共有
することにしました。
OpenGL ES のコンパイラには少々問題があって、ソースの先頭に #version が無いと
エラーになるようです。コンパイルオプションの切り替えのために複数のソースを
渡しているせいか、#version をどこに書いてもエラーとなってしまいました。
上の定義では OpenGL ES 側に #version を書いていないのはそのためです。
関連エントリ
・OpenGL 3.2 の GeometryShader
・OpenGL のはじめ方
・OpenGL ES 2.0 Emulator
・OpenGL ES 2.0
・OpenGLES2.0 DDS テクスチャを読み込む
・OpenGLES2.0 Direct3D とのフォーマット変換
・OpenGLES 2.0 頂点フォーマットの管理
・OpenGLES2.0 の頂点
・OpenGLES2.0 D3D座標系
・OpenGLES2.0 シェーダー管理
OpenGL 1.3 ---- OpenGL ES 1.0 ----
OpenGL 1.5 *1 OpenGL ES 1.1 ----
OpenGL 2.0 GLSL 1.1 OpenGL ES 2.0 GLSL ES 1.0 (ESSL)
OpenGL 2.1 GLSL 1.2
OpenGL 3.0 GLSL 1.3
OpenGL 3.1 GLSL 1.4
OpenGL 3.2 GLSL 1.5
*1: Shader 対応。Extension で GLSL1.0 も利用可能。Core API になったのは OpenGL 2.0 から。
・Wikipedia GLSL
OpenGL ES 2.0 の GLSL は、GLSL ES または ESSL と呼ばれています。
上の対応表では OpenGL 2.0 / GLSL 1.1 の列にありますが、GLSL ES 1.0 自体は
GLSL 1.2 の機能も含まれています。実際は OpenGL 2.0~2.1 の中間になります。
OpenGL 2.0 で GLSL が core に組み込まれました。
OpenGL 3.0 / GLSL 1.3 で大きな仕様変更があり、シェーダーも固定機能の排除が
進められています。attribute/varying が in/out に変更になったのもここです。
Direct3D との対応付けは難しいですが、おそらく OpenGL 2.0 が Direct3D 9、
OpenGL 3.0 が ShaderModel 4.0 の Direct3D 10 に近い位置づけです。
実際はここまで明確な区別が無く、もっと入り組んでいるし互換性も保たれています。
機能拡張も段階的に進められています。
例えば OpenGL 3.1 で Uniform Block / Uniform Buffer が追加されていて、
これはちょうど Direct3D 10 の ConstantBuffer に相当するものです。
OpenGL 3.2 では Geometry Shader が入りました。
GLES と GLSL ES (ESSL) は「 #ifdef GL_ES 」で区別できます。
昨日はむりやり define して動かしましたが、下記のような定義でシェーダーを共有
することにしました。
// Vertex Shader #ifdef GL_ES # define IN attribute # define OUT varying # define LOWP lowp # define MEDIUMP mediump precision MEDIUMP float; precision MEDIUMP int; #else # define IN in # define OUT out # version 150 # define LOWP # define MEDIUMP #endif
// Fragment Shader #ifdef GL_ES # define IN varying # define LOWP lowp # define MEDIUMP mediump precision MEDIUMP float; precision MEDIUMP int; precision LOWP sampler2D; #else # define IN in # version 150 # define LOWP # define MEDIUMP #endif
OpenGL ES のコンパイラには少々問題があって、ソースの先頭に #version が無いと
エラーになるようです。コンパイルオプションの切り替えのために複数のソースを
渡しているせいか、#version をどこに書いてもエラーとなってしまいました。
上の定義では OpenGL ES 側に #version を書いていないのはそのためです。
関連エントリ
・OpenGL 3.2 の GeometryShader
・OpenGL のはじめ方
・OpenGL ES 2.0 Emulator
・OpenGL ES 2.0
・OpenGLES2.0 DDS テクスチャを読み込む
・OpenGLES2.0 Direct3D とのフォーマット変換
・OpenGLES 2.0 頂点フォーマットの管理
・OpenGLES2.0 の頂点
・OpenGLES2.0 D3D座標系
・OpenGLES2.0 シェーダー管理
2013/04/03
モバイルデバイスは Game Console を超えたかどうか
Mobile Device はここ数年かなりの速度で向上しており勢いが衰えていません。
GPU, CPU ともに今までテストしてきたとおり、PC や専用機に匹敵する能力を
有するようになって来ました。
●個性が偏るモバイルプロセッサ
PC と同じように端末の性能には大きな開きがあります。
現時点で入手可能な最速の CPU はSnapdragon APQ8064 (Krait Quad core) Snapdragon 600 APQ8064T (Krait 300 Quad core) でしょう。
明日 2013/04/04 には 1.7GHz の Optimus G Pro L-04E が発売予定となっています。
・日本で発売されたスマートフォン、Tablet 等の全リスト
今すぐ手に入る端末の GPU では間違いなく iPad4 の A6X が最速です。
・Mobile GPU bench mark
PowerVR SGX500~ の型番を持つ GPU は数多く存在しますが、
大きく分けて 2種類あります。
型番が似ているのでややこしいですが、この両者は PVRTC2, ShadowSampler,
演算精度, MultiCore など機能的な違いもあります。
その中でも最上位 SGX554MP4 を搭載しているのは iPad4 の A6X だけです。
このようにハイエンドの端末といってもそれぞれ何を重視するかによって評価が変わります。
Apple は GPU を最優先しており、その反面 CPU で Quad core の端末はまだ存在していません。
方向性で真逆なのが NVIDIA Tegra です。
率先して Dual core, Quad core の Tegra2/3 を展開してきたものの
トレードオフとして GPU 機能が弱く、描画性能も芳しくありません。
よって、性能差だけでなく性格付けでも特性がバラバラなのがこれまでの
モバイルデバイスの特徴でした。
・トレードオフがあるため一部分だけ秀でている
・メーカー毎に強化している分野が異なる
ただし次の世代ではこれらのアンバランスさがかなり解消されると考えられます。
●世代交代
他社に先駆けて GPU/CPU ともに世代交代を果たした Qualcomm では、
特別突出した点はないものの平均的に全体の性能が高くなっています。
また今後登場予定の Tegra4 は CPU core が刷新されるだけでなく、
ようやく NVIDIA らしい GPU へと強化が行われるようです。
・4gamer: [GDC 2013]タッチパネルは対応しなくていい? Androidの掟破りが連発された「Project SHIELD」向けゲーム開発指南
Tegra2/3 の GPU である ULP GeForce は Shader Unit が discrete で
あることから GeForce6800/7800 世代と言われていましたが、
機能的には大幅に削られたものでした。
例えば GeForce の特徴的な機能だった NVIDIA ShadowMap (PCF) が
Tegra2/3 には搭載されていません。
それどころか今まで試した GPU の中では、Tegra2/3 だけが 24bit depth
や depth_texture に未対応でした。
他社の GPU 、Adreno, PowerVR, Mali, Vivante はみなこれらの Extension
に対応しているにもかかわらずです。
上記サイトのスライド写真を見ると Tegra4 でようやく機能差が解消されており、
かつ Hardware PCF が搭載されるなど、期待した GeForce 6800/7800 クラスの
GPU となるようです。
ざっくりと 4 pixel pipe なので能力的にはおそらく無印 GeForce 6800 くらい
ではないでしょうか。
pixel rate は PS3/Xbox360 世代の半分ですが、メモリ帯域からも納得できる数値です。
もちろん予想に過ぎないので、実際に手に入れてみるまでは本当の性能はわかりません。
CPU/GPU 共に世代交代によって、一点集中型から平均的な性能向上に向かうと
考えられます。極端な個性付けはおそらく減っていくのではないでしょうか。
●コンソールとの比較
Xbox1/GC 時代のコンソールは確実に超えています。
まず CPU の速度が桁違いで、GPU 性能もシェーダーなどはるかに高機能です。
ただしフィルレートに特化した PS2 の特殊なハードウエアは正しく比べることができません。
またモバイルデバイスに要求される解像度はコンソールよりも高いので、
その点も考慮する必要があります。
誰が見ても明らかな点としては RAM 容量があります。
スマートフォンもタブレットも 1GB~2GB の RAM 容量が当たり前となっており、
この点では現行コンソールよりも余裕があります。
●実デバイスでの CPU の速度
実在のデバイスでの性能比較
(実測ではなくスペックからの算出値なので注意)
CPU core が異なっていると比較が難しいためあくまで目安として見てください。
DMIPS/clock は同一 clock で比較した core 単体の能力で、
これを clock*core 倍したものが DMIPS*core となっています。
Xbox360 の DMIPS/clock はWikipedia Instructions per second を元にしています。
ただし同一性能のはずの PS3 PPE が 3.2 なので、Xbox360 の実際のスコアは
もっと高い可能性があります。(括弧内の数値は 3.2 を元にした場合)
PS3 の Cell は特殊で簡単に比較することができません。
・CPU core list
今後登場するであろう Exynos 5 Octa (Cortex-A15 x4) や Tegra4 (Cortex-A15 x4)
のスコアを予想すると下記の通りです。
あまり厳密な比較ではないかもしれませんが、CPU 能力で現行コンソールに
匹敵するレベルに達しつつあることは事実です。
ただし、単精度の浮動小数点演算能力では敵いません。
特に Cell は圧倒的で、フィルレートの怪物だった PS2 と同じように、
一部分(浮動小数点演算能力)において突出した能力を持っています。
予想では多分 PS4 でも CPU 単体の浮動小数点演算能力においては Cell に
届かないのではないかと思います。
その代わり GPU にストリーム処理を任せられるので、
GPU を補っていた Cell とは逆の立場になります。
●GPU の速度
・Mobile Device は非常に解像度が高い
・GPU の構造が異なっている
・Tegra は演算精度が違う
・機能面は同等
Smartphone でも Full HD、Tablet だと 2048x1536 や 2560x1600 など
かなりの高解像度になりつつあります。
メモリ帯域も Shader サイクルも多くがピクセルに費やされます。
そのためたとえ GPU 性能が高くなっても相対的にはパワー不足に陥ります。
大半の GPU が TileBased となっており、Desktop GPU と構造が異なっています。
特に PowerVR は何もしなくても HW で Deferred Rendering を行うので、
ソフトウエアであまり凝ったことをすると逆効果となる可能性があります。
例えば Early Z Culling を効果的に使うには手前から描画しますが、
ピクセル単位でフラグメントが除去される TBDR では不要です。
またポストエフェクトのようにフレームバッファを再利用すると追加コストが
発生する可能性があります。
この辺りを意識して作られていない場合、ただ移植しただけでは
Mobile GPU ではあまり性能が出ないかもしれません。
その点 Tegra は Immediate Mode なので Desktop GPU と同じ考え方が通用します。
実際にテストしたわけではないので憶測ですが、上にも書いたとおり
およそ Tegra4 で現行 console の半分くらいではないかと思われます。
ただし Tegra シリーズの PixelShader は演算精度が mediump です。
精度が必要なシェーダーは動かない可能性がありますし、
HW Shadow Sampler の対応は必然だったのかもしれません。
また mediump を基準とするなら PowerVR もパフォーマンスが上がるので、
fp32 の GPU との単純な FLOPS 比較は無理があるように思います。
なお Qualcomm の Adreno は PixelShader の演算精度も GPU 機能も
コンソールと比べて遜色ありません。
・シェーダーや Extension 等、GPU 機能は現行コンソールと完全に同等
・描画速度では根拠となるデータが乏しい (が、おそらく負けてる)
●まとめ
結論としては、内部構造を熟知しているわけでも実測したわけでもないので根拠が
無いですが、GPU 性能やゲームで重要な単精度の浮動小数点演算性能でも
Xbox360/PS3 の方が上でしょう。
さらに高解像度であることやバス帯域の限界もあり、実アプリケーションでは
GPU 性能以上に隔たりが生じているのが現状ではないかと思います。
ただし性能の上昇は急激で、時間の問題であることは確かです。
特に RAM 容量では勝り、CPU の実行性能も差が無くなりつつあります。
関連ページ
・SoC list
・Mobile GPU/CPU 関連の情報まとめ
関連エントリ
・PlayStation 4
GPU, CPU ともに今までテストしてきたとおり、PC や専用機に匹敵する能力を
有するようになって来ました。
●個性が偏るモバイルプロセッサ
PC と同じように端末の性能には大きな開きがあります。
現時点で入手可能な最速の CPU は
明日 2013/04/04 には 1.7GHz の Optimus G Pro L-04E が発売予定となっています。
・日本で発売されたスマートフォン、Tablet 等の全リスト
今すぐ手に入る端末の GPU では間違いなく iPad4 の A6X が最速です。
・Mobile GPU bench mark
PowerVR SGX500~ の型番を持つ GPU は数多く存在しますが、
大きく分けて 2種類あります。
PowerVR Series 5 SGX530, SGX535, SGX540 PowerVR Series 5XT SGX543MP, SGX544MP, SGX554MP
型番が似ているのでややこしいですが、この両者は PVRTC2, ShadowSampler,
演算精度, MultiCore など機能的な違いもあります。
その中でも最上位 SGX554MP4 を搭載しているのは iPad4 の A6X だけです。
このようにハイエンドの端末といってもそれぞれ何を重視するかによって評価が変わります。
Apple は GPU を最優先しており、その反面 CPU で Quad core の端末はまだ存在していません。
方向性で真逆なのが NVIDIA Tegra です。
率先して Dual core, Quad core の Tegra2/3 を展開してきたものの
トレードオフとして GPU 機能が弱く、描画性能も芳しくありません。
よって、性能差だけでなく性格付けでも特性がバラバラなのがこれまでの
モバイルデバイスの特徴でした。
・トレードオフがあるため一部分だけ秀でている
・メーカー毎に強化している分野が異なる
ただし次の世代ではこれらのアンバランスさがかなり解消されると考えられます。
●世代交代
他社に先駆けて GPU/CPU ともに世代交代を果たした Qualcomm では、
特別突出した点はないものの平均的に全体の性能が高くなっています。
また今後登場予定の Tegra4 は CPU core が刷新されるだけでなく、
ようやく NVIDIA らしい GPU へと強化が行われるようです。
・4gamer: [GDC 2013]タッチパネルは対応しなくていい? Androidの掟破りが連発された「Project SHIELD」向けゲーム開発指南
Tegra2/3 の GPU である ULP GeForce は Shader Unit が discrete で
あることから GeForce6800/7800 世代と言われていましたが、
機能的には大幅に削られたものでした。
例えば GeForce の特徴的な機能だった NVIDIA ShadowMap (PCF) が
Tegra2/3 には搭載されていません。
それどころか今まで試した GPU の中では、Tegra2/3 だけが 24bit depth
や depth_texture に未対応でした。
他社の GPU 、Adreno, PowerVR, Mali, Vivante はみなこれらの Extension
に対応しているにもかかわらずです。
上記サイトのスライド写真を見ると Tegra4 でようやく機能差が解消されており、
かつ Hardware PCF が搭載されるなど、期待した GeForce 6800/7800 クラスの
GPU となるようです。
ざっくりと 4 pixel pipe なので能力的にはおそらく無印 GeForce 6800 くらい
ではないでしょうか。
pixel rate は PS3/Xbox360 世代の半分ですが、メモリ帯域からも納得できる数値です。
Xbox360 22.4GB/s (+32.0GB/s) PS3 22.4GB/s (+25.6GB/s) Tegra4 14.9GB/s
もちろん予想に過ぎないので、実際に手に入れてみるまでは本当の性能はわかりません。
CPU/GPU 共に世代交代によって、一点集中型から平均的な性能向上に向かうと
考えられます。極端な個性付けはおそらく減っていくのではないでしょうか。
●コンソールとの比較
Xbox1/GC 時代のコンソールは確実に超えています。
まず CPU の速度が桁違いで、GPU 性能もシェーダーなどはるかに高機能です。
ただしフィルレートに特化した PS2 の特殊なハードウエアは正しく比べることができません。
またモバイルデバイスに要求される解像度はコンソールよりも高いので、
その点も考慮する必要があります。
mem B/W CPU RAM screen --------------------------------------------------------------- GC 2.6GB/s (+?) 0.5GHz x1 24MB SD 480 PS2 3.2GB/s (+48.0GB/s) 0.3GHz x1 32MB SD 480 Xbox1 6.4GB/s 0.8GHz x1 64MB SD 480 Xbox360 22.4GB/s (+32.0GB/s) 3.2GHz x3 512MB HD 720 PS3 22.4GB/s (+25.6GB/s) 3.2GHz x7 512MB HD 720 PS4 176.0GB/s ?.?GHz x8 8GB HD 1080 Tegra3 6.0GB/s 1.7GHz x4 1~2GB APQ8064 8.5GB/s 1.7GHz x4 HD 1080 A5X 12.8GB/s 1.0GHz x2 1GB HD 1536 Tegra4 14.9GB/s 1.9GHz x4 A6X 17.0GB/s 1.?GHz x2 1GB HD 1536
誰が見ても明らかな点としては RAM 容量があります。
スマートフォンもタブレットも 1GB~2GB の RAM 容量が当たり前となっており、
この点では現行コンソールよりも余裕があります。
●実デバイスでの CPU の速度
実在のデバイスでの性能比較
(実測ではなくスペックからの算出値なので注意)
CPU Clock DMIPS/clock DMIPS*core ------------------------------------------------------------------------- Nexus 10 Exynos 5 Cortex-A15 x2 1.7GHz 3.5 11.90 ARROWS X F-02E Tegra3 Cortex-A9 x4 1.7GHz 2.5 17.00 Optimus G Pro L-04E APQ8064T Krait 300 x4 1.7GHz 3.3 22.44 Xbox360 Xenon PPC core x3 3.2GHz 2.0~(3.2) 19.20~(30.72) ・DMIPS*core が総合性能(目安)で数値が大きい方が速い
CPU core が異なっていると比較が難しいためあくまで目安として見てください。
DMIPS/clock は同一 clock で比較した core 単体の能力で、
これを clock*core 倍したものが DMIPS*core となっています。
Xbox360 の DMIPS/clock はWikipedia Instructions per second を元にしています。
ただし同一性能のはずの PS3 PPE が 3.2 なので、Xbox360 の実際のスコアは
もっと高い可能性があります。(括弧内の数値は 3.2 を元にした場合)
PS3 の Cell は特殊で簡単に比較することができません。
・CPU core list
今後登場するであろう Exynos 5 Octa (Cortex-A15 x4) や Tegra4 (Cortex-A15 x4)
のスコアを予想すると下記の通りです。
CPU Clock DMIPS/clock DMIPS*core ------------------------------------------------------------------------- Exynos 5 Octa Cortex-A15 x4 1.6GHz 3.5 22.40 Tegra4 Cortex-A15 x4 1.9GHz 3.5 26.60
あまり厳密な比較ではないかもしれませんが、CPU 能力で現行コンソールに
匹敵するレベルに達しつつあることは事実です。
ただし、単精度の浮動小数点演算能力では敵いません。
CPU fp-op/core core clock GFLOPS ---------------------------------------------------------------- Xbox360 Xenon PPC 12 3 3.2GHz 115.2 PS3 Cell BE 12+8 1+7 3.2GHz 217.6 Tegra3 Cortex-A9 4 4 1.7GHz 27.2 APQ8064 Krait 8 4 1.7GHz 54.4 Tegra4 Cortex-A15 8 4 1.9GHz 60.8 ・GFLOPS が大きいほうが速い。 ・理論値なのでこの通りの性能が出るわけではありません。
特に Cell は圧倒的で、フィルレートの怪物だった PS2 と同じように、
一部分(浮動小数点演算能力)において突出した能力を持っています。
予想では多分 PS4 でも CPU 単体の浮動小数点演算能力においては Cell に
届かないのではないかと思います。
その代わり GPU にストリーム処理を任せられるので、
GPU を補っていた Cell とは逆の立場になります。
●GPU の速度
・Mobile Device は非常に解像度が高い
・GPU の構造が異なっている
・Tegra は演算精度が違う
・機能面は同等
Smartphone でも Full HD、Tablet だと 2048x1536 や 2560x1600 など
かなりの高解像度になりつつあります。
メモリ帯域も Shader サイクルも多くがピクセルに費やされます。
そのためたとえ GPU 性能が高くなっても相対的にはパワー不足に陥ります。
大半の GPU が TileBased となっており、Desktop GPU と構造が異なっています。
特に PowerVR は何もしなくても HW で Deferred Rendering を行うので、
ソフトウエアであまり凝ったことをすると逆効果となる可能性があります。
例えば Early Z Culling を効果的に使うには手前から描画しますが、
ピクセル単位でフラグメントが除去される TBDR では不要です。
またポストエフェクトのようにフレームバッファを再利用すると追加コストが
発生する可能性があります。
この辺りを意識して作られていない場合、ただ移植しただけでは
Mobile GPU ではあまり性能が出ないかもしれません。
その点 Tegra は Immediate Mode なので Desktop GPU と同じ考え方が通用します。
実際にテストしたわけではないので憶測ですが、上にも書いたとおり
およそ Tegra4 で現行 console の半分くらいではないかと思われます。
ただし Tegra シリーズの PixelShader は演算精度が mediump です。
精度が必要なシェーダーは動かない可能性がありますし、
HW Shadow Sampler の対応は必然だったのかもしれません。
また mediump を基準とするなら PowerVR もパフォーマンスが上がるので、
fp32 の GPU との単純な FLOPS 比較は無理があるように思います。
なお Qualcomm の Adreno は PixelShader の演算精度も GPU 機能も
コンソールと比べて遜色ありません。
・シェーダーや Extension 等、GPU 機能は現行コンソールと完全に同等
・描画速度では根拠となるデータが乏しい (が、おそらく負けてる)
●まとめ
結論としては、内部構造を熟知しているわけでも実測したわけでもないので根拠が
無いですが、GPU 性能やゲームで重要な単精度の浮動小数点演算性能でも
Xbox360/PS3 の方が上でしょう。
さらに高解像度であることやバス帯域の限界もあり、実アプリケーションでは
GPU 性能以上に隔たりが生じているのが現状ではないかと思います。
ただし性能の上昇は急激で、時間の問題であることは確かです。
特に RAM 容量では勝り、CPU の実行性能も差が無くなりつつあります。
関連ページ
・SoC list
・Mobile GPU/CPU 関連の情報まとめ
関連エントリ
・PlayStation 4