From 8731ab999b849dac4716e3d29f5f55ed8e56438e Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 25 Jun 2009 13:50:29 +0200 Subject: [PATCH 08/13] 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. qt-bugs@ issue : none Qt Software task ID : none bugs.kde.org number : none --- src/gui/image/qnativeimage.cpp | 10 ---------- src/gui/image/qnativeimage_p.h | 1 - src/gui/painting/qwindowsurface_raster.cpp | 13 ++++++++++--- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp index 3745708..3c21fce 100644 --- a/src/gui/image/qnativeimage.cpp +++ b/src/gui/image/qnativeimage.cpp @@ -147,7 +147,6 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /* { if (!X11->use_mitshm) { xshmimg = 0; - xshmpm = 0; image = QImage(width, height, format); return; } @@ -191,11 +190,6 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /* 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."; - } } @@ -204,10 +198,6 @@ QNativeImage::~QNativeImage() if (!xshmimg) return; - if (xshmpm) { - XFreePixmap(X11->display, xshmpm); - xshmpm = 0; - } XShmDetach(X11->display, &xshminfo); xshmimg->data = 0; XDestroyImage(xshmimg); diff --git a/src/gui/image/qnativeimage_p.h b/src/gui/image/qnativeimage_p.h index 07d5dfe..ba01854 100644 --- a/src/gui/image/qnativeimage_p.h +++ b/src/gui/image/qnativeimage_p.h @@ -90,7 +90,6 @@ public: #elif defined(Q_WS_X11) && !defined(QT_NO_MITSHM) XImage *xshmimg; - Pixmap xshmpm; XShmSegmentInfo xshminfo; #elif defined(Q_WS_MAC) diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp index d6fb03b..09963d9 100644 --- a/src/gui/painting/qwindowsurface_raster.cpp +++ b/src/gui/painting/qwindowsurface_raster.cpp @@ -220,9 +220,16 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi 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 -- 1.6.5.1