qt-bugs@ issue : none Qt Software task ID : none bugs.kde.org number : none applied: no author: Fredrik Höglund This patch makes the raster graphics system use shared images instead of shared pixmaps. Shared memory pixmaps are deprecated since they are slower than shared images with modern graphics hardware. They are also not supported by EXA drivers and can be disabled in the latest version of the NVidia driver. Index: src/gui/kernel/qapplication_x11.cpp =================================================================== --- src/gui/kernel/qapplication_x11.cpp (revision 934506) +++ src/gui/kernel/qapplication_x11.cpp (working copy) @@ -1943,7 +1943,7 @@ void qt_init(QApplicationPrivate *priv, // to determine whether the display is local or not (not 100 % accurate) bool local = displayName.isEmpty() || displayName.lastIndexOf(QLatin1Char(':')) == 0; if (local && (qgetenv("QT_X11_NO_MITSHM").toInt() == 0)) - X11->use_mitshm = mitshm_pixmaps; + X11->use_mitshm = true; } #endif // QT_NO_MITSHM Index: src/gui/image/qnativeimage_p.h =================================================================== --- src/gui/image/qnativeimage_p.h (revision 930645) +++ src/gui/image/qnativeimage_p.h (working copy) @@ -85,7 +85,6 @@ #elif defined(Q_WS_X11) && !defined(QT_NO_MITSHM) XImage *xshmimg; - Pixmap xshmpm; XShmSegmentInfo xshminfo; #elif defined(Q_WS_MAC) Index: src/gui/image/qnativeimage.cpp =================================================================== --- src/gui/image/qnativeimage.cpp (revision 930645) +++ src/gui/image/qnativeimage.cpp (working copy) @@ -140,7 +140,6 @@ { if (!X11->use_mitshm) { xshmimg = 0; - xshmpm = 0; image = QImage(width, height, format); return; } @@ -184,11 +183,6 @@ shmctl(xshminfo.shmid, IPC_RMID, 0); return; } - xshmpm = XShmCreatePixmap(X11->display, DefaultRootWindow(X11->display), xshmimg->data, - &xshminfo, width, height, dd); - if (!xshmpm) { - qWarning() << "QNativeImage: Unable to create shared Pixmap."; - } } @@ -197,10 +191,6 @@ if (!xshmimg) return; - if (xshmpm) { - XFreePixmap(X11->display, xshmpm); - xshmpm = 0; - } XShmDetach(X11->display, &xshminfo); xshmimg->data = 0; XDestroyImage(xshmimg); Index: src/gui/painting/qwindowsurface_raster.cpp =================================================================== --- src/gui/painting/qwindowsurface_raster.cpp (revision 930645) +++ src/gui/painting/qwindowsurface_raster.cpp (working copy) @@ -228,9 +228,16 @@ QRect br = rgn.boundingRect().translated(offset); #ifndef QT_NO_MITSHM - if (d_ptr->image->xshmpm) { - XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc, - br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y()); + if (d_ptr->image->xshmimg && (br.width() * br.height() > 65536)) { + const QImage &src = d->image->image; + br = br.intersected(src.rect()); + // Hack to make sure we satisify the PutImage() constraints in the X server, + // since the doShmPutImage() route currently forces a migration to system ram. + wbr.setX(wbr.x() - br.x()); + br.setX(0); + br.setWidth(src.width()); + XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg, + br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False); XSync(X11->display, False); } else #endif