GPU acceleration with SPI displays (STM32MP157 with Vivante GPU)

Josef Luštický josef.lusticky at braiins.cz
Fri Aug 1 11:06:49 UTC 2025


Hello,
I am trying to get GPU acceleration to work with SPI display using
ili9225_dri.so,
and I use kmscube to test.
The SoC is STM32MP157c with Vivante GC400 GPU and I use Mesa3D 24.0.9
(rootfs generated with Buildroot 2025.02.3) and kernel 5.10.176 (from
STM).

I also have the same system with MIPI Display attached.
While kmscube renders at 60 fps with the MIPI Display system, I get
only 11 fps with the SPI display. Apart from that both systems are the
same.

I checked the output of kmscube and it prints the exact same extensions on both,
the only difference is the framerate.
I also checked output of kmscube's /proc/PID/maps and the only
difference is that with MIPI Display it loads /usr/lib/dri/stm_dri.so
while with the SPI Display it loads /usr/lib/dri/ili9225_dri.so,
but I see those files are the same (hardlinks).
Both open /dev/dri/renderD128 (GPU).

Why am I getting just 11 fps on the system with SPI Display?
Is there some architectural limitation, either in Mesa, kernel, or HW-related?
I suppose both setups use kernel's KMS as renderer only (kmsro), thus
it should render at the same framerate.
The difference in HW is the peripheral the displays use - LTDC
(stm_dri.so) vs. SPI (eventually ili9225_dri.so).
Why do I see no /usr/lib/etnaviv_dri.so loaded?

The MIPI Display is attached to the LTDC (LCD Timing Display
Controller) peripheral of the STM SoC and the display driver is
drivers/gpu/drm/panel/panel-sitronix-st7703.c (DRM panel).

The SPI display driver uses the kernel's TinyDRM API and its driver is
drivers/gpu/drm/tiny/ili9225.c.

I also tried softpipe (disabled GPU in device-tree) and it renders 7
fps on both systems.

I attach the output from kmscube on the SPI Display system (the MIPI
Display is the same except framerate is 60 fps.)

Kind regards
Josef Lusticky
-------------- next part --------------
# kmscube
Using display 0x6f62d8 with EGL version 1.4
===================================
EGL information:
  version: "1.4"
  vendor: "Mesa Project"
  client extensions: "EGL_EXT_client_extensions EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addres
ses EGL_KHR_debug EGL_EXT_platform_device EGL_EXT_explicit_device EGL_MESA_platform_gbm EGL_KHR_platform_gbm EGL_MESA_platform_surfaceless"
  display extensions: "EGL_ANDROID_blob_cache EGL_ANDROID_native_fence_sync EGL_EXT_buffer_age EGL_EXT_image_dma_buf_import EGL_EXT_image_dma_buf_import_modifiers EGL_KHR_c
l_event2 EGL_KHR_config_attribs EGL_KHR_context_flush_control EGL_KHR_create_context EGL_KHR_create_context_no_error EGL_KHR_fence_sync EGL_KHR_get_all_proc_addresses EGL_K
HR_gl_renderbuffer_image EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_cubemap_image EGL_KHR_image EGL_KHR_image_base EGL_KHR_image_pixmap EGL_KHR_no_config_context EGL_KH
R_reusable_sync EGL_KHR_surfaceless_context EGL_EXT_pixel_format_float EGL_KHR_wait_sync EGL_MESA_configless_context EGL_MESA_drm_image EGL_MESA_gl_interop EGL_MESA_image_d
ma_buf_export EGL_MESA_query_driver "
===================================
OpenGL ES 2.x information:
  version: "OpenGL ES 2.0 Mesa 24.0.9"
  shading language version: "OpenGL ES GLSL ES 1.0.16"
  vendor: "Mesa"
  renderer: "Vivante GC400 rev 4652"
  extensions: "GL_EXT_blend_minmax GL_EXT_multi_draw_arrays GL_EXT_texture_compression_s3tc GL_EXT_texture_compression_dxt1 GL_EXT_texture_format_BGRA8888 GL_OES_compressed
_ETC1_RGB8_texture GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_stencil8 GL_OES_t
exture_npot GL_OES_vertex_half_float GL_OES_EGL_image GL_OES_depth_texture GL_AMD_performance_monitor GL_OES_packed_depth_stencil GL_OES_get_program_binary GL_APPLE_texture
_max_level GL_EXT_discard_framebuffer GL_EXT_read_format_bgra GL_NV_pack_subimage GL_NV_texture_barrier GL_EXT_frag_depth GL_NV_fbo_color_attachments GL_OES_EGL_image_exter
nal GL_OES_EGL_sync GL_OES_vertex_array_object GL_ANGLE_pack_reverse_row_order GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_EXT_unpack_subimage GL
_NV_draw_buffers GL_NV_read_buffer GL_NV_read_depth GL_NV_read_depth_stencil GL_NV_read_stencil GL_APPLE_sync GL_EXT_draw_buffers GL_EXT_map_buffer_range GL_KHR_debug GL_NV
_pixel_buffer_object GL_OES_required_internalformat GL_OES_surfaceless_context GL_EXT_debug_label GL_EXT_separate_shader_objects GL_EXT_compressed_ETC1_RGB8_sub_texture GL_
EXT_draw_elements_base_vertex GL_EXT_texture_border_clamp GL_KHR_context_flush_control GL_OES_draw_elements_base_vertex GL_OES_texture_border_clamp GL_KHR_no_error GL_KHR_p
arallel_shader_compile GL_INTEL_blackhole_render GL_MESA_sampler_objects GL_MESA_bgra "
===================================
Rendered 23 frames in 2.004054 sec (11.476739 fps)
Rendered 46 frames in 4.007773 sec (11.477695 fps)


More information about the mesa-dev mailing list