※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.
iPhone 5s의 Apple A7 GPU
(원문 : iPhone 5s の Apple A7 GPU)
A7의 GPU는 「Apple A7 GPU」라고 표시되며 독자적인 이름이 붙어있습니다.
GL_VERSION: OpenGL ES 3.0 Apple A7 GPU - 27.10 GL_RENDERER: Apple A7 GPU GL_VENDOR: Apple Inc. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00
PVRTC에 대응하므로 PowerVR 계열일 가능성이 높습니다. 하지만 PVRTC(v2)가 없고 범용성이 높은 ETC2/EAC로 바뀌기도 해서 PowerVR에 의존하는 방침전환이 엿보이는 것 같습니다.
Mali-T604, Adreno 320과의 비교입니다. (참고)
Nexus 7 (2013) Nexus 10 iPhone 5s Adreno 320 Mali-T604 A7 GPU ------------------------------------------------------------------------- === GL3:texture GL_MAX_3D_TEXTURE_SIZE 1024 4096 2048 GL_MAX_TEXTURE_SIZE 4096 4096 4096 GL_MAX_ARRAY_TEXTURE_LAYERS 256 4096 2048 GL_MAX_TEXTURE_LOD_BIAS 15.984 255.996 16.000 GL_MAX_CUBE_MAP_TEXTURE_SIZE 4096 4096 4096 GL_MAX_RENDERBUFFER_SIZE 4096 4096 4096 GL_MAX_DRAW_BUFFERS 4 4 4 GL_MAX_COLOR_ATTACHMENTS 4 4 4 GL_MAX_VIEWPORT_DIMS 4096 4096 4096 === GL3:elements GL_MAX_ELEMENTS_INDICES -1 16777216 150000 GL_MAX_ELEMENTS_VERTICES -1 16777216 1048575 === GL3:vertex GL_MAX_VERTEX_ATTRIBS 16 16 16 GL_MAX_VERTEX_OUTPUT_COMPONENTS 69 64 64 === GL3:pixel GL_MAX_FRAGMENT_INPUT_COMPONENTS 71 60 64 === GL3:program GL_MIN_PROGRAM_TEXEL_OFFSET -8 -8 -8 GL_MAX_PROGRAM_TEXEL_OFFSET 7 7 7 GL_MAX_VARYING_COMPONENTS 64 60 60 GL_MAX_VARYING_VECTORS 16 15 15 === GL3:output stream GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 64 64 64 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 4 4 4 GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 4 4 4 GL_MAX_SAMPLES 4 4 8 === GL3:uniform block GL_MAX_VERTEX_UNIFORM_COMPONENTS 1024 1024 2048 GL_MAX_VERTEX_UNIFORM_VECTORS 256 256 512 GL_MAX_VERTEX_UNIFORM_BLOCKS 12 12 12 GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS -- 50176 51200 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 896 4096 896 GL_MAX_FRAGMENT_UNIFORM_VECTORS 224 1024 224 GL_MAX_FRAGMENT_UNIFORM_BLOCKS 12 12 12 GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 197504 53248 50048 GL_MAX_UNIFORM_BUFFER_BINDINGS 24 36 24 GL_MAX_UNIFORM_BLOCK_SIZE 65536 16384 16384 GL_MAX_COMBINED_UNIFORM_BLOCKS 24 24 24 === GL3:tex GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 16 16 16 GL_MAX_TEXTURE_IMAGE_UNITS 16 16 16 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 32 32 32
지금까지와는 다른 GPU라는 것을 알 수 있습니다.
Uniform Block 수는 다른 것과 마찬가지로 12입니다. Fragment의 Uniform 수는 Adreno와 마찬가지로 OpenGL ES 3.0의 최소치인 896(224)으로 Vertex 쪽이 높게 설정되어 있습니다. PowerVR 5는 다른 GPU와 비교해도 Uniform 수가 적어, 한번에 전송할 수 있는 데이터 량에 제한이 있었습니다. OpenGL ES 3.0의 A7에서는 이 부분이 해소되어 오히려 여유가 있습니다.
다만 OpenGL ES 2.0 Context에서의 호환성을 위해서인지 종래의 PowerVR SGX 5 계와 같은 값이 리턴되는 듯 합니다.
GL_VERSION: OpenGL ES 2.0 Apple A7 GPU - 27.10 GL_RENDERER: Apple A7 GPU GL_VENDOR: Apple Inc. GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 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 === GL2:texture GL_MAX_TEXTURE_SIZE 4096 GL_MAX_CUBE_MAP_TEXTURE_SIZE 4096 GL_MAX_VIEWPORT_DIMS 4096 === GL2:vertex GL_MAX_VERTEX_ATTRIBS 16 GL_MAX_VERTEX_UNIFORM_VECTORS 128 GL_MAX_VARYING_VECTORS 8 === GL2:pixel GL_MAX_FRAGMENT_UNIFORM_VECTORS 64 GL_MAX_RENDERBUFFER_SIZE 4096 === GL2:tex GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 8 GL_MAX_TEXTURE_IMAGE_UNITS 8 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 8 TextureFormat 4 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
Android 4.3 + OpenGL ES 3.0의 경우에는 사실상 2.0와 3.0으로 Context 차이가 없었지만, 이점에 있어서도 iOS다운 사양이 되어있습니다. 예를 들면 Android 4.2의 Mali-T604은 Fragment Uniform수가 256(vec4)였지만, 4.3에서는 OpenGL ES 2.0에서도 3.0과 마찬가지로 1024(vec4)를 리턴합니다.
OpenGL ES 2.0 Context에서는 Vertex Texture Unit이 유효하게 되어있다는 점이 마음에 걸립니다. A7만 그런건가 싶었지만 PowerVR SGX 5XT에서도 같은 값이 되어있으므로 iOS 7에서 추가된 것일지도 모르겠습니다.
위 글에도 적혀있습니다만 glGetShaderPrecisionFormat()의 결과에 차이가 보입니다. float lowp가 mediump와 같은 fp16이고, int highp도 32bit가 되어있습니다. 아래 페이지도 갱신했습니다.
다만 위 페이제도 적혀있듯 API로 얻을 수 있는 사양과 실제 연산결과가 다른 경우가 있습니다. 같은 fix10이라도 PowerVR series 5(SGX535/540) & Tegra2/3와 series 5XT(SGX543MP/554MP)는 셰이딩 결과에 차이가 있습니다. 5XT 쪽이 Fragment 부분만 lowp의 정밀도가 높아져있는 것으로 보입니다.
A7 GPU의 경우에는 처음부터 fp16이므로, 호환성 측면에서도 잘 맞춰진 사양이라 생각합니다.