42 QOpenGLSharedResource(QOpenGLContextGroup *group);
43 virtual ~QOpenGLSharedResource() = 0;
45 QOpenGLContextGroup *group()
const {
return m_group; }
52 virtual void invalidateResource() = 0;
55 virtual void freeResource(QOpenGLContext *context) = 0;
58 QOpenGLContextGroup *m_group;
60 friend class QOpenGLContextGroup;
61 friend class QOpenGLContextGroupPrivate;
62 friend class QOpenGLMultiGroupSharedResource;
64 Q_DISABLE_COPY_MOVE(QOpenGLSharedResource)
96 Q_DECLARE_PUBLIC(QOpenGLContextGroup)
98 QOpenGLContextGroupPrivate()
103 ~QOpenGLContextGroupPrivate() override;
105 void addContext(QOpenGLContext *ctx);
106 void removeContext(QOpenGLContext *ctx);
110 void deletePendingResources(QOpenGLContext *ctx);
112 QOpenGLContext *m_context;
114 QList<QOpenGLContext *> m_shares;
115 QRecursiveMutex m_mutex;
117 QHash<QOpenGLMultiGroupSharedResource *, QOpenGLSharedResource *> m_resources;
120 QList<QOpenGLSharedResource *> m_sharedResources;
121 QList<QOpenGLSharedResource *> m_pendingDeletion;
127 QOpenGLMultiGroupSharedResource();
128 ~QOpenGLMultiGroupSharedResource();
130 void insert(QOpenGLContext *context, QOpenGLSharedResource *value);
131 void cleanup(QOpenGLContextGroup *group, QOpenGLSharedResource *value);
133 QOpenGLSharedResource *value(QOpenGLContext *context);
135 QList<QOpenGLSharedResource *> resources()
const;
137 template <
typename T>
138 T *value(QOpenGLContext *context) {
139 QOpenGLContextGroup *group = context->shareGroup();
142 QMutexLocker locker(&m_mutex);
143 T *resource =
static_cast<T *>(group->d_func()->m_resources.value(
this,
nullptr));
145 resource =
new T(context);
146 insert(context, resource);
153 QList<QOpenGLContextGroup *> m_groups;
154 QRecursiveMutex m_mutex;
170 Q_DECLARE_PUBLIC(QOpenGLContext)
172 QOpenGLContextPrivate()
173 : platformGLContext(
nullptr)
174 , shareContext(
nullptr)
175 , shareGroup(
nullptr)
179 , textureFunctions(
nullptr)
180 , versionFunctions(
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)
192 requestedFormat = QSurfaceFormat::defaultFormat();
195 ~QOpenGLContextPrivate() override;
197 void adopt(QPlatformOpenGLContext *);
199 QSurfaceFormat requestedFormat;
200 QPlatformOpenGLContext *platformGLContext;
201 QOpenGLContext *shareContext;
202 QOpenGLContextGroup *shareGroup;
205 QOpenGLFunctions *functions;
206 mutable QSet<QByteArray> extensionNames;
207 QOpenGLTextureHelper* textureFunctions;
208 std::function<
void()> textureFunctionsDestroyCallback;
209 QOpenGLContextVersionFunctionHelper *versionFunctions;
210 QOpenGLVertexArrayObjectHelper *vaoHelper;
211 using QOpenGLVertexArrayObjectHelperDestroyCallback_t =
void (*)(QOpenGLVertexArrayObjectHelper *);
212 QOpenGLVertexArrayObjectHelperDestroyCallback_t vaoHelperDestroyCallback;
214 GLint max_texture_size;
216 bool workaround_brokenFBOReadBack;
217 bool workaround_brokenTexSubImage;
218 bool workaround_missingPrecisionQualifiers;
220 QPaintEngineEx *active_engine;
222 bool qgl_current_fbo_invalid;
227 QOpenGLFramebufferObject *qgl_current_fbo;
229 GLuint defaultFboRedirect;
231 static QOpenGLContext *setCurrentContext(QOpenGLContext *context);
233 int maxTextureSize();
235 static QOpenGLContextPrivate *get(QOpenGLContext *context)
237 return context ? context->d_func() :
nullptr;
240#if !defined(QT_NO_DEBUG)
241 static bool toggleMakeCurrentTracker(QOpenGLContext *context,
bool value)
243 QMutexLocker locker(&makeCurrentTrackerMutex);
244 bool old = makeCurrentTracker.value(context,
false);
245 makeCurrentTracker.insert(context, value);
248 static void cleanMakeCurrentTracker(QOpenGLContext *context)
250 QMutexLocker locker(&makeCurrentTrackerMutex);
251 makeCurrentTracker.remove(context);
253 static QHash<QOpenGLContext *,
bool> makeCurrentTracker;
254 static QMutex makeCurrentTrackerMutex;
257 void _q_screenDestroyed(QObject *object);
The QOpenGLContextGroup class represents a group of contexts sharing OpenGL resources....
QOpenGLContext * qt_gl_global_share_context()
void qt_gl_set_global_share_context(QOpenGLContext *context)
static QOpenGLContext * global_share_context