Monday, January 26, 2015

glmark and Mesa-demos on i.MX6

Accelerated performance of glmark2 and mesa-demos benchmarks on i.MX6 is dependent upon on ARM specific additions to xf86drm.h and so require a patched and scratched X.org installation, e.g. previous post X.org from Scratch. Note that for control, the builds below are done in an X.org environment which is purposely not exposed to the GPU libraries/headers installation, picking up support from the standard MesaLib presumably installed along with X.org from source. The impact of building the utilities against the Freescale supplied headers and libraries is not evident to me at this time.

Mesa sources may have already been patched to provide a couple of the utilities, the outcome of running without GPU support is as expected:

make -C xdemos install

debian@arm:~$ glxgears -info
GL_RENDERER   = Software Rasterizer
GL_VERSION    = 2.1 Mesa 9.2.0
GL_VENDOR     = Mesa Project

debian@arm:~$ glxinfo
name of display: :0.0
Error: couldn't find RGB GLX visual or fbconfig

$ es2gears_x11  -info
libEGL warning: DRI2: failed to authenticate
EGL_VERSION = 1.4 (DRI2)
EGL_VENDOR = Mesa Project
EGL_EXTENSIONS = EGL_KHR_surfaceless_context
EGL_CLIENT_APIS = OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3
vertex shader info:
fragment shader info:
info:
159 frames in 5.0 seconds = 31.699 FPS


mesa-demos-8.2.0
The complete mesa-demos package will provide es2_gears among other things.

wget http://downloads.sourceforge.net/project/glew/glew/1.11.0/glew-1.11.0.tgz

make install GLEW_PREFIX=$PREFIX GLEW_DEST=$PREFIX 

curl -O ftp://ftp.freedesktop.org/pub/mesa/glu/glu-9.0.0.tar.bz2

./configure --prefix=$PREFIX --disable-static && make

wget ftp://ftp.freedesktop.org/pub/mesa/demos/8.2.0/mesa-demos-8.2.0.tar.gz
./configure $XORG_CONFIG && make

Be sure to have the prerequisites installed, otherwise there will be trouble:

mesa-demos reports "Package 'glu', required by 'glew', not found"
glew reports missing "glu-9.0.0" ... install from LFS:

Without GPU, es2gears is pretty un-remarkable, but getting through the build is a sign of good things to come:

~$ es2gears_x11
libEGL warning: DRI2: failed to authenticate
EGL_VERSION = 1.4 (DRI2)
vertex shader info:
fragment shader info:
info:
157 frames in 5.0 seconds = 31.207 FPS


glmark2

apt-get install libjpeg-dev

# Retrieve glmark2 source:
git clone https://github.com/glmark2/glmark2.git

# glmark has it's own configuration utility:
./waf configure --with-flavors=x11-gl,x11-glesv2 # drm-gl,drm-glesv2

# CPLUS_INCLUDE_PATH should already be set in the building shell environment, but must be forced to suppress error on src/libmatrix/program.cc:
CPLUS_INCLUDE_PATH=$PREFIX/include:$CPLUS_INCLUDE_PATH ./waf build -v 


Checking for 'x11'                       : yes
Checking for 'gl'                        : yes
Checking for 'egl'                       : yes
Checking for 'glesv2'                    : yes
Checking for 'libdrm'                    : yes
Checking for 'gbm'                       : yes

If everything has built correctly at this time, check the utilities against the FBDEV (non-GPU) driver, or skip ahead to enable GPU support on the system. 

waf will automatically enable/disable features depending upon the installed Mesa configuration that it detects. I suspect that the Debian Mesa package may not enable gles ... this is what my working configuration ends up looking like:

# Note Mesa-9.2.0 configure line (more detail on Mesa configuration below):
autoreconf -fi &&
./configure CFLAGS="-O2" CXXFLAGS="-O2"    \
            --prefix=$XORG_PREFIX          \
            --sysconfdir=/etc \
            --with-dri-drivers=swrast \
            --disable-gallium-egl --disable-gallium-llvm \
            --disable-gallium-gbm \
            --with-gallium-drivers="" \
           --enable-gles2 \
            --disable-gles1 \
            --enable-gbm  # auto?

