Graphics » History » Revision 19

« Previous | Revision 19/46 (diff) | Next »
dl lud, 01/24/2020 04:46 AM
Choosing the software renderer for a system component. Reworked instructions into steps. Added llvmpipe issues.


Replicant relies on the CPU for graphics rendering, a technique known as software rendering. Using the dedicated graphics processor (GPU) currently requires non-free software on all of the supported devices. As free-software replacements are not yet available, the GPU cannot be used with Replicant for the moment (see GraphicsResearch). The software rendering is the reason why Replicant devices appear slow at times and is responsible for a lot of crashes that can happen during usage.

Until Replicant 6.0 0003 Replicant used the Android software renderer, also known as libagl. libagl is fast, but caused several issues due to lack of OpenGL ES (GLES) 2.0 support.

As of Replicant 6.0 0004 rc1, llvmpipe is used as the default software renderer. llvmpipe has a more complete GLES implementation than libagl (see #705), so more apps work with it, like Firefox-based browsers or more recent WebViews (see #1780). Unfortunately, llvmpipe is too slow for certain system components, which may also be true for some apps. Furthermore, certain apps still crash with llvmpipe, although less frequently. Usually the screen stays black if an app does not work with llvmpipe.

To cater for these issues, Replicant 6.0 0004 includes a mechanism to choose between llvmpipe and ligagl, on a per process basis. Such mechanism is actually used on the Replicant 6.0 0004 images to force some system components (bootanimation, SurfaceFlinger and system_server) to use libagl.

Methods to choose the software renderer

For all the methods bellow you must have ADB installed on your computer. Make sure that it can access the device's root shell and that the system partition is mounted as writable.

Choosing the default software renderer

The following command switches between llvmpipe and libagl:

adb shell "grep -q "ro.libagl=1" /system/build.prop && sed "s/ro.libagl=1/ro.libagl=0/" -i /system/build.prop || sed "s/ro.libagl=0/ro.libagl=1/" -i /system/build.prop" 

Then reboot the device. To switch back to previous renderer, run the above command again and reboot the device.
This method works on both Replicant 6.0 0003 and 0004. Do note that on 0003 you will start with libagl by default, whereas on 0004 the default is llvmpipe.

Choosing the software renderer for a specific app

  1. Find out the app ID. Example: org.gnu.icecat
  2. Force the app to always use libagl by creating empty file named libGLES_android on it's data directory (e.g. /data/data/org.gnu.icecat/). Example command:
    adb shell touch /data/data/org.gnu.icecat/libGLES_android

    To force llvmpipe instead, use a file named libGLES_mesa.
  3. Get back to the default renderer by removing the file. Example command:
    adb shell rm /data/data/org.gnu.icecat/libGLES_android

This method only works for Replicant 6.0 0004.

Choosing the software renderer for a system component

System components usually lack a directory in the data partition. Thus, another method must be used to switch their software renderer.

  1. Find out the full path of the executable. You can use which for that:
    root@i9300:/ # which surfaceflinger
  2. Force the component to always use libagl by creating empty file at /system/etc/libGLES_android/<executable_full_path>. Example commands:
    adb shell mkdir -p /system/etc/libGLES_android/system/bin
    adb shell touch /system/etc/libGLES_android/system/bin/surfaceflinger

    To force llvmpipe instead, create the file under /system/etc/libGLES_mesa/.
  3. Get back to the default renderer by removing the file. Example command:
    adb shell rm /system/etc/libGLES_android/system/bin/surfaceflinger

This method only works for Replicant 6.0 0004.

Known issues with libagl

  • Selecting the third option besides photo and video (Panorama mode) will crash the Camera app.
  • Video playback in the browser does not work. (issue #1533)
  • Screenshots do not work. (see Screenshots for a workaround)
  • Selecting wallpapers from storage does not work.
  • Screen content is sometimes shortly visible before unlocking. (issue #1275, happens with llvmpipe as well)
  • Previews of the windows in the tasks switcher are missing.
  • Switching between apps, apps and the launcher or different views inside an app is sometimes slow and the device may seem unresponsive.
  • There are issues with using folders with the Trebuchet launcher. (issue #1790, happens with llvmpipe as well)

Popular apps from F-Droid that do not work with libagl

Known issues with llvmpipe

  • Too slow to use in SurfaceFlinger (screen compositor).
  • If SurfaceFlinger uses llvmpipe, Gallery and Orbot render some GUI elements are visible while the main screen is black. The GUI of Simple File Manager works as long as no image is viewed in fullscreen.

See also

There is a page about GraphicsResearch that gathers information to improve graphics support.

Updated by dl lud over 4 years ago · 19 revisions

Also available in: PDF HTML TXT