summaryrefslogtreecommitdiffstats
path: root/src/multimedia/qmediaopenglhelper_p.h
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@digia.com>2014-02-05 15:54:36 +0100
committerLaszlo Agocs <laszlo.agocs@digia.com>2014-07-29 12:18:37 +0200
commit66ba21971b24942c7481eeb4a4ff156f54ea658a (patch)
tree15cd4c61a7c9966e9a2f2ce7732bf5dcf736daf9 /src/multimedia/qmediaopenglhelper_p.h
parent49cde1b2c4cdc44d1efd5f2d34b58d6a4fda56c8 (diff)
Support dynamic opengl32 - ANGLE switching on Windows
Change-Id: I38532db3ab0ad4fcb8dbabd0cbb528f7d8e4ba06 Reviewed-by: Andrew Knight <andrew.knight@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/multimedia/qmediaopenglhelper_p.h')
-rw-r--r--src/multimedia/qmediaopenglhelper_p.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/multimedia/qmediaopenglhelper_p.h b/src/multimedia/qmediaopenglhelper_p.h
new file mode 100644
index 000000000..298d13539
--- /dev/null
+++ b/src/multimedia/qmediaopenglhelper_p.h
@@ -0,0 +1,117 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QMEDIAOPENGLHELPER_P_H
+#define QMEDIAOPENGLHELPER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtGui/QOpenGLContext>
+
+#if defined(Q_OS_WIN) && (defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC))
+#include <EGL/egl.h>
+#endif
+
+QT_BEGIN_NAMESPACE
+
+class QMediaOpenGLHelper
+{
+public:
+ static bool isANGLE();
+};
+
+inline bool QMediaOpenGLHelper::isANGLE()
+{
+#ifdef Q_OS_WINRT
+ return true;
+#else
+ bool isANGLE = false;
+
+# if defined(Q_OS_WIN) && (defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC))
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
+ // Although unlikely, technically LibGLES could mean a non-ANGLE EGL/GLES2 implementation too.
+ // Verify that it is indeed ANGLE.
+# ifdef QT_OPENGL_ES_2_ANGLE_STATIC
+ // ANGLE linked-in statically.
+ isANGLE = true;
+# else
+ // Qt configured with either -opengl es2 or -opengl desktop.
+# ifdef QT_DEBUG
+ HMODULE eglHandle = LoadLibraryW(L"libEGLd.dll");
+# else
+ HMODULE eglHandle = LoadLibraryW(L"libEGL.dll");
+# endif // QT_DEBUG
+ if (eglHandle) {
+ typedef EGLDisplay (EGLAPIENTRYP EglGetDisplay)(EGLNativeDisplayType display_id);
+ typedef EGLBoolean (EGLAPIENTRYP EglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
+ typedef const char * (EGLAPIENTRYP EglQueryString)(EGLDisplay dpy, EGLint name);
+ EglGetDisplay eglGetDisplay = (EglGetDisplay) GetProcAddress(eglHandle, "eglGetDisplay");
+ EglInitialize eglInitialize = (EglInitialize) GetProcAddress(eglHandle, "eglInitialize");
+ EglQueryString eglQueryString = (EglQueryString) GetProcAddress(eglHandle, "eglQueryString");
+ if (eglGetDisplay && eglInitialize && eglQueryString) {
+ // EGL may not be initialized at this stage.
+ EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ eglInitialize(dpy, 0, 0);
+ const char *vendorStr = eglQueryString(dpy, EGL_VERSION);
+ isANGLE = vendorStr && strstr(vendorStr, "ANGLE");
+ }
+ }
+# endif // QT_OPENGL_ES_2_ANGLE_STATIC
+
+ }
+# endif // Q_OS_WIN && (QT_OPENGL_ES_2 || QT_OPENGL_DYNAMIC)
+
+ return isANGLE;
+#endif // Q_OS_WINRT
+}
+
+QT_END_NAMESPACE
+
+#endif