# result of Mesa-9.2.0 configuration from above:
        prefix:          /usr/local
        exec_prefix:     ${prefix}
        libdir:          ${exec_prefix}/lib
        includedir:      ${prefix}/include

        OpenGL:          yes (ES1: no ES2: yes)
        OpenVG:          no

        OSMesa:          no
        DRI drivers:     swrast
        DRI driver dir:  ${libdir}/dri
        GLX:             DRI-based

        EGL:             yes
        EGL platforms:   x11
        EGL drivers:     builtin:egl_glx builtin:egl_dri2

        llvm:            no

        Gallium:         no

        Shared libs:     yes
        Static libs:     no
        Shared-glapi:    yes

        CFLAGS:          -O2 -Wall -std=c99 -Werror=implicit-function-declaration -Werror=missing-prototypes -fno-strict-aliasing -fno-builtin-memcmp
        CXXFLAGS:        -O2 -Wall -fno-strict-aliasing -fno-builtin-memcmp
        Macros:          -D_GNU_SOURCE -DHAVE_PTHREAD -DHAVE_DLOPEN -DHAVE_POSIX_MEMALIGN -DGLX_INDIRECT_RENDERING -DGLX_DIRECT_RENDERING -DUSE_EXTERNAL_DXTN_LIB=1 -DHAVE_ALIAS -DHAVE_MINCORE -DHAVE_LIBUDEV

        PYTHON2:         python2

        Run 'make' to build Mesa


Without glesv2 enabled:

autoreconf -fi &&
./configure CFLAGS="-O2" CXXFLAGS="-O2"    \
            --prefix=$XORG_PREFIX          \
            --sysconfdir=/etc \
            --with-dri-drivers=swrast \
            --disable-egl --disable-gbm \
            --disable-gallium-egl --disable-gallium-llvm \
            --disable-gallium-gbm \
            --with-gallium-drivers="" \
            --disable-shared-glapi \
            --enable-glx

./waf configure --with-flavors=x11-gl

Should see something like this ...

Checking for 'x11'                       : yes
Checking for 'gl'                        : yes
Checking for 'egl'                       : not found
Checking for 'glesv2'                    : not found
Checking for 'libdrm'                    : yes
Checking for 'gbm'                       : not found

... and glmark2 should work:

    GL_VENDOR:     Mesa Project
    GL_RENDERER:   Software Rasterizer
    GL_VERSION:    2.1 Mesa 9.2.0


Mesa must be configured with egl/gles in order for glmark-es2 to build:

 ./waf configure --with-flavors=x11-gl,x11-glesv2
Checking for 'x11'                       : yes
Checking for 'gl'                        : yes
Checking for 'egl'                       : yes
Checking for 'glesv2'                    : not found

# "--with-egl-platforms=x11,drm" automatically enabled?

autoreconf -fi &&
./configure CFLAGS="-O2" CXXFLAGS="-O2"    \
            --prefix=$XORG_PREFIX          \
            --sysconfdir=/etc \
            --with-dri-drivers=swrast \
            --disable-gbm \
            --disable-gallium-egl --disable-gallium-llvm \
            --disable-gallium-gbm \
            --with-gallium-drivers="" \
            --disable-shared-glapi \
           --enable-gles2  --enable-egl

        OpenGL:          yes (ES1: no ES2: yes)
        OpenVG:          no

        OSMesa:          no
        DRI drivers:     swrast
        DRI driver dir:  ${libdir}/dri
        GLX:             DRI-based

        EGL:             yes
        EGL platforms:   x11
        EGL drivers:     builtin:egl_glx builtin:egl_dri2

Should now have libGLESv2.so.2:

Checking for 'x11'                       : yes
Checking for 'gl'                        : yes
Checking for 'egl'                       : yes
Checking for 'glesv2'                    : yes
Checking for 'libdrm'                    : yes


glapi is also required:

/opt/xorg/lib/libGLESv2.so: undefined reference to `_glapi_get_dispatch'
/opt/xorg/lib/libGLESv2.so: undefined reference to `_glapi_Dispatch'

autoreconf -fi &&
./configure CFLAGS="-O2" CXXFLAGS="-O2"    \
            --prefix=$XORG_PREFIX          \
            --sysconfdir=/etc \
            --with-dri-drivers=swrast \
            --disable-gbm \
            --disable-gallium-egl --disable-gallium-llvm \
            --disable-gallium-gbm \
            --with-gallium-drivers="" \
           --enable-gles2
#            --disable-shared-glapi

        Shared-glapi:    yes


~$ glmark2
** GLX does not support GLX_EXT_swap_control or GLX_MESA_swap_control!
** Failed to set swap interval. Results may be bounded above by refresh rate.
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     Mesa Project
    GL_RENDERER:   Software Rasterizer
    GL_VERSION:    2.1 Mesa 9.2.0
=======================================================
** GLX does not support GLX_EXT_swap_control or GLX_MESA_swap_control!
** Failed to set swap interval. Results may be bounded above by refresh rate.
[build] use-vbo=false: FPS: 4 FrameTime: 250.000 ms


