blob: 57bc9ac7879aa1a05e98d2a4222726a111884917 [file] [log] [blame]
An overview of GPU Emulation for Android:
-----------------------------------------
GPU emulation is controlled by the followind AVD hardware properties:
hw.gpu.enabled Boolean indicating whether GPU emulation is enabled.
If 'false', the builtin guest software renderer will be
used instead. Note that the latter is very slow and only
supports GLES 1.x, so most applications will not run with
it properly.
hw.gpu.mode Only used when hw.gpu.enabled is on. This is a string that
describes which emulation mode to support.
At this time, the following modes are supported:
'host' The default mode, uses specific translator libraries to convert
guest EGL/GLES commands into host desktop GL ones. This requires
valid OpenGL drivers installed on the development machine, and
of course a display connection.
Note that on some platforms (Windows in particular), OpenGL drivers
can be buggy, resulting in poor performance, rendering artefacts
or even crashes. To work-around this, use the 'mesa' mode instead.
'mesa' Software-based desktop GL renderer, based on the Mesa3D library.
This is slower than 'host' mode by a large margin, but works
equally well on all supported platforms. This is recommended if
there are issues with 'host' mode.
Another benefit of 'mesa' mode is that it can be run on headless
servers which do not have a GPU, or OpenGL libraries installed.
Alternatively, one can use the '-gpu <mode>' option to force a specific mode.
Values 'on', 'off' and 'auto' are also recognized. See -help-gpu for details.
Host mode libraries are installed at the following locations:
$EXEC_DIR/lib/
libOpenglRender.so
libEGL_translator.so
libGLES_CM_translator.so
libGLESv2_translator.so
$EXEC_DIR/lib64/
lib64OpenglRender.so
lib64EGL_translator.so
lib64GLES_CM_translator.so
lib64GLESv2_translator.so
The example above is for Linux, the shared libraries' extension will vary
with the host platform (i.e. .dylib for Darwin, and .dll for Windows).
Please read the distrib/android-emugl/DESIGN document first, which describes
host mode emulation in detail.
The Mesa libraries are built using the android/scripts/build-mesa.sh script,
and installed differently, depending on the platform. For Linux, this will be:
$EXEC_DIR/lib/
gles_mesa/
libGL.so
libGL.so.1 -> libGL.so
$EXEC_DIR/lib64/
gles_mesa/
libGL.so
libGL.so.1 -> libGL.so
For Windows:
$EXEC_DIR/lib/
gles_mesa/
opengl32.dll
$EXEC_DIR/lib64/
gles_mesa/
opengl32.dll
The 'emulator' launcher program works as follows:
- Parse the AVD configuration to see if GPU emulation is enabled.
- If enabled, prepend $EXEC_DIR/<lib>/ to LD_LIBRARY_PATH (or PATH on
Windows). This ensures that the host libraries will always be loaded
properly through dlopen() / LoadLibrary() later.
- If 'mesa' mode is enabled, it will also prepend $EXEC_DIR/<lib>/gles_mesa/
to LD_LIBRARY_PATH / PATH, to ensure the corresponding library is loaded.
Note that on Linux, the mesa sub-directory includes a link from libGL.so.1
to libGL.so. The latter is the Mesa rendering library. The former is a link
which is needed because the Android UI uses SDL2 which links against this
specific version of the library.
Without the symlink, creating the UI window will load the system version of
libGL.so.1, which will later prevent the load of Mesa's libGL.so.
IMPORTANT NOTE:
At this time, Mesa doesn't build for OS X, and the resulting library
still depends on XLib / Win32 GDI. This means that for true headless
emulation on Linux, one should run an Xvfb server and set DISPLAY
appropriately.
An experimental feature is the ability to add new "GPU emulation backends".
The 'emulator' program will look for the following libraries:
$EXEC_DIR/<lib>/gles_<name>/
libEGL.so -> desktop EGL library
libGLES_CM.so -> desktop GLESv1 library
libGLESv2.co -> desktop GLESv2 library
Where <name> is an arbitrary backend name.
If one of these libraries is defined, then it sets the appropriate environment
variable (e.g. ANDROID_EGL_LIB / ANDROID_GLESv1_LIB / ANDROID_GLESv2_LIB) to
ensure that libOpenglRender will use it, instead of the corresponding host
translation library.
The source code related to these features is located under:
android/opengles.c -> GPU emulation low-level initialization which happens
after the emulation engine is started.
android/opengl/ -> GPU emulation support code that is used by 'emulator'
to probe installed backends and select the correct
one based on AVD configuration / command-line
options, as well as setup the environment.