[Development] Is QGLWidget broken on Qt4/QPA?

Rafael Roquetto rafael.roquetto at kdab.com
Wed Dec 19 17:34:13 CET 2012


Hello,

I think I might have stumbled upon a bug in QGLWidget affecting QPA platforms.
This happens at least in BlackBerry, but I suspect it is a general issue.

When a QGLWidget is instantiated, a new native window is created once
Q[GL]Widget::winId() is called. This ultimately leads to a call to
QWidgetPrivate::create_sys(). This method tries to acquire a native window and
a backing store for the newly created QGLWidget. Creating the window by
calling QPlatformIntegration::createPlatformWindow() works as expected.
Then, before trying to directly call
QPlatformIntegration::createWindowSurface(), it first tries to get hold of an
existent surface, by calling QWidget::windowSurface(); Now if that returned 0,
it would proceed to create a new surface through
QPlatformIntegration::createWindowSurface(). But in practice it does not.
The relevant part of QWidget::windowSurface() tries to get the backing store
by invoking d->maybeBackingStore(), which in turns calls
q->window()->d_func()->maybeTopData()*!

    * this is exactly where the problem lies: window() will iterate the widget
    tree until it reaches the toplevel widget, which effectively has a window
    associated to it, and then return its backing store.

This means that the backing store being handed to QGLWidget is that of the
current toplevel window, and not a newly created backing store to be
associated with the newly created window for QGLWidget. In the case of
BlackBerry, this is causing QGLWidget to use a raster surface
(QBBRasterSurface) rather than a gl surface (QBBGLSurface). This may also
affect the Wayland plugin:

QWindowSurface *QWaylandIntegration::createWindowSurface(QWidget *widget, WId winId) const
{
    Q_UNUSED(winId);
    Q_UNUSED(winId);
#ifdef QT_WAYLAND_GL_SUPPORT
    bool useOpenGL = mUseOpenGL || (widget->platformWindowFormat().windowApi() == QPlatformWindowFormat::OpenGL);
    if (useOpenGL)
        return new QWaylandGLWindowSurface(widget);
#endif
    return new QWaylandShmWindowSurface(widget);
}

If by default the integration is using QWaylandShmWindowSurface, this will
cause QGLWidget to use it instead of QWaylandGLWindowSurface.

Now, I am not sure if I got the code right, so I would like to ask: am I
missing something or could this really be an issue?

Thanks,
Rafael
-- 
Rafael Roquetto | rafael.roquetto at kdab.com | Software Engineer
Klarälvdalens Datakonsult AB, a KDAB Group company
Tel. Sweden (HQ) +46-563-540090, USA +1-866-777-KDAB(5322)
KDAB - Qt Experts - Platform-independent software solutions

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3721 bytes
Desc: not available
URL: <http://lists.qt-project.org/pipermail/development/attachments/20121219/aeb7d1d8/attachment.bin>


More information about the Development mailing list