glmark2-es2 runs but has other complaints and performs poorly (as expected):

~$ glmark2-es2
libEGL warning: DRI2: failed to authenticate
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     Mesa Project
    GL_RENDERER:   Software Rasterizer
    GL_VERSION:    OpenGL ES 2.0 Mesa 9.2.4
=======================================================
[build] use-vbo=false: FPS: 5 FrameTime: 200.000 ms


Mesa must be configured with "--enable-gbm" in order to get glmark-drm and glmark-es2-drm built.



Enabling GPU acceleration

The GPU-laced headers have to be in place for the Vivante EXA driver to build from source ... detailed steps are provided in this post. Some additional notes are below.

With the GPU blobs and headers installed to /usr, it's pretty likely to have overlaps with MesaLib installed to the X.org root, e.g.:

debian@arm:~/gpu-viv-bin-mx6q-3.10.17-1.0.2-hfp/usr$  for f in `find`; do [ -f $f ] && find /usr/local -name `echo $f | sed 's/.*\///'`  ; done
/usr/local/lib/libEGL.so
/usr/local/lib/libGLESv2.so
/usr/local/lib/libGLESv2.so.2
/usr/local/lib/libGLESv2.so.2.0.0
/usr/local/lib/libGL.so
/usr/local/lib/libEGL.so.1
/usr/local/lib/libGL.so.1
/usr/local/include/EGL/eglplatform.h
/usr/local/include/EGL/eglext.h
/usr/local/include/EGL/egl.h
/usr/local/include/GLES2/gl2platform.h
/usr/local/include/GLES2/gl2.h
/usr/local/include/GLES2/gl2ext.h
/usr/local/include/KHR/khrplatform.h
/usr/local/include/GL/gl.h
/usr/local/include/EGL/egl.h
/usr/local/include/GL/glext.h

At a minimum, removing the following symlinks should allow the blob versions to get priority:


# With the GPU enabled blobs installed, the stock ones from installed Mesa need to be disabled from the X.org runtime environment (and again pretty much anytime ldconfig gets run on the system):
 cd $PREFIX/lib

 sudo rm libGL.so libGL.so.1 libGLESv2.so libGLESv2.so.2 libEGL.so libEGL.so.1 libGL.so.1
ldd glmark-es2 # etc. etc.

Before trying out X.org, it should be possible to run the frame-buffer benchmarks in opt/viv_samples/vdk/.

Finally, getting to the EXA driver:

~/Download/xserver-xorg-video-imx-viv-3.10.17-1.0.2
BUILD_HARD_VFP=1 XSERVER_GREATER_THAN_13=1 BUSID_HAS_NUMBER=1 ./fastbuild.sh sysroot=/usr/local # specify sysroot if not /usr

Depending upon the specific "$PREFIX" used for X.org, it may be necessary to patch up some include paths in EXA/src/makefile.linux, FslExt/src/makefile.linux, and util/autohdmi/makefile.linux e.g.:

~xserver-xorg-video-imx-viv-3.10.17-1.0.2$
 for f in `find . -name makefile.linux`; do  sed -e 's/(sysroot)\/usr/(sysroot)/g' -i $f; done

 sed -e 's/\/drm/\/libdrm/' -i EXA/src/makefile.linux

# with pixman-1 installed from dpkg:





/usr/local/include/xorg/miscstruct.h:52:20: fatal error: pixman.h: No such file or directory


# fixup path to /usr/include/pixman-1/pixman.h in makefile


 -I$(sysroot)/include/$(PIXMAN)


# Finally ...

sudo cp EXA/src/vivante_drv.so  $PREFIX/lib/xorg/modules/drivers/


# don't forget to enable Vivante
setup /etc/X11/xorg.conf


# relink libraries for x11
switch_to_x11



:~$ LIBGL_DEBUG=verbose glxgears  -info
libGL: OpenDriver: trying /usr/lib/dri/vivante_dri.so
drmOpenByBusid: Searching for BusID platform:Vivante GCCore:00
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 4, (OK)
drmOpenByBusid: drmOpenMinor returns 4
drmOpenByBusid: drmGetBusid reports platform:Vivante GCCore:00
GL_RENDERER   = Vivante GC2000
GL_VERSION    = 2.1 2.0.1
GL_VENDOR     = Vivante Corporation
GL_EXTENSIONS = WGL_ARB_extensions_string WGL_EXT_extensions_string WGL_EXT_swap
_control GL_EXT_texture_env_add GL_ARB_multitexture GL_ARB_multisample GL_ARB_te
... ...
ltisample GL_EXT_texture_array GL_EXT_draw_buffers2 GL_EXT_texture_buffer_object
 GL_EXT_draw_instanced GL_EXT_timer_query
