From f1eeb288ae18f3015f435fc2df25ec1eb0f15e1a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Sat, 14 Sep 2013 11:07:17 +0300 Subject: [PATCH] Make it possible to link ANGLE statically for single-thread use. Fix exports and provide static instances of thread-local data depending on QT_OPENGL_ES_2_ANGLE_STATIC. Change-Id: Ifab25a820adf5953bb3b09036de53dbf7f1a7fd5 --- src/3rdparty/angle/include/KHR/khrplatform.h | 2 +- src/3rdparty/angle/src/libEGL/main.cpp | 35 ++++++++++++++++++++-------- src/3rdparty/angle/src/libGLESv2/main.cpp | 21 ++++++++++++++--- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/3rdparty/angle/include/KHR/khrplatform.h b/src/3rdparty/angle/include/KHR/khrplatform.h index 8ec0d19..541bfa9 100644 --- a/src/3rdparty/angle/include/KHR/khrplatform.h +++ b/src/3rdparty/angle/include/KHR/khrplatform.h @@ -97,7 +97,7 @@ *------------------------------------------------------------------------- * This precedes the return type of the function in the function prototype. */ -#if defined(_WIN32) && !defined(__SCITECH_SNAP__) +#if defined(_WIN32) && !defined(__SCITECH_SNAP__) && !defined(QT_OPENGL_ES_2_ANGLE_STATIC) # define KHRONOS_APICALL __declspec(dllimport) #elif defined (__SYMBIAN32__) # define KHRONOS_APICALL IMPORT_C diff --git a/src/3rdparty/angle/src/libEGL/main.cpp b/src/3rdparty/angle/src/libEGL/main.cpp index 424ec3f..7dea5fc 100644 --- a/src/3rdparty/angle/src/libEGL/main.cpp +++ b/src/3rdparty/angle/src/libEGL/main.cpp @@ -10,6 +10,8 @@ #include "common/debug.h" +#ifndef QT_OPENGL_ES_2_ANGLE_STATIC + static DWORD currentTLS = TLS_OUT_OF_INDEXES; extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) @@ -86,74 +88,87 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved return TRUE; } +#endif // !QT_OPENGL_ES_2_ANGLE_STATIC + namespace egl { +Current *getCurrent() +{ +#ifndef QT_OPENGL_ES_2_ANGLE_STATIC + return (Current*)TlsGetValue(currentTLS); +#else + // No precautions for thread safety taken as ANGLE is used single-threaded in Qt. + static Current curr = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE }; + return &curr; +#endif +} + void setCurrentError(EGLint error) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->error = error; } EGLint getCurrentError() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->error; } void setCurrentAPI(EGLenum API) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->API = API; } EGLenum getCurrentAPI() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->API; } void setCurrentDisplay(EGLDisplay dpy) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->display = dpy; } EGLDisplay getCurrentDisplay() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->display; } void setCurrentDrawSurface(EGLSurface surface) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->drawSurface = surface; } EGLSurface getCurrentDrawSurface() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->drawSurface; } void setCurrentReadSurface(EGLSurface surface) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->readSurface = surface; } EGLSurface getCurrentReadSurface() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->readSurface; } diff --git a/src/3rdparty/angle/src/libGLESv2/main.cpp b/src/3rdparty/angle/src/libGLESv2/main.cpp index 6d7a241..730a6ac 100644 --- a/src/3rdparty/angle/src/libGLESv2/main.cpp +++ b/src/3rdparty/angle/src/libGLESv2/main.cpp @@ -11,6 +11,8 @@ #include "libGLESv2/Context.h" +#ifndef QT_OPENGL_ES_2_ANGLE_STATIC + static DWORD currentTLS = TLS_OUT_OF_INDEXES; extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) @@ -69,11 +71,24 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved return TRUE; } +#endif // !QT_OPENGL_ES_2_ANGLE_STATIC + namespace gl { +Current *getCurrent() +{ +#ifndef QT_OPENGL_ES_2_ANGLE_STATIC + return (Current*)TlsGetValue(currentTLS); +#else + // No precautions for thread safety taken as ANGLE is used single-threaded in Qt. + static gl::Current curr = { 0, 0 }; + return &curr; +#endif +} + void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface) { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); current->context = context; current->display = display; @@ -86,7 +101,7 @@ void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface) Context *getContext() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->context; } @@ -112,7 +127,7 @@ Context *getNonLostContext() egl::Display *getDisplay() { - Current *current = (Current*)TlsGetValue(currentTLS); + Current *current = getCurrent(); return current->display; } -- 1.8.1.msysgit.1