94 lines
3.5 KiB
Diff
94 lines
3.5 KiB
Diff
|
From 8731ab999b849dac4716e3d29f5f55ed8e56438e Mon Sep 17 00:00:00 2001
|
||
|
From: Thiago Macieira <thiago.macieira@nokia.com>
|
||
|
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
|
||
|
|