A few days ago, Hardkernel released the first version of Ubuntu 12.11 (Linaro) with Mali-400 GPU support for their ODROID boards (ODROID-X/X2, ODROID-U/U2). This is still WIP (Work in Progress), but this is one of the few boards together with Pandaboard, Origen and Snowball that can support 2D/3D GPU acceleration in Ubuntu Quantal. Since I have an ODROID-X development board, I decided to give it a try. There are different ways to install it. I chose the way that is most convenient for me (LCD display instead of HDMI), and likely to yield more performance (eMMC instead of SD Card). The current installation instructions to eMMC are extremely cumbersome and you have to go through 5 main steps:
- Install Android (yes, seriously) in the eMMC
- Install Ubuntu in the SD Card
- Install Ubuntu to the eMMC
- Upgrade Ubuntu to the latest version
- Install the Mali drivers
In this post I’m going to go through all those steps, and do some testing for eMMC and 2D/3D performance. If you just want to boot Ubuntu from SD, simply skip steps 1 and 3. For eMMC installation, I followed the “eMMC Ubuntu” guide on odroid forums, as well as the instructions on the release post to install Mali drivers, and enable 2D/3D acceleration in Ubuntu. Similar instructions are also available for ODROID-X2 and ODROID-U2.
You’ll need an 8GB SD Card or greater to complete all the steps.
Installing Android to ODROID-X
- Insert the SD card in a Linux PC, and find your SD card device:
/dev/sda1: UUID="9c042788-fa75-4fc4-9b12-598c809410e8" TYPE="ext4"
/dev/sda5: UUID="fa4d6d7d-311a-4570-a498-96394b828e01" TYPE="swap"
/dev/sdb1: LABEL="SEAGATE EXTENSION" UUID="C0588ADB588AD018" TYPE="ntfs"
/dev/sdc: LABEL="Ubuntu_ODROID-X" UUID="f04f2d56-86a6-44ad-9b63-854714ab78fd" TYPE="ext4"
- Download & extract the Android Installer, and write it to your SD card with dd or dd.sh script:
sudo dd.sh if=emmc_installer_for_odroidx.img of=/dev/sdc
If you use Windows, do it with Win32DiskImager. Back in the times when I still used Windows and Win32DiskImager, I never had problems myself, but some people apparently have, and Hardkernel released an improved version of Win32DiskImager to verify the copy.
Then insert the SD card in your ODroid-X board, connect a Jumper on SD/MMC connector (JP2) to boot from SD card, and install the latest version of Android. During installation I had no display on the 10″ LCD display, and the board simply powered itself off after a while. Not sure this is normal, but after removing the Jumper, I could boot to Android (3-Jan-2013 build) from the eMMC.
Installing Ubuntu 12.11 for ODROID-X to the SD card
Now take the SD card back to your Linux computer to copy the Ubuntu image:
I’ll carry on with the LCD image since this is what I use, but the step for HDMI are the same, just replace the filename:
7z x odroidx_20130128-linaro-ubuntu-desktop_SD_with_LCD.img.xz
sudo dd.sh if=odroidx_20130128-linaro-ubuntu-desktop_SD_with_LCD.img of=/dev/sdc
Inset the SD card in ODroid-X board, insert the Jumper in JP2 to boot from SD card to verify Ubuntu 12.10 boots correctly.
Install Ubuntu to ODROID-X eMMC Module
Once you’ve verified Ubuntu boots correctly from the SD Card, put the SD card back in your PC and copy odroidx_20130128-linaro-ubuntu-desktop_SD_with_LCD.img.xz to the rootfs. In my PC running Ubuntu 12.04, it will automount it to /media/rootfs:
sudo cp odroidx_20130128-linaro-ubuntu-desktop_SD_with_LCD.img.xz /media/rootfs
Once umount is successfully (which means the data is fully written to the SD card), you can insert it back into your ODroid-X board to install Ubuntu 12.10 to your eMMC. First locate your eMMC device with:
The eMMC is the device with with boot0/boot1, as well as p1/p2/p3/p4. In my case, it’s mmcblk0. Once you know this, copy Ubuntu to the eMMC by using the following command in a terminal:
sudo xzcat /odroidx_20130128-linaro-ubuntu-desktop_SD_with_LCD.img.xz | sudo dd of=/dev/mmcblk0 bs=4M
Once sync is complete, power off the board, remove the Jumper on JP2, and start Ubuntu.
Ubuntu Quantal in ODROID-X Board
Upgrading Ubuntu (15 Feb)
Before we can use Mali-400MP4 GPU in Ubuntu, you must install an update for Ubuntu (Feb 15, 2013):
tar xvfz linux-3.0.63-odroidx_20130215.tar.gz
If you are using the Wi-Fi module from Hardkernel (and probably others), run those 2 commands:
sudo depmod -a
Installing Mali Drivers for ODROID-X Board
Mali-400MP4 drivers are not included in the image, most probably for legal reasons, and you have to accept an End-User-License-Agreement (EULA) during installation (dkpg). Let’s do this:
tar xvfz mali_packages.tar.gz
sudo dpkg -i mali400_2.1-13_armhf.deb
sudo dpkg -i mali400-dev_2.1-13_armhf.deb
sudo dpkg -i xf86-video-mali_1.0.1-7_armhf.deb
sudo rm -fr /usr/lib/arm-linux-gnueabihf/mesa-egl
If you are outputting to an HDMI monitor, the installation should be complete at this stage. In my case I could only the 4 tux and nothing else showed up on the display. I could however access the command line via the serial console. After further reading, I found out I had to modify /usr/share/X11/xorg.conf.d/99-hkl_mali.conf to make it work with the LCD display as follows:
Option "fbdev" "/dev/fb0"
Ubuntu Linaro 12.11 Performance in ODROID-X
The first thing I’ve noticed is that Ubuntu feel snappy with this hardware, at least snappier than in my Atom netbook running Ubuntu 12.04, and it’s the first time I could see myself using this platform as a desktop replacement. Booting from power off takes 15 to 20 seconds. There are still some issues though. Once of them is that software-center is not working when run from the eMMC (SD card is OK). Even though this post is mainly about GPU support, I’ve compared startup times from eMMC and SD card with Libreoffice Writer, Software Center, and Firefox
Libreoffice Writer was not pre-installed, so I installed it first:
sudo apt-get install libreoffice-writer
||Does not start
Each program was started after a reboot. We can notice there’s a significant advantage of using eMMC instead of SD card when it comes to startup time.
I’ve also done several 2D/3D tests.
I started with es2gears, which comes in the provided Ubuntu image:
EGL_VERSION = 1.4 Linux-r3p2-01rel0
vertex shader info:
fragment shader info:
483 frames in 5.0 seconds = 96.561 FPS
427 frames in 5.0 seconds = 85.230 FPS
395 frames in 5.0 seconds = 78.827 FPS
394 frames in 5.0 seconds = 78.580 FPS
379 frames in 5.0 seconds = 75.664 FPS
373 frames in 5.0 seconds = 74.570 FPS
363 frames in 5.0 seconds = 72.585 FPS
352 frames in 5.0 seconds = 70.245 FPS
332 frames in 5.0 seconds = 66.387 FPS
317 frames in 5.0 seconds = 63.273 FPS
297 frames in 5.0 seconds = 59.341 FPS
298 frames in 5.0 seconds = 59.469 FPS
279 frames in 5.0 seconds = 55.722 FPS
280 frames in 5.0 seconds = 55.855 FPS
263 frames in 5.0 seconds = 52.505 FPS
260 frames in 5.0 seconds = 51.875 FPS
251 frames in 5.0 seconds = 50.090 FPS
237 frames in 5.0 seconds = 47.230 FPS
It appears to work, but the window background is transparent, and although the frame rate starts at 96.651, it just decreases which each iteration… Not sure what that means…
I’ve also installed glmark2-es2
sudo apt-get install glmark2-es2
glmark2-es2 2D/3D GPU Benchmark in ODROID-X Development Board
run it, and got a score of 54:
GL_RENDERER: Mali-400 MP
GL_VERSION: OpenGL ES 2.0
[build] use-vbo=false: FPS: 52 FrameTime: 19.231 ms
[build] use-vbo=true: FPS: 54 FrameTime: 18.519 ms
[texture] texture-filter=nearest: FPS: 57 FrameTime: 17.544 ms
[texture] texture-filter=linear: FPS: 57 FrameTime: 17.544 ms
[texture] texture-filter=mipmap: FPS: 57 FrameTime: 17.544 ms
[shading] shading=gouraud: FPS: 57 FrameTime: 17.544 ms
[shading] shading=blinn-phong-inf: FPS: 57 FrameTime: 17.544 ms
[shading] shading=phong: FPS: 54 FrameTime: 18.519 ms
[bump] bump-render=high-poly: FPS: 46 FrameTime: 21.739 ms
[bump] bump-render=normals: FPS: 58 FrameTime: 17.241 ms
[bump] bump-render=height: FPS: 57 FrameTime: 17.544 ms
[effect2d] kernel=0,1,0;1,-4,1;0,1,0;: FPS: 56 FrameTime: 17.857 ms
[effect2d] kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;: FPS: 56 FrameTime: 17.857 ms
[pulsar] light=false:quads=5:texture=false: FPS: 58 FrameTime: 17.241 ms
[desktop] blur-radius=5:effect=blur:passes=1:separable=true:windows=4: FPS: 40 FrameTime: 25.000 ms
[desktop] effect=shadow:windows=4: FPS: 53 FrameTime: 18.868 ms
Error: Requested MapBuffer VBO update method but GL_OES_mapbuffer is not supported!
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map: Unsupported
[buffer] columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata: FPS: 37 FrameTime: 27.027 ms
Error: Requested MapBuffer VBO update method but GL_OES_mapbuffer is not supported!
[buffer] columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map: Unsupported
[ideas] speed=duration: FPS: 53 FrameTime: 18.868 ms
[jellyfish] <default>: FPS: 56 FrameTime: 17.857 ms
Error: SceneTerrain requires Vertex Texture Fetch support, but GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS is 0
[terrain] <default>: Unsupported
[conditionals] fragment-steps=0:vertex-steps=0: FPS: 57 FrameTime: 17.544 ms
[conditionals] fragment-steps=5:vertex-steps=0: FPS: 57 FrameTime: 17.544 ms
[conditionals] fragment-steps=0:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms
[function] fragment-complexity=low:fragment-steps=5: FPS: 57 FrameTime: 17.544 ms
[function] fragment-complexity=medium:fragment-steps=5: FPS: 57 FrameTime: 17.544 ms
[loop] fragment-loop=false:fragment-steps=5:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms
[loop] fragment-steps=5:fragment-uniform=false:vertex-steps=5: FPS: 58 FrameTime: 17.241 ms
[loop] fragment-steps=5:fragment-uniform=true:vertex-steps=5: FPS: 57 FrameTime: 17.544 ms
glmark2 Score: 54
Some test failed. I’m not sure if it’s because those are not implemented yet, or simply not supported by Mali-400. One interesting point is that ODROID-U2 users reports that Xubuntu is twice as fast as Ubuntu in glmark2-es2, and the culprits appear to be Unity and Compiz.
I’ve done another test to check whether WebGL would work, and I’ve got between 0 to 1 fps on both Firefox and Chromium with WebGL Aquarium. A final comment, since many people still seem to be confused with GPU and video decoding. The Mali-400 does not handle video decoding, this is done normally done by the Video Processing Unit (VPU), and AFAIK this is not currently supported in Linux on ODROID boards.