From 69e5b1ab80018817b1d4ffbbdb5695ff70168c95 Mon Sep 17 00:00:00 2001 From: bohu Date: Fri, 19 Feb 2016 17:15:20 -0800 Subject: [PATCH] emulator: load vendor specific egl libraries first Unless emulator specifically asks for gpu emulation on the host (with ro.kernel.qemu.gles set to 1), always try to load vendor supplied egl libraries on the guest and fall back to software renderer. qemu.gles will be setup correctly to reflect what gles is actually used. Change-Id: Ibaf2209dd1e40fa9f18ff4df27bb137d7ad53007 --- opengl/libs/EGL/Loader.cpp | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index e593a721ef..49f501d3a6 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -92,7 +92,7 @@ checkGlesEmulationStatus(void) return -1; /* We are in the emulator, get GPU status value */ - property_get("ro.kernel.qemu.gles",prop,"0"); + property_get("qemu.gles",prop,"0"); return atoi(prop); } @@ -174,11 +174,45 @@ static void* load_wrapper(const char* path) { #endif #endif +static void setEmulatorGlesValue(void) { + char prop[PROPERTY_VALUE_MAX]; + property_get("ro.kernel.qemu", prop, "0"); + if (atoi(prop) != 1) return; + + property_get("ro.kernel.qemu.gles",prop,"0"); + if (atoi(prop) == 1) { + ALOGD("Emulator has host GPU support, qemu.gles is set to 1."); + property_set("qemu.gles", "1"); + return; + } + + // for now, checking the following + // directory is good enough for emulator system images + const char* vendor_lib_path = +#if defined(__LP64__) + "/vendor/lib64/egl"; +#else + "/vendor/lib/egl"; +#endif + + const bool has_vendor_lib = (access(vendor_lib_path, R_OK) == 0); + if (has_vendor_lib) { + ALOGD("Emulator has vendor provided software renderer, qemu.gles is set to 2."); + property_set("qemu.gles", "2"); + } else { + ALOGD("Emulator without GPU support detected. " + "Fallback to legacy software renderer, qemu.gles is set to 0."); + property_set("qemu.gles", "0"); + } +} + void* Loader::open(egl_connection_t* cnx) { void* dso; driver_t* hnd = 0; + setEmulatorGlesValue(); + dso = load_driver("GLES", cnx, EGL | GLESv1_CM | GLESv2); if (dso) { hnd = new driver_t(dso); @@ -280,8 +314,6 @@ void *Loader::load_driver(const char* kind, int emulationStatus = checkGlesEmulationStatus(); switch (emulationStatus) { case 0: - ALOGD("Emulator without GPU support detected. " - "Fallback to legacy software renderer."); #if defined(__LP64__) result.setTo("/system/lib64/egl/libGLES_android.so"); #else -- 2.11.0