Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qopenglcontext_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QOPENGLCONTEXT_P_H
5#define QOPENGLCONTEXT_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtGui/private/qtguiglobal_p.h>
19
20#ifndef QT_NO_OPENGL
21
22#include <qopengl.h>
23#include "qopenglcontext.h"
24#include <private/qobject_p.h>
25#include <qmutex.h>
26
27#include <QtCore/QByteArray>
28#include <QtCore/QHash>
29#include <QtCore/QSet>
30
32
33
35class QOpenGLContext;
38
39class Q_GUI_EXPORT QOpenGLSharedResource
40{
41public:
43 virtual ~QOpenGLSharedResource() = 0;
44
45 QOpenGLContextGroup *group() const { return m_group; }
46
47 // schedule the resource for deletion at an appropriate time
48 void free();
49
50protected:
51 // the resource's share group no longer exists, invalidate the resource
52 virtual void invalidateResource() = 0;
53
54 // a valid context in the group is current, free the resource
56
57private:
58 QOpenGLContextGroup *m_group;
59
60 friend class QOpenGLContextGroup;
63
64 Q_DISABLE_COPY_MOVE(QOpenGLSharedResource)
65};
66
68{
69public:
70 typedef void (*FreeResourceFunc)(QOpenGLFunctions *functions, GLuint id);
72 : QOpenGLSharedResource(context->shareGroup())
73 , m_id(id)
74 , m_func(func)
75 {
76 }
78
79 GLuint id() const { return m_id; }
80
81protected:
82 void invalidateResource() override
83 {
84 m_id = 0;
85 }
86
87 void freeResource(QOpenGLContext *context) override;
88
89private:
90 GLuint m_id;
91 FreeResourceFunc m_func;
92};
93
94class Q_GUI_EXPORT QOpenGLContextGroupPrivate : public QObjectPrivate
95{
96 Q_DECLARE_PUBLIC(QOpenGLContextGroup)
97public:
99 : m_context(nullptr)
100 , m_refs(0)
101 {
102 }
104
105 void addContext(QOpenGLContext *ctx);
106 void removeContext(QOpenGLContext *ctx);
107
108 void cleanup();
109
110 void deletePendingResources(QOpenGLContext *ctx);
111
113
114 QList<QOpenGLContext *> m_shares;
116
117 QHash<QOpenGLMultiGroupSharedResource *, QOpenGLSharedResource *> m_resources;
119
120 QList<QOpenGLSharedResource *> m_sharedResources;
121 QList<QOpenGLSharedResource *> m_pendingDeletion;
122};
123
125{
126public:
129
132
134
135 QList<QOpenGLSharedResource *> resources() const;
136
137 template <typename T>
139 QOpenGLContextGroup *group = context->shareGroup();
140 // Have to use our own mutex here, not the group's, since
141 // m_groups has to be protected too against any concurrent access.
142 QMutexLocker locker(&m_mutex);
143 T *resource = static_cast<T *>(group->d_func()->m_resources.value(this, nullptr));
144 if (!resource) {
145 resource = new T(context);
146 insert(context, resource);
147 }
148 return resource;
149 }
150
151private:
152 QAtomicInt active;
153 QList<QOpenGLContextGroup *> m_groups;
154 QRecursiveMutex m_mutex;
155};
156
157class QPaintEngineEx;
158class QOpenGLFunctions;
161
163{
164public:
166};
167
168class Q_GUI_EXPORT QOpenGLContextPrivate : public QObjectPrivate
169{
170 Q_DECLARE_PUBLIC(QOpenGLContext)
171public:
173 : platformGLContext(nullptr)
174 , shareContext(nullptr)
175 , shareGroup(nullptr)
176 , screen(nullptr)
177 , surface(nullptr)
178 , functions(nullptr)
179 , textureFunctions(nullptr)
180 , versionFunctions(nullptr)
181 , vaoHelper(nullptr)
182 , vaoHelperDestroyCallback(nullptr)
183 , max_texture_size(-1)
184 , workaround_brokenFBOReadBack(false)
185 , workaround_brokenTexSubImage(false)
186 , workaround_missingPrecisionQualifiers(false)
187 , active_engine(nullptr)
188 , qgl_current_fbo_invalid(false)
189 , qgl_current_fbo(nullptr)
190 , defaultFboRedirect(0)
191 {
192 requestedFormat = QSurfaceFormat::defaultFormat();
193 }
194
195 ~QOpenGLContextPrivate() override;
196
197 void adopt(QPlatformOpenGLContext *);
198
206 mutable QSet<QByteArray> extensionNames;
213
215
219
221
223
224 // Set and unset in QOpenGLFramebufferObject::bind()/unbind().
225 // (Only meaningful for QOGLFBO since an FBO might be bound by other means)
226 // Saves us from querying the driver for the current FBO in most paths.
228
230
231 static QOpenGLContext *setCurrentContext(QOpenGLContext *context);
232
233 int maxTextureSize();
234
236 {
237 return context ? context->d_func() : nullptr;
238 }
239
240#if !defined(QT_NO_DEBUG)
242 {
243 QMutexLocker locker(&makeCurrentTrackerMutex);
244 bool old = makeCurrentTracker.value(context, false);
245 makeCurrentTracker.insert(context, value);
246 return old;
247 }
249 {
250 QMutexLocker locker(&makeCurrentTrackerMutex);
251 makeCurrentTracker.remove(context);
252 }
253 static QHash<QOpenGLContext *, bool> makeCurrentTracker;
255#endif
256
257 void _q_screenDestroyed(QObject *object);
258};
259
262
264
265#endif // QT_NO_OPENGL
266#endif // QOPENGLCONTEXT_P_H
\inmodule QtCore
Definition qatomic.h:112
\inmodule QtCore
Definition qmutex.h:313
\inmodule QtCore
Definition qmutex.h:281
\inmodule QtCore
Definition qobject.h:103
QHash< QOpenGLMultiGroupSharedResource *, QOpenGLSharedResource * > m_resources
~QOpenGLContextGroupPrivate() override
QList< QOpenGLSharedResource * > m_sharedResources
QList< QOpenGLContext * > m_shares
QList< QOpenGLSharedResource * > m_pendingDeletion
The QOpenGLContextGroup class represents a group of contexts sharing OpenGL resources....
QOpenGLContextGroup * shareGroup
QOpenGLVertexArrayObjectHelperDestroyCallback_t vaoHelperDestroyCallback
static void cleanMakeCurrentTracker(QOpenGLContext *context)
QPaintEngineEx * active_engine
QOpenGLContextVersionFunctionHelper * versionFunctions
QOpenGLContext * shareContext
QOpenGLTextureHelper * textureFunctions
QOpenGLFramebufferObject * qgl_current_fbo
QPlatformOpenGLContext * platformGLContext
QOpenGLFunctions * functions
QOpenGLVertexArrayObjectHelper * vaoHelper
void(*)(QOpenGLVertexArrayObjectHelper *) QOpenGLVertexArrayObjectHelperDestroyCallback_t
QSet< QByteArray > extensionNames
QSurfaceFormat requestedFormat
std::function< void()> textureFunctionsDestroyCallback
static QMutex makeCurrentTrackerMutex
static bool toggleMakeCurrentTracker(QOpenGLContext *context, bool value)
static QOpenGLContextPrivate * get(QOpenGLContext *context)
static QHash< QOpenGLContext *, bool > makeCurrentTracker
\inmodule QtGui
The QOpenGLFramebufferObject class encapsulates an OpenGL framebuffer object.
The QOpenGLFunctions class provides cross-platform access to the OpenGL ES 2.0 API.
The QOpenGLMultiGroupSharedResource keeps track of a shared resource that might be needed from multip...
T * value(QOpenGLContext *context)
The QOpenGLSharedResourceGuard class is a convenience sub-class of QOpenGLSharedResource to be used t...
QOpenGLSharedResourceGuard(QOpenGLContext *context, GLuint id, FreeResourceFunc func)
void invalidateResource() override
~QOpenGLSharedResourceGuard() override
The QOpenGLSharedResource class is used to keep track of resources that are shared between OpenGL con...
QOpenGLContextGroup * group() const
virtual void freeResource(QOpenGLContext *context)=0
virtual void invalidateResource()=0
The QPlatformOpenGLContext class provides an abstraction for native GL contexts.
\inmodule QtCore
Definition qmutex.h:309
The QScreen class is used to query screen properties. \inmodule QtGui.
Definition qscreen.h:32
The QSurfaceFormat class represents the format of a QSurface. \inmodule QtGui.
static QSurfaceFormat defaultFormat()
Returns the global default surface format.
\inmodule QtGui
Definition qsurface.h:21
EGLContext ctx
cache insert(employee->id(), employee)
Combined button and popup list for selecting options.
static void * context
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context)
Q_GUI_EXPORT QOpenGLContext * qt_gl_global_share_context()
typedef GLint(GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC)(GLuint program
GLenum GLuint id
[7]
GLboolean GLuint group
GLenum func
Definition qopenglext.h:663
#define GLuint
QScreen * screen
[1]
Definition main.cpp:29
QObject::connect nullptr