aboutsummaryrefslogtreecommitdiff
path: root/pixman
diff options
context:
space:
mode:
Diffstat (limited to 'pixman')
-rw-r--r--pixman/pixman/pixman-sse2.c15
-rw-r--r--pixman/test/lowlevel-blt-bench.c63
-rw-r--r--pixman/test/utils.c6
3 files changed, 72 insertions, 12 deletions
diff --git a/pixman/pixman/pixman-sse2.c b/pixman/pixman/pixman-sse2.c
index 993c2faf2..b656d17d4 100644
--- a/pixman/pixman/pixman-sse2.c
+++ b/pixman/pixman/pixman-sse2.c
@@ -5377,17 +5377,16 @@ FAST_NEAREST_MAINLOOP_COMMON (sse2_8888_n_8888_none_OVER,
#define BILINEAR_INTERPOLATE_ONE_PIXEL(pix) \
do { \
__m128i xmm_wh, xmm_lo, xmm_hi, a; \
- /* fetch 2x2 pixel block into sse2 register */ \
- uint32_t tl = src_top [pixman_fixed_to_int (vx)]; \
- uint32_t tr = src_top [pixman_fixed_to_int (vx) + 1]; \
- uint32_t bl = src_bottom [pixman_fixed_to_int (vx)]; \
- uint32_t br = src_bottom [pixman_fixed_to_int (vx) + 1]; \
- a = _mm_set_epi32 (tr, tl, br, bl); \
+ /* fetch 2x2 pixel block into sse2 registers */ \
+ __m128i tltr = _mm_loadl_epi64 ( \
+ (__m128i *)&src_top[pixman_fixed_to_int (vx)]); \
+ __m128i blbr = _mm_loadl_epi64 ( \
+ (__m128i *)&src_bottom[pixman_fixed_to_int (vx)]); \
vx += unit_x; \
/* vertical interpolation */ \
- a = _mm_add_epi16 (_mm_mullo_epi16 (_mm_unpackhi_epi8 (a, xmm_zero), \
+ a = _mm_add_epi16 (_mm_mullo_epi16 (_mm_unpacklo_epi8 (tltr, xmm_zero), \
xmm_wt), \
- _mm_mullo_epi16 (_mm_unpacklo_epi8 (a, xmm_zero), \
+ _mm_mullo_epi16 (_mm_unpacklo_epi8 (blbr, xmm_zero), \
xmm_wb)); \
/* calculate horizontal weights */ \
xmm_wh = _mm_add_epi16 (xmm_addc, \
diff --git a/pixman/test/lowlevel-blt-bench.c b/pixman/test/lowlevel-blt-bench.c
index b44b9f819..3afa926b0 100644
--- a/pixman/test/lowlevel-blt-bench.c
+++ b/pixman/test/lowlevel-blt-bench.c
@@ -80,10 +80,28 @@ bench_memcpy ()
return (double)total / (t2 - t1);
}
+static pixman_bool_t use_scaling = FALSE;
+static pixman_filter_t filter = PIXMAN_FILTER_NEAREST;
+
+/* nearly 1x scale factor */
+static pixman_transform_t m =
+{
+ {
+ { pixman_fixed_1 + 1, 0, 0 },
+ { 0, pixman_fixed_1, 0 },
+ { 0, 0, pixman_fixed_1 }
+ }
+};
+
static void
pixman_image_composite_wrapper (pixman_implementation_t *impl,
pixman_composite_info_t *info)
{
+ if (use_scaling)
+ {
+ pixman_image_set_filter (info->src_image, filter, NULL, 0);
+ pixman_image_set_transform(info->src_image, &m);
+ }
pixman_image_composite (info->op,
info->src_image, info->mask_image, info->dest_image,
info->src_x, info->src_y,
@@ -96,6 +114,11 @@ static void
pixman_image_composite_empty (pixman_implementation_t *impl,
pixman_composite_info_t *info)
{
+ if (use_scaling)
+ {
+ pixman_image_set_filter (info->src_image, filter, NULL, 0);
+ pixman_image_set_transform(info->src_image, &m);
+ }
pixman_image_composite (info->op,
info->src_image, info->mask_image, info->dest_image,
0, 0, 0, 0, 0, 0, 1, 1);
@@ -669,7 +692,35 @@ main (int argc, char *argv[])
{
double x;
int i;
- char *pattern = argc > 1 ? argv[1] : "all";
+ const char *pattern = NULL;
+ for (i = 1; i < argc; i++)
+ {
+ if (argv[i][0] == '-')
+ {
+ if (strchr (argv[i] + 1, 'b'))
+ {
+ use_scaling = TRUE;
+ filter = PIXMAN_FILTER_BILINEAR;
+ }
+ else if (strchr (argv[i] + 1, 'n'))
+ {
+ use_scaling = TRUE;
+ filter = PIXMAN_FILTER_NEAREST;
+ }
+ }
+ else
+ {
+ pattern = argv[i];
+ }
+ }
+
+ if (!pattern)
+ {
+ printf ("Usage: lowlevel-blt-bench [-b] [-n] pattern\n");
+ printf (" -n : benchmark nearest scaling\n");
+ printf (" -b : benchmark bilinear scaling\n");
+ return 1;
+ }
src = aligned_malloc (4096, BUFSIZE * 3);
memset (src, 0xCC, BUFSIZE * 3);
@@ -706,6 +757,16 @@ main (int argc, char *argv[])
bandwidth = x = bench_memcpy ();
printf ("reference memcpy speed = %.1fMB/s (%.1fMP/s for 32bpp fills)\n",
x / 1000000., x / 4000000);
+ if (use_scaling)
+ {
+ printf ("---\n");
+ if (filter == PIXMAN_FILTER_BILINEAR)
+ printf ("BILINEAR scaling\n");
+ else if (filter == PIXMAN_FILTER_NEAREST)
+ printf ("NEAREST scaling\n");
+ else
+ printf ("UNKNOWN scaling\n");
+ }
printf ("---\n");
for (i = 0; i < ARRAY_LENGTH (tests_tbl); i++)
diff --git a/pixman/test/utils.c b/pixman/test/utils.c
index 0abc32c66..563b33d52 100644
--- a/pixman/test/utils.c
+++ b/pixman/test/utils.c
@@ -686,9 +686,9 @@ gettime (void)
uint32_t
get_random_seed (void)
{
- double d = gettime();
-
- lcg_srand (*(uint32_t *)&d);
+ union { double d; uint32_t u32; } t;
+ t.d = gettime();
+ lcg_srand (t.u32);
return lcg_rand_u32 ();
}