summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2016-02-02 12:50:33 +0100
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-03-01 14:46:26 +0000
commit5e9a5246fb688a33ff27bed010226595f579f23d (patch)
treebfa49687f2bb6a91d04605e42377d4fdbd54bf12 /src
parentc69622fc60db8a3dc6755eda4136d01456a3785c (diff)
Ensure we can query all GL functions in all platform plugins
This is required to simplify our code in the opengl classes and makes it possible to remove OS dependent code paths in Qt Gui. Change-Id: Ice09440840c86b2d6ac8d3955d273846695338d4 Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src')
-rw-r--r--src/gui/kernel/qplatformintegration.cpp6
-rw-r--r--src/gui/kernel/qplatformopenglcontext.cpp4
-rw-r--r--src/platformsupport/eglconvenience/eglconvenience.pri2
-rw-r--r--src/platformsupport/eglconvenience/qeglplatformcontext.cpp10
-rw-r--r--src/plugins/platforms/directfb/qdirectfbglcontext.cpp7
-rw-r--r--src/plugins/platforms/mirclient/qmirclientglcontext.cpp6
-rw-r--r--src/plugins/platforms/openwfd/qopenwfdglcontext.cpp6
7 files changed, 32 insertions, 9 deletions
diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp
index 06e41f7364..a0e65654a6 100644
--- a/src/gui/kernel/qplatformintegration.cpp
+++ b/src/gui/kernel/qplatformintegration.cpp
@@ -224,7 +224,8 @@ QPlatformServices *QPlatformIntegration::services() const
platforms where no window management is available, meaning for example that windows
are never repositioned by the window manager. The default implementation returns \c true.
- \value AllGLFunctionsQueryable The QOpenGLContext backend provided by the platform is
+ \value AllGLFunctionsQueryable Deprecated. Used to indicate whether the QOpenGLContext
+ backend provided by the platform is
able to return function pointers from getProcAddress() even for standard OpenGL
functions, for example OpenGL 1 functions like glClear() or glDrawArrays(). This is
important because the OpenGL specifications do not require this ability from the
@@ -232,7 +233,8 @@ QPlatformServices *QPlatformIntegration::services() const
platform plugins may however choose to enhance the behavior in the backend
implementation for QOpenGLContext::getProcAddress() and support returning a function
pointer also for the standard, non-extension functions. This capability is a
- prerequisite for dynamic OpenGL loading.
+ prerequisite for dynamic OpenGL loading. Starting with Qt 5.7, the platform plugin
+ is required to have this capability.
\value ApplicationIcon The platform supports setting the application icon. (since 5.5)
*/
diff --git a/src/gui/kernel/qplatformopenglcontext.cpp b/src/gui/kernel/qplatformopenglcontext.cpp
index 5b375f7883..07b5a0dda6 100644
--- a/src/gui/kernel/qplatformopenglcontext.cpp
+++ b/src/gui/kernel/qplatformopenglcontext.cpp
@@ -73,7 +73,9 @@ QT_BEGIN_NAMESPACE
/*! \fn QFunctionPointer QPlatformOpenGLContext::getProcAddress(const char *procName)
- Reimplement in subclass to native getProcAddr calls.
+ Reimplement in subclass to allow dynamic querying of OpenGL symbols. As opposed to e.g. the wglGetProcAddress
+ function on Windows, Qt expects this methods to be able to return valid function pointers even for standard
+ OpenGL symbols.
*/
class QPlatformOpenGLContextPrivate
diff --git a/src/platformsupport/eglconvenience/eglconvenience.pri b/src/platformsupport/eglconvenience/eglconvenience.pri
index f1e0d58a6d..fe6d0eb748 100644
--- a/src/platformsupport/eglconvenience/eglconvenience.pri
+++ b/src/platformsupport/eglconvenience/eglconvenience.pri
@@ -26,4 +26,6 @@ contains(QT_CONFIG,egl) {
LIBS_PRIVATE += $$QMAKE_LIBS_X11
}
CONFIG += egl
+
+ LIBS_PRIVATE += $$QMAKE_LIBS_DYNLOAD
}
diff --git a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
index e4cfb86ab3..bd7254b73a 100644
--- a/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
+++ b/src/platformsupport/eglconvenience/qeglplatformcontext.cpp
@@ -48,6 +48,9 @@
#ifdef Q_OS_ANDROID
#include <QtCore/private/qjnihelpers_p.h>
#endif
+#ifndef Q_OS_WIN
+#include <dlfcn.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -443,7 +446,12 @@ void QEGLPlatformContext::swapBuffers(QPlatformSurface *surface)
QFunctionPointer QEGLPlatformContext::getProcAddress(const char *procName)
{
eglBindAPI(m_api);
- return eglGetProcAddress(procName);
+ QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
+#ifndef Q_OS_WIN
+ if (!proc)
+ proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
+#endif
+ return proc;
}
QSurfaceFormat QEGLPlatformContext::format() const
diff --git a/src/plugins/platforms/directfb/qdirectfbglcontext.cpp b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
index e1607b131a..847435d96e 100644
--- a/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbglcontext.cpp
@@ -40,6 +40,7 @@
#include "qdirectfbglcontext.h"
#include <directfbgl.h>
+#include <dlfcn.h>
#include <QDebug>
@@ -80,13 +81,13 @@ void QDirectFbGLContext::doneCurrent()
m_dfbGlContext->Unlock(m_dfbGlContext);
}
-void *QDirectFbGLContext::getProcAddress(const char *procName)
+QFunctionPointer QDirectFbGLContext::getProcAddress(const char *procName)
{
void *proc;
DFBResult result = m_dfbGlContext->GetProcAddress(m_dfbGlContext, procName, &proc);
if (result == DFB_OK)
- return proc;
- return 0;
+ return (QFunctionPointer) proc;
+ return dlsym(RTLD_DEFAULT, procName);
}
void QDirectFbGLContext::swapBuffers()
diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
index 7a288af6ff..b1ca0b1f7c 100644
--- a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
+++ b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
@@ -40,6 +40,7 @@
#include "qmirclientlogging.h"
#include <QtPlatformSupport/private/qeglconvenience_p.h>
#include <QtGui/private/qopenglcontext_p.h>
+#include <dlfcn.h>
#if !defined(QT_NO_DEBUG)
static void printOpenGLESConfig() {
@@ -150,5 +151,8 @@ QFunctionPointer QMirClientOpenGLContext::getProcAddress(const char *procName)
#else
ASSERT(eglBindAPI(api_in_use()) == EGL_TRUE);
#endif
- return eglGetProcAddress(procName);
+ QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
+ if (!proc)
+ proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
+ return proc;
}
diff --git a/src/plugins/platforms/openwfd/qopenwfdglcontext.cpp b/src/plugins/platforms/openwfd/qopenwfdglcontext.cpp
index e57be90870..31d369ae00 100644
--- a/src/plugins/platforms/openwfd/qopenwfdglcontext.cpp
+++ b/src/plugins/platforms/openwfd/qopenwfdglcontext.cpp
@@ -41,6 +41,7 @@
#include "qopenwfdwindow.h"
#include "qopenwfdscreen.h"
+#include <dlfcn.h>
QOpenWFDGLContext::QOpenWFDGLContext(QOpenWFDDevice *device)
: QPlatformOpenGLContext()
@@ -86,7 +87,10 @@ void QOpenWFDGLContext::swapBuffers(QPlatformSurface *surface)
QFunctionPointer QOpenWFDGLContext::getProcAddress(const char *procName)
{
- return eglGetProcAddress(procName);
+ QFunctionPointer proc = (QFunctionPointer) eglGetProcAddress(procName);
+ if (!proc)
+ proc = (QFunctionPointer) dlsym(RTLD_DEFAULT, procName);
+ return proc;
}
EGLContext QOpenWFDGLContext::eglContext() const