From 5ca449d57fc55e73c85da030fb22920107e6f82c Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Fri, 16 Sep 2011 17:33:28 +0200 Subject: [PATCH] opengl: Ensure we only load the GLES emulation library when the emulator supports it. This patch modifies the libEGL.so loader to only load the emulator-specific EGL/GLES libraries if it detects at runtime that the emulator supports it. This prevents the system crashing when booting the platform image under an old emulator version, or one without GPU emulation enabled. Change-Id: I711b3f0a4ee1f3b080263780726ce7ec28ff11d6 --- opengl/libs/EGL/Loader.cpp | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index 747c829ed..e16efe34f 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -23,6 +23,7 @@ #include #include +#include #include @@ -45,6 +46,39 @@ namespace android { ANDROID_SINGLETON_STATIC_INSTANCE( Loader ) +/* This function is called to check whether we run inside the emulator, + * and if this is the case whether GLES GPU emulation is supported. + * + * Returned values are: + * -1 -> not running inside the emulator + * 0 -> running inside the emulator, but GPU emulation not supported + * 1 -> running inside the emulator, GPU emulation is supported + * through the "emulation" config. + */ +static int +checkGlesEmulationStatus(void) +{ + /* We're going to check for the following kernel parameters: + * + * qemu=1 -> tells us that we run inside the emulator + * android.qemu.gles= -> tells us the GLES GPU emulation status + * + * Note that we will return if we find it. This let us support + * more additionnal emulation modes in the future. + */ + char prop[PROPERTY_VALUE_MAX]; + int result = -1; + + /* First, check for qemu=1 */ + property_get("ro.kernel.qemu",prop,"0"); + if (atoi(prop) != 1) + return -1; + + /* We are in the emulator, get GPU status value */ + property_get("ro.kernel.qemu.gles",prop,"0"); + return atoi(prop); +} + // ---------------------------------------------------------------------------- Loader::driver_t::driver_t(void* gles) @@ -94,6 +128,15 @@ Loader::Loader() { char line[256]; char tag[256]; + + /* Special case for GLES emulation */ + if (checkGlesEmulationStatus() == 0) { + LOGD("Emulator without GPU support detected. Fallback to software renderer."); + gConfig.add( entry_t(0, 0, "android") ); + return; + } + + /* Otherwise, use egl.cfg */ FILE* cfg = fopen("/system/lib/egl/egl.cfg", "r"); if (cfg == NULL) { // default config