QWidget: replace manual memory management with unique_ptr [3/N]: topextra->shareContext

Despite the name, it's fully owned by an individual QWidget object.

Also make the member mutable, so we can remove the const_cast hack in
QWidgetPrivate::shareContext(), and protect QT_NO_OPENGL builds, since
the naked pointer compiled by chance due to some unguarded forward
declarations while a unique_ptr will somewhere want to call the dtor,
which doesn't compile on an object of merely forward-declared type.

Change-Id: If8027b55d303822236fcdc1a79e4f3010967b4d2
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
bb10
Marc Mutz 2019-05-24 22:06:09 +02:00
parent e3663b65a7
commit 19ccbdabfe
2 changed files with 7 additions and 8 deletions

View File

@ -1799,7 +1799,6 @@ void QWidgetPrivate::createTLExtra()
x->inTopLevelResize = false;
x->embedded = 0;
x->window = 0;
x->shareContext = 0;
x->initialScreenIndex = -1;
#if 0 // Used to be included in Qt4 for Q_WS_MAC
x->wasMaximized = false;
@ -1903,8 +1902,7 @@ void QWidgetPrivate::deleteTLSysExtra()
deleteBackingStore(this);
#ifndef QT_NO_OPENGL
extra->topextra->widgetTextures.clear();
delete extra->topextra->shareContext;
extra->topextra->shareContext = 0;
extra->topextra->shareContext.reset();
#endif
//the toplevel might have a context with a "qglcontext associated with it. We need to
@ -12413,16 +12411,15 @@ QOpenGLContext *QWidgetPrivate::shareContext() const
if (Q_UNLIKELY(!extra || !extra->topextra || !extra->topextra->window))
return 0;
QWidgetPrivate *that = const_cast<QWidgetPrivate *>(this);
if (!extra->topextra->shareContext) {
QOpenGLContext *ctx = new QOpenGLContext;
auto ctx = qt_make_unique<QOpenGLContext>();
ctx->setShareContext(qt_gl_global_share_context());
ctx->setFormat(extra->topextra->window->format());
ctx->setScreen(extra->topextra->window->screen());
ctx->create();
that->extra->topextra->shareContext = ctx;
extra->topextra->shareContext = std::move(ctx);
}
return that->extra->topextra->shareContext;
return extra->topextra->shareContext.get();
#endif // QT_NO_OPENGL
}

View File

@ -169,7 +169,9 @@ struct QTLWExtra {
QBackingStore *backingStore;
QPainter *sharedPainter;
QWidgetWindow *window;
QOpenGLContext *shareContext;
#ifndef QT_NO_OPENGL
mutable std::unique_ptr<QOpenGLContext> shareContext;
#endif
// Implicit pointers (shared_null).
QString caption; // widget caption