summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qdrawhelper.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-01-27 12:41:07 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-02-16 14:38:07 +0000
commitfc63b7459c61d48e30ed5803f5f22d69f043e824 (patch)
treece0c2eb14779d8fc022ddf0623d4bb4748ad348c /src/gui/painting/qdrawhelper.cpp
parentef32f16fc284e5017da6016f72a17957fa2fef34 (diff)
Don't fetch destination in RGB64 mode when not necessary
Extends the short-cut of not fetching destination to also apply to the RGB64 painting. This saves reading and converting destination pixels when they will be fully replaced with source pixels. Since ARGB32 was switched to using the RGB64 drawhelpers, and ARGB32 is particularly expensive to read, this change is important to avoid performance regression. Change-Id: If3a2439140d6364e8429783cfa786bd000cfab45 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
Diffstat (limited to 'src/gui/painting/qdrawhelper.cpp')
-rw-r--r--src/gui/painting/qdrawhelper.cpp41
1 files changed, 21 insertions, 20 deletions
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
index 4671c5cecf..654be5690b 100644
--- a/src/gui/painting/qdrawhelper.cpp
+++ b/src/gui/painting/qdrawhelper.cpp
@@ -1144,6 +1144,11 @@ static QRgba64 *QT_FASTCALL destFetch64uint32(QRgba64 *buffer, QRasterBuffer *ra
return const_cast<QRgba64 *>(layout->convertToARGB64PM(buffer, src, length, 0, 0));
}
+static QRgba64 * QT_FASTCALL destFetch64Undefined(QRgba64 *buffer, QRasterBuffer *, int, int, int)
+{
+ return buffer;
+}
+
static DestFetchProc destFetchProc[QImage::NImageFormats] =
{
0, // Format_Invalid
@@ -1176,8 +1181,8 @@ static DestFetchProc destFetchProc[QImage::NImageFormats] =
static DestFetchProc64 destFetchProc64[QImage::NImageFormats] =
{
0, // Format_Invalid
- destFetch64, // Format_Mono,
- destFetch64, // Format_MonoLSB
+ 0, // Format_Mono,
+ 0, // Format_MonoLSB
0, // Format_Indexed8
destFetch64uint32, // Format_RGB32
destFetch64uint32, // Format_ARGB32,
@@ -3737,27 +3742,23 @@ static inline Operator getOperator(const QSpanData *data, const QSpan *spans, in
op.destFetch = destFetchProc[data->rasterBuffer->format];
op.destFetch64 = destFetchProc64[data->rasterBuffer->format];
- if (op.mode == QPainter::CompositionMode_Source) {
- switch (data->rasterBuffer->format) {
- case QImage::Format_RGB32:
- case QImage::Format_ARGB32_Premultiplied:
- // don't clear destFetch as it sets up the pointer correctly to save one copy
- break;
- default: {
- if (data->type == QSpanData::Texture && data->texture.const_alpha != 256)
+ if (op.mode == QPainter::CompositionMode_Source &&
+ (data->type != QSpanData::Texture || data->texture.const_alpha == 256)) {
+ const QSpan *lastSpan = spans + spanCount;
+ bool alphaSpans = false;
+ while (spans < lastSpan) {
+ if (spans->coverage != 255) {
+ alphaSpans = true;
break;
- const QSpan *lastSpan = spans + spanCount;
- bool alphaSpans = false;
- while (spans < lastSpan) {
- if (spans->coverage != 255) {
- alphaSpans = true;
- break;
- }
- ++spans;
}
- if (!alphaSpans)
- op.destFetch = 0;
+ ++spans;
}
+ if (!alphaSpans) {
+ // If all spans are opaque we do not need to fetch dest.
+ // But don't clear passthrough destFetch as they are just as fast and save destStore.
+ if (op.destFetch != destFetchARGB32P)
+ op.destFetch = 0;
+ op.destFetch64 = destFetch64Undefined;
}
}