Nexus 7 (2013) が発売されたので、
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 版の結果から