Merge remote-tracking branch 'gerrit/master' into newdocs
[profile/ivi/qtbase.git] / src / gui / kernel / qplatformopenglcontext.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
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.
16 **
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.
24 **
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.
28 **
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.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qplatformopenglcontext.h"
43
44 #include <QOpenGLFunctions>
45
46 QT_BEGIN_NAMESPACE
47
48 /*!
49     \class QPlatformOpenGLContext
50     \since 4.8
51     \internal
52     \preliminary
53     \ingroup qpa
54
55     \brief The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
56
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.
59
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.
62
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.
68 */
69
70 /*! \fn void QPlatformOpenGLContext::swapBuffers(QPlatformSurface *surface)
71     Reimplement in subclass to native swap buffers calls
72
73     The implementation must support being called in a thread different than the gui-thread.
74 */
75
76 /*! \fn QFunctionPointer QPlatformOpenGLContext::getProcAddress(const QByteArray &procName)
77     Reimplement in subclass to native getProcAddr calls.
78
79     Note: its convenient to use qPrintable(const QString &str) to get the const char * pointer
80 */
81
82 class QPlatformOpenGLContextPrivate
83 {
84 public:
85     QPlatformOpenGLContextPrivate() : context(0) {}
86
87     QOpenGLContext *context;
88 };
89
90 QPlatformOpenGLContext::QPlatformOpenGLContext()
91     : d_ptr(new QPlatformOpenGLContextPrivate)
92 {
93 }
94
95 QPlatformOpenGLContext::~QPlatformOpenGLContext()
96 {
97 }
98
99 /*!
100     Reimplement in subclass if your platform uses framebuffer objects for surfaces.
101
102     The default implementation returns 0.
103 */
104 GLuint QPlatformOpenGLContext::defaultFramebufferObject(QPlatformSurface *) const
105 {
106     return 0;
107 }
108
109 QOpenGLContext *QPlatformOpenGLContext::context() const
110 {
111     Q_D(const QPlatformOpenGLContext);
112     return d->context;
113 }
114
115 void QPlatformOpenGLContext::setContext(QOpenGLContext *context)
116 {
117     Q_D(QPlatformOpenGLContext);
118     d->context = context;
119 }
120
121 bool QPlatformOpenGLContext::parseOpenGLVersion(const QByteArray &versionString, int &major, int &minor)
122 {
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);
132             } else {
133                 qWarning("Unrecognized OpenGL ES version");
134             }
135         } else {
136             // If < 3 parts to the name, it is an unrecognised OpenGL ES
137             qWarning("Unrecognised OpenGL ES version");
138         }
139     } else {
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);
145         } else {
146             qWarning("Unrecognized OpenGL version");
147         }
148     }
149
150     if (!majorOk || !minorOk)
151         qWarning("Unrecognized OpenGL version");
152     return (majorOk && minorOk);
153 }
154
155 QT_END_NAMESPACE