OpenGL on i.MX6 : bad performance

Jean-Michel Hautbois jhautbois at gmail.com
Tue Oct 7 06:23:01 PDT 2014


Hi there,

I am using openGL elements from gstreamer in particular glimagesink
and I also tried glvideomixer.

Here is a simple pipeline example :
export GST_GL_PLATFORM=egl
export GST_GL_API=gles2
export DISPLAY=:0
gst-launch-1.0 -vvv videotestsrc !
'video/x-raw,width=640,height=480,format=RGBA' ! imagefreeze !
glvideomixer ! 'video/x-raw,framerate=(fraction)30/1,width=1920,height=1080'
! glimagesink

This works but the CPU usage is very high, and I did some profiling in
order to understand how it works.

Here is the result (CPU consumption is ~75% in top).

First, the global picture :
:~# opreport
Using /var/lib/oprofile/samples/ for samples directory.
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)
Profiling through timer interrupt
          TIMER:0|
  samples|      %|
------------------
     4672 73.0000 vmlinux
      932 14.5625 libc-2.20.so
      375  5.8594 libGAL.so
      139  2.1719 libglib-2.0.so.0.4000.0
      116  1.8125 libpython2.7.so.1.0
       29  0.4531 libgstreamer-1.0.so.0.401.0
       21  0.3281 libpthread-2.20.so
       15  0.2344 libGLESv2.so.2.0.0
       15  0.2344 libX11.so.6.3.0
       13  0.2031 Xorg

Then, the kernel (Freescale 3.10.17) :
:~# opreport -l /boot/vmlinux
Using /var/lib/oprofile/samples/ for samples directory.
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)
Profiling through timer interrupt
samples  %        symbol name
1596     34.1610  _HandleOuterCache
844      18.0651  v7_dma_flush_range
737      15.7748  cpuidle_enter_state
161       3.4461  get_page_from_freelist
139       2.9752  __memzero
120       2.5685  free_hot_cold_page

For the libc I don't have symbols, but using nm I can tell this is memcpy()

~# opreport -l /usr/lib/libGAL.so
Using /var/lib/oprofile/samples/ for samples directory.
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)
Profiling through timer interrupt
samples  %        symbol name
293      80.2740  gcoHARDWARE_UploadTexture
6         1.6438  gcoSURF_QueryFormat
3         0.8219  _AllocateSurface
3         0.8219  gcoHARDWARE_GetPatchID

This seems ok, but if the pipeline is a little bit more complex, the
problems start.
Let's add a freezed image in the background, and this is not usuable.

gst-launch-1.0 -vv \
videotestsrc pattern=19 is-live=true !
'video/x-raw,width=1920,height=1080,format=RGBA' ! imagefreeze ! mix.
\
glvideomixer name=mix ! glimagesink \
videotestsrc is-live=true !
'video/x-raw,width=320,height=240,format=RGBA' ! imagefreeze ! mix.

CPU is ~91%
But now there are some messages like :
gst_base_sink_is_too_late ():
/GstPipeline:pipeline0/GstGLImageSink:glimagesink0:There may be a
timestamping problem, or this computer is too slow.

Here is what the profiler tells :
~# opreport
Using /var/lib/oprofile/samples/ for samples directory.
CPU: CPU with timer interrupt, speed 996000 MHz (estimated)
Profiling through timer interrupt
          TIMER:0|
  samples|      %|
------------------
     1338 49.0829 vmlinux
     1229 45.0844 libc-2.20.so
       83  3.0448 libglib-2.0.so.0.4000.0
       34  1.2472 libpython2.7.so.1.0
       10  0.3668 libGAL.so

And this would mean that uploading of texture is not the issue now...

These are static images, but in a real case, it could be a webcam, or
something else like a decoded video, how could these elements be more
efficient ? Maybe is it a pipeline problem, I may have forgotten some
things ?

Thanks in advance,
JM


More information about the gstreamer-devel mailing list