opengles emulator: use bionic tls slot

This make the EGL/GLESv1/GLESv2 libraries on the guest to use
the OPENGL bionic tls slot for faster tls access.
Note that we still setting the slower tls in order to have the
tls destructor which allow us to close the host connection
when the thread exits.

Gives slightly performance improvement, the avg score for the
teapot test in 0xBench goes from 34 to 37 fps. (This test is
near immediate mode since it renders a lot of small primitives
so it is a good candicate to be improved).

Change-Id: I9060c75cc29c2e28721fa11d3f318b438edb5da9
diff --git a/tools/emulator/opengl/system/GLESv1/gl.cpp b/tools/emulator/opengl/system/GLESv1/gl.cpp
index 2ab6986..142c218 100644
--- a/tools/emulator/opengl/system/GLESv1/gl.cpp
+++ b/tools/emulator/opengl/system/GLESv1/gl.cpp
@@ -6,10 +6,11 @@
 #include "ErrorLog.h"
 #include <private/ui/android_natives_priv.h>
 #include "gralloc_cb.h"
+#include "ThreadInfo.h"
 
 
 //XXX: fix this macro to get the context from fast tls path
-#define GET_CONTEXT gl_client_context_t * ctx = HostConnection::get()->glEncoder();
+#define GET_CONTEXT gl_client_context_t * ctx = getEGLThreadInfo()->hostConn->glEncoder();
 
 #include "gl_entry.cpp"
 
diff --git a/tools/emulator/opengl/system/GLESv2/gl2.cpp b/tools/emulator/opengl/system/GLESv2/gl2.cpp
index f4157d7..06db296 100644
--- a/tools/emulator/opengl/system/GLESv2/gl2.cpp
+++ b/tools/emulator/opengl/system/GLESv2/gl2.cpp
@@ -6,10 +6,10 @@
 #include "ErrorLog.h"
 #include <private/ui/android_natives_priv.h>
 #include "gralloc_cb.h"
-
+#include "ThreadInfo.h"
 
 //XXX: fix this macro to get the context from fast tls path
-#define GET_CONTEXT gl2_client_context_t * ctx = HostConnection::get()->gl2Encoder();
+#define GET_CONTEXT gl2_client_context_t * ctx = getEGLThreadInfo()->hostConn->gl2Encoder();
 
 #include "gl2_entry.cpp"
 
diff --git a/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk b/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk
index a04d19c..6198748 100644
--- a/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk
+++ b/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk
@@ -8,6 +8,6 @@
     QemuPipeStream.cpp \
     ThreadInfo.cpp
 
-$(call emugl-export,C_INCLUDES,$(LOCAL_PATH))
+$(call emugl-export,C_INCLUDES,$(LOCAL_PATH) bionic/libc/private)
 
 $(call emugl-end-module)
diff --git a/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp b/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp
index 3ab42a3..75da8f2 100644
--- a/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp
+++ b/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp
@@ -27,7 +27,7 @@
     }
 }
 
-EGLThreadInfo *getEGLThreadInfo()
+EGLThreadInfo *slow_getEGLThreadInfo()
 {
     EGLThreadInfo *ti = (EGLThreadInfo *)thread_store_get(&s_tls);
     if (ti) return ti;
diff --git a/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.h b/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.h
index 98101f0..0328733 100644
--- a/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.h
+++ b/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.h
@@ -17,6 +17,10 @@
 #define _THREAD_INFO_H
 
 #include "HostConnection.h"
+#include <pthread.h>
+#ifdef HAVE_ANDROID_OS
+#include <bionic_tls.h>
+#endif
 
 struct EGLContext_t;
 
@@ -30,5 +34,26 @@
 };
 
 
-EGLThreadInfo *getEGLThreadInfo();
+EGLThreadInfo *slow_getEGLThreadInfo();
+
+#ifdef HAVE_ANDROID_OS
+    // We have a dedicated TLS slot in bionic
+    inline EGLThreadInfo* getEGLThreadInfo() {
+        EGLThreadInfo *tInfo =
+             (EGLThreadInfo *)(((unsigned *)__get_tls())[TLS_SLOT_OPENGL]);
+        if (!tInfo) {
+            tInfo = slow_getEGLThreadInfo();
+            ((uint32_t *)__get_tls())[TLS_SLOT_OPENGL] = (uint32_t)tInfo;
+        }
+        return tInfo;
+    }
+#else
+    inline EGLThreadInfo* getEGLThreadInfo() {
+        return slow_getEGLThreadInfo();
+    }
 #endif
+
+
+
+
+#endif // of _THREAD_INFO_H
diff --git a/tools/emulator/opengl/system/egl/Android.mk b/tools/emulator/opengl/system/egl/Android.mk
index a84c9bc..49b967a 100644
--- a/tools/emulator/opengl/system/egl/Android.mk
+++ b/tools/emulator/opengl/system/egl/Android.mk
@@ -17,6 +17,7 @@
         egl.cpp \
         ClientAPIExts.cpp
 
+LOCAL_C_INCLUDES += bionic/libc/private
 
 LOCAL_PRELINK_MODULE := false
 LOCAL_CFLAGS += -DLOG_TAG=\"EGL_emulation\" -DEGL_EGLEXT_PROTOTYPES -DWITH_GLES2
diff --git a/tools/emulator/opengl/system/gralloc/Android.mk b/tools/emulator/opengl/system/gralloc/Android.mk
index 52ee26c..6e64537 100644
--- a/tools/emulator/opengl/system/gralloc/Android.mk
+++ b/tools/emulator/opengl/system/gralloc/Android.mk
@@ -15,6 +15,8 @@
 LOCAL_SRC_FILES := \
         gralloc.cpp
 
+LOCAL_C_INCLUDES += bionic/libc/private
+
 LOCAL_C_INCLUDES += \
         $(emulatorOpengl)/host/include/libOpenglRender \
         $(emulatorOpengl)/shared/OpenglCodecCommon \