From 75094ee1ac5fff3ef155a1745ec3c1a14d8c4b10 Mon Sep 17 00:00:00 2001 From: Guy Zadickario Date: Tue, 16 Aug 2011 15:01:07 +0300 Subject: [PATCH] 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 --- tools/emulator/opengl/system/GLESv1/gl.cpp | 3 ++- tools/emulator/opengl/system/GLESv2/gl2.cpp | 4 +-- .../system/OpenglSystemCommon/Android.mk | 2 +- .../system/OpenglSystemCommon/ThreadInfo.cpp | 2 +- .../system/OpenglSystemCommon/ThreadInfo.h | 27 ++++++++++++++++++- tools/emulator/opengl/system/egl/Android.mk | 1 + .../emulator/opengl/system/gralloc/Android.mk | 2 ++ 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/tools/emulator/opengl/system/GLESv1/gl.cpp b/tools/emulator/opengl/system/GLESv1/gl.cpp index 2ab6986ae..142c21823 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 #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 f4157d762..06db29668 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 #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 a04d19cd2..61987489c 100644 --- a/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk +++ b/tools/emulator/opengl/system/OpenglSystemCommon/Android.mk @@ -8,6 +8,6 @@ LOCAL_SRC_FILES := \ 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 3ab42a37c..75da8f29f 100644 --- a/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp +++ b/tools/emulator/opengl/system/OpenglSystemCommon/ThreadInfo.cpp @@ -27,7 +27,7 @@ static void tlsDestruct(void *ptr) } } -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 98101f0e9..032873340 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 +#ifdef HAVE_ANDROID_OS +#include +#endif struct EGLContext_t; @@ -30,5 +34,26 @@ struct EGLThreadInfo }; -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 a84c9bc6a..49b967ae3 100644 --- a/tools/emulator/opengl/system/egl/Android.mk +++ b/tools/emulator/opengl/system/egl/Android.mk @@ -17,6 +17,7 @@ LOCAL_SRC_FILES := \ 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 52ee26c17..6e6453729 100644 --- a/tools/emulator/opengl/system/gralloc/Android.mk +++ b/tools/emulator/opengl/system/gralloc/Android.mk @@ -15,6 +15,8 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \ LOCAL_SRC_FILES := \ gralloc.cpp +LOCAL_C_INCLUDES += bionic/libc/private + LOCAL_C_INCLUDES += \ $(emulatorOpengl)/host/include/libOpenglRender \ $(emulatorOpengl)/shared/OpenglCodecCommon \