ANGLE: Fix static build.
Introduce QT_OPENGL_ES_2_ANGLE_STATIC define for static builds and modify export accordingly. Provided static instances of gl::Current and egl::Current for Qt's single threaded use. Task-number: QTBUG-28196 Change-Id: Ia75699d6da103fb8dd9d5fe97c1ee51e48a74406 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
parent
7686b2386d
commit
a8fce5d6e2
@ -21,6 +21,7 @@ wince* {
|
|||||||
QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2_RELEASE
|
QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2_RELEASE
|
||||||
}
|
}
|
||||||
DEFINES += QT_OPENGL_ES_2 QT_OPENGL_ES_2_ANGLE
|
DEFINES += QT_OPENGL_ES_2 QT_OPENGL_ES_2_ANGLE
|
||||||
|
contains(QT_CONFIG, static): DEFINES += QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
QT_CONFIG -= opengl
|
QT_CONFIG -= opengl
|
||||||
} else {
|
} else {
|
||||||
QMAKE_LIBS += $$QMAKE_LIBS_OPENGL
|
QMAKE_LIBS += $$QMAKE_LIBS_OPENGL
|
||||||
|
3
src/3rdparty/angle/include/KHR/khrplatform.h
vendored
3
src/3rdparty/angle/include/KHR/khrplatform.h
vendored
@ -97,7 +97,8 @@
|
|||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
* This precedes the return type of the function in the function prototype.
|
* 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)
|
# define KHRONOS_APICALL __declspec(dllimport)
|
||||||
#elif defined (__SYMBIAN32__)
|
#elif defined (__SYMBIAN32__)
|
||||||
# define KHRONOS_APICALL IMPORT_C
|
# define KHRONOS_APICALL IMPORT_C
|
||||||
|
58
src/3rdparty/angle/src/libEGL/main.cpp
vendored
58
src/3rdparty/angle/src/libEGL/main.cpp
vendored
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
|
|
||||||
|
#ifndef QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
static DWORD currentTLS = TLS_OUT_OF_INDEXES;
|
static DWORD currentTLS = TLS_OUT_OF_INDEXES;
|
||||||
|
|
||||||
extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
||||||
@ -86,76 +88,72 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline egl::Current *current()
|
||||||
|
{
|
||||||
|
return (egl::Current*)TlsGetValue(currentTLS);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
|
static egl::Current *current()
|
||||||
|
{
|
||||||
|
// No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
|
||||||
|
static egl::Current curr = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE };
|
||||||
|
return &curr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
namespace egl
|
namespace egl
|
||||||
{
|
{
|
||||||
void setCurrentError(EGLint error)
|
void setCurrentError(EGLint error)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
current()->error = error;
|
||||||
|
|
||||||
current->error = error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLint getCurrentError()
|
EGLint getCurrentError()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->error;
|
||||||
|
|
||||||
return current->error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentAPI(EGLenum API)
|
void setCurrentAPI(EGLenum API)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
current()->API = API;
|
||||||
|
|
||||||
current->API = API;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLenum getCurrentAPI()
|
EGLenum getCurrentAPI()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->API;
|
||||||
|
|
||||||
return current->API;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentDisplay(EGLDisplay dpy)
|
void setCurrentDisplay(EGLDisplay dpy)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
current()->display = dpy;
|
||||||
|
|
||||||
current->display = dpy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLDisplay getCurrentDisplay()
|
EGLDisplay getCurrentDisplay()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->display;
|
||||||
|
|
||||||
return current->display;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentDrawSurface(EGLSurface surface)
|
void setCurrentDrawSurface(EGLSurface surface)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
current()->drawSurface = surface;
|
||||||
|
|
||||||
current->drawSurface = surface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface getCurrentDrawSurface()
|
EGLSurface getCurrentDrawSurface()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->drawSurface;
|
||||||
|
|
||||||
return current->drawSurface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentReadSurface(EGLSurface surface)
|
void setCurrentReadSurface(EGLSurface surface)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
current()->readSurface = surface;
|
||||||
|
|
||||||
current->readSurface = surface;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLSurface getCurrentReadSurface()
|
EGLSurface getCurrentReadSurface()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->readSurface;
|
||||||
|
|
||||||
return current->readSurface;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
32
src/3rdparty/angle/src/libGLESv2/main.cpp
vendored
32
src/3rdparty/angle/src/libGLESv2/main.cpp
vendored
@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
#include "libGLESv2/Framebuffer.h"
|
#include "libGLESv2/Framebuffer.h"
|
||||||
|
|
||||||
|
#ifndef QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
static DWORD currentTLS = TLS_OUT_OF_INDEXES;
|
static DWORD currentTLS = TLS_OUT_OF_INDEXES;
|
||||||
|
|
||||||
extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
|
||||||
@ -72,14 +74,30 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gl::Current *current()
|
||||||
|
{
|
||||||
|
return (gl::Current*)TlsGetValue(currentTLS);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else // !QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
|
static inline gl::Current *current()
|
||||||
|
{
|
||||||
|
// No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
|
||||||
|
static gl::Current curr = { 0, 0 };
|
||||||
|
return &curr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
namespace gl
|
namespace gl
|
||||||
{
|
{
|
||||||
void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
|
void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
Current *curr = current();
|
||||||
|
|
||||||
current->context = context;
|
curr->context = context;
|
||||||
current->display = display;
|
curr->display = display;
|
||||||
|
|
||||||
if (context && display && surface)
|
if (context && display && surface)
|
||||||
{
|
{
|
||||||
@ -89,9 +107,7 @@ void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
|
|||||||
|
|
||||||
Context *getContext()
|
Context *getContext()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->context;
|
||||||
|
|
||||||
return current->context;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Context *getNonLostContext()
|
Context *getNonLostContext()
|
||||||
@ -115,9 +131,7 @@ Context *getNonLostContext()
|
|||||||
|
|
||||||
egl::Display *getDisplay()
|
egl::Display *getDisplay()
|
||||||
{
|
{
|
||||||
Current *current = (Current*)TlsGetValue(currentTLS);
|
return current()->display;
|
||||||
|
|
||||||
return current->display;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IDirect3DDevice9 *getDevice()
|
IDirect3DDevice9 *getDevice()
|
||||||
|
@ -0,0 +1,218 @@
|
|||||||
|
From cbe9afef7cd467c41353e8a41544d86807be7dd2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Friedemann Kleint <Friedemann.Kleint@digia.com>
|
||||||
|
Date: Thu, 14 Feb 2013 09:40:30 +0100
|
||||||
|
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 | 3 +-
|
||||||
|
src/3rdparty/angle/src/libEGL/main.cpp | 58 ++++++++++++++--------------
|
||||||
|
src/3rdparty/angle/src/libGLESv2/main.cpp | 32 ++++++++++-----
|
||||||
|
3 files changed, 53 insertions(+), 40 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/3rdparty/angle/include/KHR/khrplatform.h b/src/3rdparty/angle/include/KHR/khrplatform.h
|
||||||
|
index 56c676c..18a104e 100644
|
||||||
|
--- a/src/3rdparty/angle/include/KHR/khrplatform.h
|
||||||
|
+++ b/src/3rdparty/angle/include/KHR/khrplatform.h
|
||||||
|
@@ -97,7 +97,8 @@
|
||||||
|
*-------------------------------------------------------------------------
|
||||||
|
* 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 dc24c4f..614bcf6 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,76 +88,72 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static inline egl::Current *current()
|
||||||
|
+{
|
||||||
|
+ return (egl::Current*)TlsGetValue(currentTLS);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#else // !QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
+
|
||||||
|
+static egl::Current *current()
|
||||||
|
+{
|
||||||
|
+ // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
|
||||||
|
+ static egl::Current curr = { EGL_SUCCESS, EGL_OPENGL_ES_API, EGL_NO_DISPLAY, EGL_NO_SURFACE, EGL_NO_SURFACE };
|
||||||
|
+ return &curr;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif // QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
+
|
||||||
|
namespace egl
|
||||||
|
{
|
||||||
|
void setCurrentError(EGLint error)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- current->error = error;
|
||||||
|
+ current()->error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLint getCurrentError()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->error;
|
||||||
|
+ return current()->error;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCurrentAPI(EGLenum API)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- current->API = API;
|
||||||
|
+ current()->API = API;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLenum getCurrentAPI()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->API;
|
||||||
|
+ return current()->API;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCurrentDisplay(EGLDisplay dpy)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- current->display = dpy;
|
||||||
|
+ current()->display = dpy;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLDisplay getCurrentDisplay()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->display;
|
||||||
|
+ return current()->display;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCurrentDrawSurface(EGLSurface surface)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- current->drawSurface = surface;
|
||||||
|
+ current()->drawSurface = surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLSurface getCurrentDrawSurface()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->drawSurface;
|
||||||
|
+ return current()->drawSurface;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCurrentReadSurface(EGLSurface surface)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- current->readSurface = surface;
|
||||||
|
+ current()->readSurface = surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLSurface getCurrentReadSurface()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->readSurface;
|
||||||
|
+ return current()->readSurface;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/3rdparty/angle/src/libGLESv2/main.cpp b/src/3rdparty/angle/src/libGLESv2/main.cpp
|
||||||
|
index 6e678c2..3853e41 100644
|
||||||
|
--- a/src/3rdparty/angle/src/libGLESv2/main.cpp
|
||||||
|
+++ b/src/3rdparty/angle/src/libGLESv2/main.cpp
|
||||||
|
@@ -14,6 +14,8 @@
|
||||||
|
|
||||||
|
#include "libGLESv2/Framebuffer.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)
|
||||||
|
@@ -72,14 +74,30 @@ extern "C" BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gl::Current *current()
|
||||||
|
+{
|
||||||
|
+ return (gl::Current*)TlsGetValue(currentTLS);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#else // !QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
+
|
||||||
|
+static inline gl::Current *current()
|
||||||
|
+{
|
||||||
|
+ // No precautions for thread safety taken as ANGLE is used single-threaded in Qt.
|
||||||
|
+ static gl::Current curr = { 0, 0 };
|
||||||
|
+ return &curr;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif // QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
+
|
||||||
|
namespace gl
|
||||||
|
{
|
||||||
|
void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
+ Current *curr = current();
|
||||||
|
|
||||||
|
- current->context = context;
|
||||||
|
- current->display = display;
|
||||||
|
+ curr->context = context;
|
||||||
|
+ curr->display = display;
|
||||||
|
|
||||||
|
if (context && display && surface)
|
||||||
|
{
|
||||||
|
@@ -89,9 +107,7 @@ void makeCurrent(Context *context, egl::Display *display, egl::Surface *surface)
|
||||||
|
|
||||||
|
Context *getContext()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->context;
|
||||||
|
+ return current()->context;
|
||||||
|
}
|
||||||
|
|
||||||
|
Context *getNonLostContext()
|
||||||
|
@@ -115,9 +131,7 @@ Context *getNonLostContext()
|
||||||
|
|
||||||
|
egl::Display *getDisplay()
|
||||||
|
{
|
||||||
|
- Current *current = (Current*)TlsGetValue(currentTLS);
|
||||||
|
-
|
||||||
|
- return current->display;
|
||||||
|
+ return current()->display;
|
||||||
|
}
|
||||||
|
|
||||||
|
IDirect3DDevice9 *getDevice()
|
||||||
|
--
|
||||||
|
1.8.0.msysgit.0
|
||||||
|
|
@ -40,6 +40,8 @@ win32-msvc2012 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static: DEFINES *= QT_OPENGL_ES_2_ANGLE_STATIC
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$ANGLE_DIR/src/common/angleutils.h \
|
$$ANGLE_DIR/src/common/angleutils.h \
|
||||||
$$ANGLE_DIR/src/common/debug.h \
|
$$ANGLE_DIR/src/common/debug.h \
|
||||||
|
Loading…
Reference in New Issue
Block a user