summaryrefslogtreecommitdiffstats
path: root/src/gui/painting/qcompositionfunctions.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-08-03 13:27:38 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2016-08-03 15:35:28 +0000
commita9a61d7e0b45fae3595a94e6107ca04899cfb8f4 (patch)
tree6d59b799957123cd7dec80d6e62757bcaaf6bf0e /src/gui/painting/qcompositionfunctions.cpp
parent8ce18a52f2133e86cd3798c969a9bc49523c497a (diff)
Fix grayscale painting regression in 64-bit raster engine
A new define for better vectorized compositioning had a mistake that caused some sources to be converted to grayscale when composited. Added two 10 bit per channel formats to the lancelot test to catch regressions in the future. Change-Id: I1c468e6b93d68185e517fc0d44c6c927f9f7135f Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
Diffstat (limited to 'src/gui/painting/qcompositionfunctions.cpp')
-rw-r--r--src/gui/painting/qcompositionfunctions.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/gui/painting/qcompositionfunctions.cpp b/src/gui/painting/qcompositionfunctions.cpp
index 8d4ea58c39..6d2cb9aadb 100644
--- a/src/gui/painting/qcompositionfunctions.cpp
+++ b/src/gui/painting/qcompositionfunctions.cpp
@@ -89,11 +89,15 @@ QT_BEGIN_NAMESPACE
#if defined __SSE2__
# define LOAD(ptr) _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr))
-# define CONVERT(value) _mm_shufflelo_epi16(_mm_cvtsi32_si128(value), _MM_SHUFFLE(0, 0, 0, 0))
+#ifdef Q_PROCESSOR_X86_64
+# define CONVERT(value) _mm_cvtsi64_si128(value)
+#else
+# define CONVERT(value) LOAD(&value)
+#endif
# define STORE(ptr, value) _mm_storel_epi64(reinterpret_cast<__m128i *>(ptr), value)
# define ADD(p, q) _mm_add_epi32(p, q)
# define ALPHA(c) _mm_shufflelo_epi16(c, _MM_SHUFFLE(3, 3, 3, 3))
-# define CONST(n) CONVERT(n)
+# define CONST(n) _mm_shufflelo_epi16(_mm_cvtsi32_si128(n), _MM_SHUFFLE(0, 0, 0, 0))
# define INVALPHA(c) _mm_sub_epi32(CONST(65535), ALPHA(c))
#elif defined __ARM_NEON__
# define LOAD(ptr) vreinterpret_u16_u64(vld1_u64(reinterpret_cast<const uint64_t *>(ptr)))