43 QOpenGLSharedResource(QOpenGLContextGroup *group);
44 virtual ~QOpenGLSharedResource() = 0;
46 QOpenGLContextGroup *group()
const {
return m_group; }
53 virtual void invalidateResource() = 0;
56 virtual void freeResource(QOpenGLContext *context) = 0;
59 QOpenGLContextGroup *m_group;
61 friend class QOpenGLContextGroup;
62 friend class QOpenGLContextGroupPrivate;
63 friend class QOpenGLMultiGroupSharedResource;
65 Q_DISABLE_COPY_MOVE(QOpenGLSharedResource)
97 Q_DECLARE_PUBLIC(QOpenGLContextGroup)
99 QOpenGLContextGroupPrivate()
104 ~QOpenGLContextGroupPrivate() override;
106 void addContext(QOpenGLContext *ctx);
107 void removeContext(QOpenGLContext *ctx);
111 void deletePendingResources(QOpenGLContext *ctx);
113 QOpenGLContext *m_context;
115 QList<QOpenGLContext *> m_shares;
116 QRecursiveMutex m_mutex;
118 QHash<QOpenGLMultiGroupSharedResource *, QOpenGLSharedResource *> m_resources;
121 QList<QOpenGLSharedResource *> m_sharedResources;
122 QList<QOpenGLSharedResource *> m_pendingDeletion;
128 QOpenGLMultiGroupSharedResource();
129 ~QOpenGLMultiGroupSharedResource();
131 void insert(QOpenGLContext *context, QOpenGLSharedResource *value);
132 void cleanup(QOpenGLContextGroup *group, QOpenGLSharedResource *value);
134 QOpenGLSharedResource *value(QOpenGLContext *context);
136 QList<QOpenGLSharedResource *> resources()
const;
138 template <
typename T>
139 T *value(QOpenGLContext *context) {
140 QOpenGLContextGroup *group = context->shareGroup();
143 QMutexLocker locker(&m_mutex);
144 T *resource =
static_cast<T *>(group->d_func()->m_resources.value(
this,
nullptr));
146 resource =
new T(context);
147 insert(context, resource);
154 QList<QOpenGLContextGroup *> m_groups;
155 QRecursiveMutex m_mutex;
171 Q_DECLARE_PUBLIC(QOpenGLContext)
173 QOpenGLContextPrivate()
174 : platformGLContext(
nullptr)
175 , shareContext(
nullptr)
176 , shareGroup(
nullptr)
180 , textureFunctions(
nullptr)
181 , versionFunctions(
nullptr)
183 , vaoHelperDestroyCallback(
nullptr)
184 , max_texture_size(-1)
185 , workaround_brokenFBOReadBack(
false)
186 , workaround_brokenTexSubImage(
false)
187 , workaround_missingPrecisionQualifiers(
false)
188 , active_engine(
nullptr)
189 , qgl_current_fbo_invalid(
false)
190 , qgl_current_fbo(
nullptr)
191 , defaultFboRedirect(0)
193 requestedFormat = QSurfaceFormat::defaultFormat();
196 ~QOpenGLContextPrivate() override;
198 void adopt(QPlatformOpenGLContext *);
200 QSurfaceFormat requestedFormat;
201 QPlatformOpenGLContext *platformGLContext;
202 QOpenGLContext *shareContext;
203 QOpenGLContextGroup *shareGroup;
206 QOpenGLFunctions *functions;
207 mutable QSet<QByteArray> extensionNames;
208 QOpenGLTextureHelper* textureFunctions;
209 std::function<
void()> textureFunctionsDestroyCallback;
210 QOpenGLContextVersionFunctionHelper *versionFunctions;
211 QOpenGLVertexArrayObjectHelper *vaoHelper;
212 using QOpenGLVertexArrayObjectHelperDestroyCallback_t =
void (*)(QOpenGLVertexArrayObjectHelper *);
213 QOpenGLVertexArrayObjectHelperDestroyCallback_t vaoHelperDestroyCallback;
215 GLint max_texture_size;
217 bool workaround_brokenFBOReadBack;
218 bool workaround_brokenTexSubImage;
219 bool workaround_missingPrecisionQualifiers;
221 QPaintEngineEx *active_engine;
223 bool qgl_current_fbo_invalid;
228 QOpenGLFramebufferObject *qgl_current_fbo;
230 GLuint defaultFboRedirect;
232 static QOpenGLContext *setCurrentContext(QOpenGLContext *context);
234 int maxTextureSize();
236 static QOpenGLContextPrivate *get(QOpenGLContext *context)
238 return context ? context->d_func() :
nullptr;
241#if !defined(QT_NO_DEBUG)
242 static bool toggleMakeCurrentTracker(QOpenGLContext *context,
bool value)
244 QMutexLocker locker(&makeCurrentTrackerMutex);
245 bool old = makeCurrentTracker.value(context,
false);
246 makeCurrentTracker.insert(context, value);
249 static void cleanMakeCurrentTracker(QOpenGLContext *context)
251 QMutexLocker locker(&makeCurrentTrackerMutex);
252 makeCurrentTracker.remove(context);
254 static QHash<QOpenGLContext *,
bool> makeCurrentTracker;
255 static QMutex makeCurrentTrackerMutex;
258 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