※ 이 글은 오가사와라 히로유키(小笠原博之) 씨가 블로그에 적은 글을 번역한 것입니다. 사정에 따라 예고없이 삭제될 수 있으므로 양해부탁드립니다.

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이므로, 호환성 측면에서도 잘 맞춰진 사양이라 생각합니다.

관련 글

+ Recent posts