Platform: i.MX8MP, Vivante GC7000UL (model=7000, revision=6204)
GPU cores: GC7000UL 3D + GC520L 2D + GC8000 ML
Kernel type: PREEMPT_RT on both setups
========================================
Setup A (baseline):
========================================
Yocto 3.0, kernel 5.4 (PREEMPT_RT)
imx-gpu-viv 6.2.4.p4.0 (user-space)
kernel-module-imx-gpu-viv 6.2.4.p1.2
glmark2 2017.07, off-screen: score 697
========================================
Setup B (regression):
========================================
Yocto 5.0 (scarthgap), kernel 6.6 (PREEMPT_RT)
imx-gpu-viv 6.4.11.p2.4 (user-space)
kernel-module-imx-gpu-viv 6.4.11.p2.2
glmark2 2023.01, off-screen: score 426
Observed regression: ~39% lower score on identical hardware
at identical GPU clock (1 GHz).
GPU clock confirmed on Setup B:
gpu3d_core=1GHz
gpu3d_shader_core=1GHz
gpu2d_core=1GHz
gpu_axi=800MHz
gpu_ahb=400MHz
glmark2 output on Setup B:
GL_VENDOR: Vivante Corporation
GL_RENDERER: Vivante GC7000UL
GL_VERSION: OpenGL ES 3.1 V6.4.11.p2.745085
[build] use-vbo=false: FPS: 831
[build] use-vbo=true: FPS: 1243
[texture] nearest: FPS: 942
[texture] linear: FPS: 901
[texture] mipmap: FPS: 797
[shading] gouraud: FPS: 662
[shading] blinn-phong: FPS: 597
[shading] phong: FPS: 404
[shading] cel: FPS: 353
[bump] high-poly: FPS: 392
[bump] normals: FPS: 781
[bump] height: FPS: 512
[effect2d] 3x3 kernel: FPS: 263
[effect2d] 5x5 kernel: FPS: 113
[pulsar] <default>: FPS: 628
[desktop] blur: FPS: 128
[desktop] shadow: FPS: 282
[buffer] map: FPS: 135
[buffer] subdata: FPS: 134
[buffer] interleave: FPS: 185
[ideas] <default>: FPS: 175
[jellyfish] <default>: FPS: 188
[terrain] <default>: FPS: 19
[shadow] <default>: FPS: 390
[refract] <default>: FPS: 56
[conditionals] v=0,f=0: FPS: 733
[conditionals] v=0,f=5: FPS: 184
[conditionals] v=5,f=0: FPS: 696
[function] low,5: FPS: 334
[function] medium,5: FPS: 195
[loop] no-uniform: FPS: 327
[loop] non-uniform: FPS: 325
[loop] uniform: FPS: 203
glmark2 Score: 426
========================================
What we have ruled out (all tested, no improvement):
========================================
1. powerManagement=0 galcore module param -> no change
2. gcdPOWEROFF_TIMEOUT=0 (kernel patch) -> no change
3. gcdSHARED_PAGETABLE=0 (kernel patch) -> no change
4. GPU clock stuck (devfreq) -> no devfreq present,
clock confirmed 1 GHz
Note on gcdWAIT_LINK_FE_MODE: this define does not exist in
gc_hal_options.h in imx-gpu-viv 6.2.4. The V3.0 gc_hal_kernel.c
hardcodes gcvHW_FE_WAIT_LINK unconditionally anyway, so there is no
FE mode difference between the two setups. Setting
gcdWAIT_LINK_FE_MODE=0 in 6.4.11 forces gcvHW_FE_END mode which
results in a black screen and is not functional.
========================================
Root cause hypothesis:
========================================
Since imx-gpu-viv is a closed-source binary package and all
kernel-level tunables show no effect, we believe the regression is
inside the user-space shader compiler or command buffer generator in
imx-gpu-viv 6.4.11 vs 6.2.4. Fragment-shader-heavy scenes (phong,
cel, terrain, refract) show the largest relative drop, which is
consistent with a shader compiler quality regression.
========================================
Questions:
========================================
1. Is there a known performance regression in imx-gpu-viv 6.4.11 on
GC7000UL compared to 6.2.4?
2. Is there a newer imx-gpu-viv release (6.4.11.p3 or later) that
addresses this?
3. Are there any runtime environment variables (e.g. VIV_*) or Yocto
recipe options for imx-gpu-viv 6.4.11 that can improve OpenGL ES
fragment shader performance on i.MX8MP?