VisualID 184, 0xb8
912 frames in 5.0 seconds = 182.398 FPS


~$ LIBGL_DEBUG=verbose es2gears_x11  -info
drmOpenByBusid: Searching for BusID platform:Vivante GCCore:00
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 5, (OK)
drmOpenByBusid: drmOpenMinor returns 5
drmOpenByBusid: drmGetBusid reports platform:Vivante GCCore:00
EGL_VERSION = 1.4
EGL_VENDOR = Vivante Corporation
EGL_EXTENSIONS = EGL_KHR_reusable_sync EGL_KHR_fence_sync EGL_KHR_image EGL_KHR_
image_base EGL_KHR_image_pixmap EGL_KHR_gl_texture_2D_image EGL_KHR_gl_texture_c
ubemap_image EGL_KHR_gl_renderbuffer_image EGL_KHR_lock_surface
EGL_CLIENT_APIS = OpenGL_ES OpenVG
vertex shader info:
fragment shader info:
info:
853 frames in 5.0 seconds = 170.566 FPS


~$ LIBGL_DEBUG=verbose glmark2-es2
drmOpenByBusid: Searching for BusID platform:Vivante GCCore:00
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 5, (OK)
drmOpenByBusid: drmOpenMinor returns 5
drmOpenByBusid: drmGetBusid reports platform:Vivante GCCore:00
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     Vivante Corporation
    GL_RENDERER:   Vivante GC2000
    GL_VERSION:    OpenGL ES 2.0
=======================================================
[build] use-vbo=false: FPS: 396 FrameTime: 2.525 ms



These errors were seen at some point but IDNR what configuration:

debian@arm:~$ glmark2-es2
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     Vivante Corporation
    GL_RENDERER:   Vivante GC2000
    GL_VERSION:    OpenGL ES 2.0
=======================================================
[build] use-vbo=false:
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 253 FrameTime: 3.953 ms
=======================================================
                                  glmark2 Score: 252
=======================================================
[xcb] Unknown sequence number while appending request
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
glmark2-es2: ../../src/xcb_io.c:161: append_pending_request: Assertion `!xcb_xlib_unknown_seq_number' failed.
Aborted
~$


Latest results running on 3.10.31 series, the update to "OpenGL ES 3.0" is seen.

debian@arm:~$ !473
LIBGL_DEBUG=verbose glmark2-es2
drmOpenByBusid: Searching for BusID platform:Vivante GCCore:00
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 5, (OK)
drmOpenByBusid: drmOpenMinor returns 5
drmOpenByBusid: drmGetBusid reports platform:Vivante GCCore:00
=======================================================
    glmark2 2014.03
=======================================================
    OpenGL Information
    GL_VENDOR:     Vivante Corporation
    GL_RENDERER:   Vivante GC2000
    GL_VERSION:    OpenGL ES 3.0 V5.0.11.p1.19959
=======================================================
[build] use-vbo=false: FPS: 399 FrameTime: 2.506 ms
[build] use-vbo=true:^C

glxgears slower?
debian@arm:~$ LIBGL_DEBUG=verbose glxgears -info
libGL: OpenDriver: trying /usr/lib/dri/vivante_dri.so
drmOpenByBusid: Searching for BusID platform:Vivante GCCore:00
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 4, (OK)
drmOpenByBusid: drmOpenMinor returns 4
drmOpenByBusid: drmGetBusid reports platform:Vivante GCCore:00
GL_RENDERER   = Vivante GC2000
GL_VERSION    = 2.1 2.0.1
GL_VENDOR     = Vivante Corporation
GL_EXTENSIONS = WGL_ARB_extensions_string WGL_EXT_extensions_string WGL_EXT_swap_control GL_EXT_texture_env_add GL_ARB_multitexture GL_ARB_multisample GL_ARB_texture_env_add GL_ARB_texture_compression GL_ARB_texture_env_combine GL_ARB_depth_texture GL_ARB_window_pos GL_ARB_vertex_buffer_object GL_ARB_imaging GL_EXT_framebuffer_object GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_texture_array GL_EXT_draw_buffers2 GL_EXT_texture_buffer_object GL_EXT_draw_instanced GL_EXT_timer_query
VisualID 191, 0xbf
757 frames in 5.0 seconds = 151.342 FPS
742 frames in 5.0 seconds = 148.313 FPS
^CProcess termination by interupt!

No comments:

Post a Comment