1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the QtGui module of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
40 ****************************************************************************/
42 #include "qplatformopenglcontext.h"
44 #include <QOpenGLFunctions>
49 \class QPlatformOpenGLContext
55 \brief The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
57 In QPA the way to support OpenGL or OpenVG or other technologies that requires a native GL
58 context is through the QPlatformOpenGLContext wrapper.
60 There is no factory function for QPlatformOpenGLContexts, but rather only one accessor function.
61 The only place to retrieve a QPlatformOpenGLContext from is through a QPlatformWindow.
63 The context which is current for a specific thread can be collected by the currentContext()
64 function. This is how QPlatformOpenGLContext also makes it possible to use the QtGui module
65 withhout using QOpenGLWidget. When using QOpenGLContext::currentContext(), it will ask
66 QPlatformOpenGLContext for the currentContext. Then a corresponding QOpenGLContext will be returned,
67 which maps to the QPlatformOpenGLContext.
70 /*! \fn void QPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
71 Reimplement in subclass to native swap buffers calls
73 The implementation must support being called in a thread different than the gui-thread.
76 /*! \fn QFunctionPointer QPlatformOpenGLContext::getProcAddress(const QByteArray &procName)
77 Reimplement in subclass to native getProcAddr calls.
79 Note: its convenient to use qPrintable(const QString &str) to get the const char * pointer
82 class QPlatformOpenGLContextPrivate
85 QPlatformOpenGLContextPrivate() : context(0) {}
87 QOpenGLContext *context;
90 QPlatformOpenGLContext::QPlatformOpenGLContext()
91 : d_ptr(new QPlatformOpenGLContextPrivate)
95 QPlatformOpenGLContext::~QPlatformOpenGLContext()
100 Reimplement in subclass if your platform uses framebuffer objects for surfaces.
102 The default implementation returns 0.
104 GLuint QPlatformOpenGLContext::defaultFramebufferObject(QPlatformSurface *) const
109 QOpenGLContext *QPlatformOpenGLContext::context() const
111 Q_D(const QPlatformOpenGLContext);
115 void QPlatformOpenGLContext::setContext(QOpenGLContext *context)
117 Q_D(QPlatformOpenGLContext);
118 d->context = context;
121 bool QPlatformOpenGLContext::parseOpenGLVersion(const QByteArray &versionString, int &major, int &minor)
123 bool majorOk = false;
124 bool minorOk = false;
125 QList<QByteArray> parts = versionString.split(' ');
126 if (versionString.startsWith(QByteArrayLiteral("OpenGL ES"))) {
127 if (parts.size() >= 3) {
128 QList<QByteArray> versionParts = parts.at(2).split('.');
129 if (versionParts.size() >= 2) {
130 major = versionParts.at(0).toInt(&majorOk);
131 minor = versionParts.at(1).toInt(&minorOk);
133 qWarning("Unrecognized OpenGL ES version");
136 // If < 3 parts to the name, it is an unrecognised OpenGL ES
137 qWarning("Unrecognised OpenGL ES version");
140 // Not OpenGL ES, but regular OpenGL, the version numbers are first in the string
141 QList<QByteArray> versionParts = parts.at(0).split('.');
142 if (versionParts.size() >= 2) {
143 major = versionParts.at(0).toInt(&majorOk);
144 minor = versionParts.at(1).toInt(&minorOk);
146 qWarning("Unrecognized OpenGL version");
150 if (!majorOk || !minorOk)
151 qWarning("Unrecognized OpenGL version");
152 return (majorOk && minorOk);