lowlevel-blt-bench.c revision 6ba797d6
11b18d63aSmrg/*
21b18d63aSmrg * Copyright © 2009 Nokia Corporation
31b18d63aSmrg * Copyright © 2010 Movial Creative Technologies Oy
41b18d63aSmrg *
51b18d63aSmrg * Permission is hereby granted, free of charge, to any person obtaining a
61b18d63aSmrg * copy of this software and associated documentation files (the "Software"),
71b18d63aSmrg * to deal in the Software without restriction, including without limitation
81b18d63aSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
91b18d63aSmrg * and/or sell copies of the Software, and to permit persons to whom the
101b18d63aSmrg * Software is furnished to do so, subject to the following conditions:
111b18d63aSmrg *
121b18d63aSmrg * The above copyright notice and this permission notice (including the next
131b18d63aSmrg * paragraph) shall be included in all copies or substantial portions of the
141b18d63aSmrg * Software.
151b18d63aSmrg *
161b18d63aSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
171b18d63aSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
181b18d63aSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
191b18d63aSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
201b18d63aSmrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
211b18d63aSmrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
221b18d63aSmrg * DEALINGS IN THE SOFTWARE.
231b18d63aSmrg */
241b18d63aSmrg
251b18d63aSmrg#include <stdint.h>
261b18d63aSmrg#include <stdio.h>
271b18d63aSmrg#include <stdlib.h>
281b18d63aSmrg#include <string.h>
291b18d63aSmrg
301b18d63aSmrg#ifdef HAVE_CONFIG_H
311b18d63aSmrg#include <config.h>
321b18d63aSmrg#endif
331b18d63aSmrg
341b18d63aSmrg#include "pixman-private.h"
351b18d63aSmrg#include "utils.h"
361b18d63aSmrg
371b18d63aSmrg#define SOLID_FLAG 1
381b18d63aSmrg#define CA_FLAG    2
391b18d63aSmrg
401b18d63aSmrg#define L1CACHE_SIZE (8 * 1024)
411b18d63aSmrg#define L2CACHE_SIZE (128 * 1024)
421b18d63aSmrg
431b18d63aSmrg#define WIDTH  1920
441b18d63aSmrg#define HEIGHT 1080
451b18d63aSmrg#define BUFSIZE (WIDTH * HEIGHT * 4)
461b18d63aSmrg#define XWIDTH 256
471b18d63aSmrg#define XHEIGHT 256
481b18d63aSmrg#define TILEWIDTH 32
491b18d63aSmrg#define TINYWIDTH 8
501b18d63aSmrg
511b18d63aSmrg#define EXCLUDE_OVERHEAD 1
521b18d63aSmrg
531b18d63aSmrguint32_t *dst;
541b18d63aSmrguint32_t *src;
551b18d63aSmrguint32_t *mask;
561b18d63aSmrg
571b18d63aSmrgdouble bandwidth = 0;
581b18d63aSmrg
591b18d63aSmrgdouble
601b18d63aSmrgbench_memcpy ()
611b18d63aSmrg{
621b18d63aSmrg    int64_t n = 0, total;
631b18d63aSmrg    double  t1, t2;
641b18d63aSmrg    int     x = 0;
651b18d63aSmrg
661b18d63aSmrg    t1 = gettime ();
671b18d63aSmrg    while (1)
681b18d63aSmrg    {
691b18d63aSmrg	memcpy (dst, src, BUFSIZE - 64);
701b18d63aSmrg	memcpy (src, dst, BUFSIZE - 64);
711b18d63aSmrg	n += 4 * (BUFSIZE - 64);
721b18d63aSmrg	t2 = gettime ();
731b18d63aSmrg	if (t2 - t1 > 0.5)
741b18d63aSmrg	    break;
751b18d63aSmrg    }
761b18d63aSmrg    n = total = n * 5;
771b18d63aSmrg    t1 = gettime ();
781b18d63aSmrg    while (n > 0)
791b18d63aSmrg    {
801b18d63aSmrg	if (++x >= 64)
811b18d63aSmrg	    x = 0;
821b18d63aSmrg	memcpy ((char *)dst + 1, (char *)src + x, BUFSIZE - 64);
831b18d63aSmrg	memcpy ((char *)src + 1, (char *)dst + x, BUFSIZE - 64);
841b18d63aSmrg	n -= 4 * (BUFSIZE - 64);
851b18d63aSmrg    }
861b18d63aSmrg    t2 = gettime ();
871b18d63aSmrg    return (double)total / (t2 - t1);
881b18d63aSmrg}
891b18d63aSmrg
901b18d63aSmrgstatic void
911b18d63aSmrgpixman_image_composite_wrapper (pixman_implementation_t *impl,
926ba797d6Smrg				pixman_composite_info_t *info)
931b18d63aSmrg{
946ba797d6Smrg    pixman_image_composite (info->op,
956ba797d6Smrg			    info->src_image, info->mask_image, info->dest_image,
966ba797d6Smrg			    info->src_x, info->src_y,
976ba797d6Smrg			    info->mask_x, info->mask_y,
986ba797d6Smrg			    info->dest_x, info->dest_y,
996ba797d6Smrg			    info->width, info->height);
1001b18d63aSmrg}
1011b18d63aSmrg
1021b18d63aSmrgstatic void
1031b18d63aSmrgpixman_image_composite_empty (pixman_implementation_t *impl,
1046ba797d6Smrg			      pixman_composite_info_t *info)
1051b18d63aSmrg{
1066ba797d6Smrg    pixman_image_composite (info->op,
1076ba797d6Smrg			    info->src_image, info->mask_image, info->dest_image,
1086ba797d6Smrg			    0, 0, 0, 0, 0, 0, 1, 1);
1096ba797d6Smrg}
1106ba797d6Smrg
1116ba797d6Smrgstatic inline void
1126ba797d6Smrgcall_func (pixman_composite_func_t func,
1136ba797d6Smrg	   pixman_op_t             op,
1146ba797d6Smrg	   pixman_image_t *        src_image,
1156ba797d6Smrg	   pixman_image_t *        mask_image,
1166ba797d6Smrg	   pixman_image_t *        dest_image,
1176ba797d6Smrg	   int32_t		   src_x,
1186ba797d6Smrg	   int32_t		   src_y,
1196ba797d6Smrg	   int32_t                 mask_x,
1206ba797d6Smrg	   int32_t                 mask_y,
1216ba797d6Smrg	   int32_t                 dest_x,
1226ba797d6Smrg	   int32_t                 dest_y,
1236ba797d6Smrg	   int32_t                 width,
1246ba797d6Smrg	   int32_t                 height)
1256ba797d6Smrg{
1266ba797d6Smrg    pixman_composite_info_t info;
1276ba797d6Smrg
1286ba797d6Smrg    info.op = op;
1296ba797d6Smrg    info.src_image = src_image;
1306ba797d6Smrg    info.mask_image = mask_image;
1316ba797d6Smrg    info.dest_image = dest_image;
1326ba797d6Smrg    info.src_x = src_x;
1336ba797d6Smrg    info.src_y = src_y;
1346ba797d6Smrg    info.mask_x = mask_x;
1356ba797d6Smrg    info.mask_y = mask_y;
1366ba797d6Smrg    info.dest_x = dest_x;
1376ba797d6Smrg    info.dest_y = dest_y;
1386ba797d6Smrg    info.width = width;
1396ba797d6Smrg    info.height = height;
1406ba797d6Smrg
1416ba797d6Smrg    func (0, &info);
1421b18d63aSmrg}
1431b18d63aSmrg
1441b18d63aSmrgvoid
1451b18d63aSmrgnoinline
1461b18d63aSmrgbench_L  (pixman_op_t              op,
1471b18d63aSmrg          pixman_image_t *         src_img,
1481b18d63aSmrg          pixman_image_t *         mask_img,
1491b18d63aSmrg          pixman_image_t *         dst_img,
1501b18d63aSmrg          int64_t                  n,
1511b18d63aSmrg          pixman_composite_func_t  func,
1521b18d63aSmrg          int                      width,
1531b18d63aSmrg          int                      lines_count)
1541b18d63aSmrg{
1551b18d63aSmrg    int64_t      i, j;
1561b18d63aSmrg    int          x = 0;
1571b18d63aSmrg    int          q = 0;
1581b18d63aSmrg    volatile int qx;
1591b18d63aSmrg
1601b18d63aSmrg    for (i = 0; i < n; i++)
1611b18d63aSmrg    {
1621b18d63aSmrg	/* touch destination buffer to fetch it into L1 cache */
1631b18d63aSmrg	for (j = 0; j < width + 64; j += 16) {
1641b18d63aSmrg	    q += dst[j];
1651b18d63aSmrg	    q += src[j];
1661b18d63aSmrg	}
1671b18d63aSmrg	if (++x >= 64)
1681b18d63aSmrg	    x = 0;
1696ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, x, 0, x, 0, 63 - x, 0, width, lines_count);
1701b18d63aSmrg    }
1711b18d63aSmrg    qx = q;
1721b18d63aSmrg}
1731b18d63aSmrg
1741b18d63aSmrgvoid
1751b18d63aSmrgnoinline
1761b18d63aSmrgbench_M (pixman_op_t              op,
1771b18d63aSmrg         pixman_image_t *         src_img,
1781b18d63aSmrg         pixman_image_t *         mask_img,
1791b18d63aSmrg         pixman_image_t *         dst_img,
1801b18d63aSmrg         int64_t                  n,
1811b18d63aSmrg         pixman_composite_func_t  func)
1821b18d63aSmrg{
1831b18d63aSmrg    int64_t i;
1841b18d63aSmrg    int     x = 0;
1851b18d63aSmrg
1861b18d63aSmrg    for (i = 0; i < n; i++)
1871b18d63aSmrg    {
1881b18d63aSmrg	if (++x >= 64)
1891b18d63aSmrg	    x = 0;
1906ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, x, 0, x, 0, 1, 0, WIDTH - 64, HEIGHT);
1911b18d63aSmrg    }
1921b18d63aSmrg}
1931b18d63aSmrg
1941b18d63aSmrgdouble
1951b18d63aSmrgnoinline
1961b18d63aSmrgbench_HT (pixman_op_t              op,
1971b18d63aSmrg          pixman_image_t *         src_img,
1981b18d63aSmrg          pixman_image_t *         mask_img,
1991b18d63aSmrg          pixman_image_t *         dst_img,
2001b18d63aSmrg          int64_t                  n,
2011b18d63aSmrg          pixman_composite_func_t  func)
2021b18d63aSmrg{
2031b18d63aSmrg    double  pix_cnt = 0;
2041b18d63aSmrg    int     x = 0;
2051b18d63aSmrg    int     y = 0;
2061b18d63aSmrg    int64_t i;
2071b18d63aSmrg
2081b18d63aSmrg    srand (0);
2091b18d63aSmrg    for (i = 0; i < n; i++)
2101b18d63aSmrg    {
2111b18d63aSmrg	int w = (rand () % (TILEWIDTH * 2)) + 1;
2121b18d63aSmrg	int h = (rand () % (TILEWIDTH * 2)) + 1;
2131b18d63aSmrg	if (x + w > WIDTH)
2141b18d63aSmrg	{
2151b18d63aSmrg	    x = 0;
2161b18d63aSmrg	    y += TILEWIDTH * 2;
2171b18d63aSmrg	}
2181b18d63aSmrg	if (y + h > HEIGHT)
2191b18d63aSmrg	{
2201b18d63aSmrg	    y = 0;
2211b18d63aSmrg	}
2226ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, x, y, x, y, x, y, w, h);
2231b18d63aSmrg	x += w;
2241b18d63aSmrg	pix_cnt += w * h;
2251b18d63aSmrg    }
2261b18d63aSmrg    return pix_cnt;
2271b18d63aSmrg}
2281b18d63aSmrg
2291b18d63aSmrgdouble
2301b18d63aSmrgnoinline
2311b18d63aSmrgbench_VT (pixman_op_t              op,
2321b18d63aSmrg          pixman_image_t *         src_img,
2331b18d63aSmrg          pixman_image_t *         mask_img,
2341b18d63aSmrg          pixman_image_t *         dst_img,
2351b18d63aSmrg          int64_t                  n,
2361b18d63aSmrg          pixman_composite_func_t  func)
2371b18d63aSmrg{
2381b18d63aSmrg    double  pix_cnt = 0;
2391b18d63aSmrg    int     x = 0;
2401b18d63aSmrg    int     y = 0;
2411b18d63aSmrg    int64_t i;
2421b18d63aSmrg
2431b18d63aSmrg    srand (0);
2441b18d63aSmrg    for (i = 0; i < n; i++)
2451b18d63aSmrg    {
2461b18d63aSmrg	int w = (rand () % (TILEWIDTH * 2)) + 1;
2471b18d63aSmrg	int h = (rand () % (TILEWIDTH * 2)) + 1;
2481b18d63aSmrg	if (y + h > HEIGHT)
2491b18d63aSmrg	{
2501b18d63aSmrg	    y = 0;
2511b18d63aSmrg	    x += TILEWIDTH * 2;
2521b18d63aSmrg	}
2531b18d63aSmrg	if (x + w > WIDTH)
2541b18d63aSmrg	{
2551b18d63aSmrg	    x = 0;
2561b18d63aSmrg	}
2576ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, x, y, x, y, x, y, w, h);
2581b18d63aSmrg	y += h;
2591b18d63aSmrg	pix_cnt += w * h;
2601b18d63aSmrg    }
2611b18d63aSmrg    return pix_cnt;
2621b18d63aSmrg}
2631b18d63aSmrg
2641b18d63aSmrgdouble
2651b18d63aSmrgnoinline
2661b18d63aSmrgbench_R (pixman_op_t              op,
2671b18d63aSmrg         pixman_image_t *         src_img,
2681b18d63aSmrg         pixman_image_t *         mask_img,
2691b18d63aSmrg         pixman_image_t *         dst_img,
2701b18d63aSmrg         int64_t                  n,
2711b18d63aSmrg         pixman_composite_func_t  func,
2721b18d63aSmrg         int                      maxw,
2731b18d63aSmrg         int                      maxh)
2741b18d63aSmrg{
2751b18d63aSmrg    double  pix_cnt = 0;
2761b18d63aSmrg    int64_t i;
2771b18d63aSmrg
2781b18d63aSmrg    if (maxw <= TILEWIDTH * 2 || maxh <= TILEWIDTH * 2)
2791b18d63aSmrg    {
2801b18d63aSmrg	printf("error: maxw <= TILEWIDTH * 2 || maxh <= TILEWIDTH * 2\n");
2811b18d63aSmrg        return 0;
2821b18d63aSmrg    }
2831b18d63aSmrg
2841b18d63aSmrg    srand (0);
2851b18d63aSmrg    for (i = 0; i < n; i++)
2861b18d63aSmrg    {
2871b18d63aSmrg	int w = (rand () % (TILEWIDTH * 2)) + 1;
2881b18d63aSmrg	int h = (rand () % (TILEWIDTH * 2)) + 1;
2891b18d63aSmrg	int sx = rand () % (maxw - TILEWIDTH * 2);
2901b18d63aSmrg	int sy = rand () % (maxh - TILEWIDTH * 2);
2911b18d63aSmrg	int dx = rand () % (maxw - TILEWIDTH * 2);
2921b18d63aSmrg	int dy = rand () % (maxh - TILEWIDTH * 2);
2936ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, sx, sy, sx, sy, dx, dy, w, h);
2941b18d63aSmrg	pix_cnt += w * h;
2951b18d63aSmrg    }
2961b18d63aSmrg    return pix_cnt;
2971b18d63aSmrg}
2981b18d63aSmrg
2991b18d63aSmrgdouble
3001b18d63aSmrgnoinline
3011b18d63aSmrgbench_RT (pixman_op_t              op,
3021b18d63aSmrg          pixman_image_t *         src_img,
3031b18d63aSmrg          pixman_image_t *         mask_img,
3041b18d63aSmrg          pixman_image_t *         dst_img,
3051b18d63aSmrg          int64_t                  n,
3061b18d63aSmrg          pixman_composite_func_t  func,
3071b18d63aSmrg          int                      maxw,
3081b18d63aSmrg          int                      maxh)
3091b18d63aSmrg{
3101b18d63aSmrg    double  pix_cnt = 0;
3111b18d63aSmrg    int64_t i;
3121b18d63aSmrg
3131b18d63aSmrg    if (maxw <= TINYWIDTH * 2 || maxh <= TINYWIDTH * 2)
3141b18d63aSmrg    {
3151b18d63aSmrg	printf("error: maxw <= TINYWIDTH * 2 || maxh <= TINYWIDTH * 2\n");
3161b18d63aSmrg        return 0;
3171b18d63aSmrg    }
3181b18d63aSmrg
3191b18d63aSmrg    srand (0);
3201b18d63aSmrg    for (i = 0; i < n; i++)
3211b18d63aSmrg    {
3221b18d63aSmrg	int w = (rand () % (TINYWIDTH * 2)) + 1;
3231b18d63aSmrg	int h = (rand () % (TINYWIDTH * 2)) + 1;
3241b18d63aSmrg	int sx = rand () % (maxw - TINYWIDTH * 2);
3251b18d63aSmrg	int sy = rand () % (maxh - TINYWIDTH * 2);
3261b18d63aSmrg	int dx = rand () % (maxw - TINYWIDTH * 2);
3271b18d63aSmrg	int dy = rand () % (maxh - TINYWIDTH * 2);
3286ba797d6Smrg	call_func (func, op, src_img, mask_img, dst_img, sx, sy, sx, sy, dx, dy, w, h);
3291b18d63aSmrg	pix_cnt += w * h;
3301b18d63aSmrg    }
3311b18d63aSmrg    return pix_cnt;
3321b18d63aSmrg}
3331b18d63aSmrg
3341b18d63aSmrgvoid
3351b18d63aSmrgbench_composite (char * testname,
3361b18d63aSmrg                 int    src_fmt,
3371b18d63aSmrg                 int    src_flags,
3381b18d63aSmrg                 int    op,
3391b18d63aSmrg                 int    mask_fmt,
3401b18d63aSmrg                 int    mask_flags,
3411b18d63aSmrg                 int    dst_fmt,
3421b18d63aSmrg                 double npix)
3431b18d63aSmrg{
3441b18d63aSmrg    pixman_image_t *                src_img;
3451b18d63aSmrg    pixman_image_t *                dst_img;
3461b18d63aSmrg    pixman_image_t *                mask_img;
3471b18d63aSmrg    pixman_image_t *                xsrc_img;
3481b18d63aSmrg    pixman_image_t *                xdst_img;
3491b18d63aSmrg    pixman_image_t *                xmask_img;
3501b18d63aSmrg    double                          t1, t2, t3, pix_cnt;
3511b18d63aSmrg    int64_t                         n, l1test_width, nlines;
3521b18d63aSmrg    double                             bytes_per_pix = 0;
3531b18d63aSmrg
3541b18d63aSmrg    pixman_composite_func_t func = pixman_image_composite_wrapper;
3551b18d63aSmrg
3561b18d63aSmrg    if (!(src_flags & SOLID_FLAG))
3571b18d63aSmrg    {
3581b18d63aSmrg        bytes_per_pix += (src_fmt >> 24) / 8.0;
3591b18d63aSmrg        src_img = pixman_image_create_bits (src_fmt,
3601b18d63aSmrg                                            WIDTH, HEIGHT,
3611b18d63aSmrg                                            src,
3621b18d63aSmrg                                            WIDTH * 4);
3631b18d63aSmrg        xsrc_img = pixman_image_create_bits (src_fmt,
3641b18d63aSmrg                                             XWIDTH, XHEIGHT,
3651b18d63aSmrg                                             src,
3661b18d63aSmrg                                             XWIDTH * 4);
3671b18d63aSmrg    }
3681b18d63aSmrg    else
3691b18d63aSmrg    {
3701b18d63aSmrg        src_img = pixman_image_create_bits (src_fmt,
3711b18d63aSmrg                                            1, 1,
3721b18d63aSmrg                                            src,
3731b18d63aSmrg                                            4);
3741b18d63aSmrg        xsrc_img = pixman_image_create_bits (src_fmt,
3751b18d63aSmrg                                             1, 1,
3761b18d63aSmrg                                             src,
3771b18d63aSmrg                                             4);
3781b18d63aSmrg        pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL);
3791b18d63aSmrg        pixman_image_set_repeat (xsrc_img, PIXMAN_REPEAT_NORMAL);
3801b18d63aSmrg    }
3811b18d63aSmrg
3821b18d63aSmrg    bytes_per_pix += (dst_fmt >> 24) / 8.0;
3831b18d63aSmrg    dst_img = pixman_image_create_bits (dst_fmt,
3841b18d63aSmrg                                        WIDTH, HEIGHT,
3851b18d63aSmrg                                        dst,
3861b18d63aSmrg                                        WIDTH * 4);
3871b18d63aSmrg
3881b18d63aSmrg    mask_img = NULL;
3891b18d63aSmrg    xmask_img = NULL;
3901b18d63aSmrg    if (!(mask_flags & SOLID_FLAG) && mask_fmt != PIXMAN_null)
3911b18d63aSmrg    {
3921b18d63aSmrg        bytes_per_pix += (mask_fmt >> 24) / ((op == PIXMAN_OP_SRC) ? 8.0 : 4.0);
3931b18d63aSmrg        mask_img = pixman_image_create_bits (mask_fmt,
3941b18d63aSmrg                                             WIDTH, HEIGHT,
3951b18d63aSmrg                                             mask,
3961b18d63aSmrg                                             WIDTH * 4);
3971b18d63aSmrg        xmask_img = pixman_image_create_bits (mask_fmt,
3981b18d63aSmrg                                             XWIDTH, XHEIGHT,
3991b18d63aSmrg                                             mask,
4001b18d63aSmrg                                             XWIDTH * 4);
4011b18d63aSmrg    }
4021b18d63aSmrg    else if (mask_fmt != PIXMAN_null)
4031b18d63aSmrg    {
4041b18d63aSmrg        mask_img = pixman_image_create_bits (mask_fmt,
4051b18d63aSmrg                                             1, 1,
4061b18d63aSmrg                                             mask,
4071b18d63aSmrg                                             4);
4081b18d63aSmrg        xmask_img = pixman_image_create_bits (mask_fmt,
4091b18d63aSmrg                                             1, 1,
4101b18d63aSmrg                                             mask,
4111b18d63aSmrg                                             4 * 4);
4121b18d63aSmrg       pixman_image_set_repeat (mask_img, PIXMAN_REPEAT_NORMAL);
4131b18d63aSmrg       pixman_image_set_repeat (xmask_img, PIXMAN_REPEAT_NORMAL);
4141b18d63aSmrg    }
4151b18d63aSmrg    if ((mask_flags & CA_FLAG) && mask_fmt != PIXMAN_null)
4161b18d63aSmrg    {
4171b18d63aSmrg       pixman_image_set_component_alpha (mask_img, 1);
4181b18d63aSmrg    }
4191b18d63aSmrg    xdst_img = pixman_image_create_bits (dst_fmt,
4201b18d63aSmrg                                         XWIDTH, XHEIGHT,
4211b18d63aSmrg                                         dst,
4221b18d63aSmrg                                         XWIDTH * 4);
4231b18d63aSmrg
4241b18d63aSmrg
4251b18d63aSmrg    printf ("%24s %c", testname, func != pixman_image_composite_wrapper ?
4261b18d63aSmrg            '-' : '=');
4271b18d63aSmrg
4281b18d63aSmrg    memcpy (src, dst, BUFSIZE);
4291b18d63aSmrg    memcpy (dst, src, BUFSIZE);
4301b18d63aSmrg
4311b18d63aSmrg    l1test_width = L1CACHE_SIZE / 8 - 64;
4321b18d63aSmrg    if (l1test_width < 1)
4331b18d63aSmrg	l1test_width = 1;
4341b18d63aSmrg    if (l1test_width > WIDTH - 64)
4351b18d63aSmrg	l1test_width = WIDTH - 64;
4361b18d63aSmrg    n = 1 + npix / (l1test_width * 8);
4371b18d63aSmrg    t1 = gettime ();
4381b18d63aSmrg#if EXCLUDE_OVERHEAD
4391b18d63aSmrg    bench_L (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty, l1test_width, 1);
4401b18d63aSmrg#endif
4411b18d63aSmrg    t2 = gettime ();
4421b18d63aSmrg    bench_L (op, src_img, mask_img, dst_img, n, func, l1test_width, 1);
4431b18d63aSmrg    t3 = gettime ();
4441b18d63aSmrg    printf ("  L1:%7.2f", (double)n * l1test_width * 1 /
4451b18d63aSmrg            ((t3 - t2) - (t2 - t1)) / 1000000.);
4461b18d63aSmrg    fflush (stdout);
4471b18d63aSmrg
4481b18d63aSmrg    memcpy (src, dst, BUFSIZE);
4491b18d63aSmrg    memcpy (dst, src, BUFSIZE);
4501b18d63aSmrg
4511b18d63aSmrg    nlines = (L2CACHE_SIZE / l1test_width) /
4521b18d63aSmrg	((PIXMAN_FORMAT_BPP(src_fmt) + PIXMAN_FORMAT_BPP(dst_fmt)) / 8);
4531b18d63aSmrg    if (nlines < 1)
4541b18d63aSmrg	nlines = 1;
4551b18d63aSmrg    n = 1 + npix / (l1test_width * nlines);
4561b18d63aSmrg    t1 = gettime ();
4571b18d63aSmrg#if EXCLUDE_OVERHEAD
4581b18d63aSmrg    bench_L (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty, l1test_width, nlines);
4591b18d63aSmrg#endif
4601b18d63aSmrg    t2 = gettime ();
4611b18d63aSmrg    bench_L (op, src_img, mask_img, dst_img, n, func, l1test_width, nlines);
4621b18d63aSmrg    t3 = gettime ();
4631b18d63aSmrg    printf ("  L2:%7.2f", (double)n * l1test_width * nlines /
4641b18d63aSmrg            ((t3 - t2) - (t2 - t1)) / 1000000.);
4651b18d63aSmrg    fflush (stdout);
4661b18d63aSmrg
4671b18d63aSmrg    memcpy (src, dst, BUFSIZE);
4681b18d63aSmrg    memcpy (dst, src, BUFSIZE);
4691b18d63aSmrg
4701b18d63aSmrg    n = 1 + npix / (WIDTH * HEIGHT);
4711b18d63aSmrg    t1 = gettime ();
4721b18d63aSmrg#if EXCLUDE_OVERHEAD
4731b18d63aSmrg    bench_M (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty);
4741b18d63aSmrg#endif
4751b18d63aSmrg    t2 = gettime ();
4761b18d63aSmrg    bench_M (op, src_img, mask_img, dst_img, n, func);
4771b18d63aSmrg    t3 = gettime ();
4781b18d63aSmrg    printf ("  M:%6.2f (%6.2f%%)",
4791b18d63aSmrg        ((double)n * (WIDTH - 64) * HEIGHT / ((t3 - t2) - (t2 - t1))) / 1000000.,
4801b18d63aSmrg        ((double)n * (WIDTH - 64) * HEIGHT / ((t3 - t2) - (t2 - t1)) * bytes_per_pix) * (100.0 / bandwidth) );
4811b18d63aSmrg    fflush (stdout);
4821b18d63aSmrg
4831b18d63aSmrg    memcpy (src, dst, BUFSIZE);
4841b18d63aSmrg    memcpy (dst, src, BUFSIZE);
4851b18d63aSmrg
4861b18d63aSmrg    n = 1 + npix / (8 * TILEWIDTH * TILEWIDTH);
4871b18d63aSmrg    t1 = gettime ();
4881b18d63aSmrg#if EXCLUDE_OVERHEAD
4891b18d63aSmrg    pix_cnt = bench_HT (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty);
4901b18d63aSmrg#endif
4911b18d63aSmrg    t2 = gettime ();
4921b18d63aSmrg    pix_cnt = bench_HT (op, src_img, mask_img, dst_img, n, func);
4931b18d63aSmrg    t3 = gettime ();
4941b18d63aSmrg    printf ("  HT:%6.2f", (double)pix_cnt / ((t3 - t2) - (t2 - t1)) / 1000000.);
4951b18d63aSmrg    fflush (stdout);
4961b18d63aSmrg
4971b18d63aSmrg    memcpy (src, dst, BUFSIZE);
4981b18d63aSmrg    memcpy (dst, src, BUFSIZE);
4991b18d63aSmrg
5001b18d63aSmrg    n = 1 + npix / (8 * TILEWIDTH * TILEWIDTH);
5011b18d63aSmrg    t1 = gettime ();
5021b18d63aSmrg#if EXCLUDE_OVERHEAD
5031b18d63aSmrg    pix_cnt = bench_VT (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty);
5041b18d63aSmrg#endif
5051b18d63aSmrg    t2 = gettime ();
5061b18d63aSmrg    pix_cnt = bench_VT (op, src_img, mask_img, dst_img, n, func);
5071b18d63aSmrg    t3 = gettime ();
5081b18d63aSmrg    printf ("  VT:%6.2f", (double)pix_cnt / ((t3 - t2) - (t2 - t1)) / 1000000.);
5091b18d63aSmrg    fflush (stdout);
5101b18d63aSmrg
5111b18d63aSmrg    memcpy (src, dst, BUFSIZE);
5121b18d63aSmrg    memcpy (dst, src, BUFSIZE);
5131b18d63aSmrg
5141b18d63aSmrg    n = 1 + npix / (8 * TILEWIDTH * TILEWIDTH);
5151b18d63aSmrg    t1 = gettime ();
5161b18d63aSmrg#if EXCLUDE_OVERHEAD
5171b18d63aSmrg    pix_cnt = bench_R (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty, WIDTH, HEIGHT);
5181b18d63aSmrg#endif
5191b18d63aSmrg    t2 = gettime ();
5201b18d63aSmrg    pix_cnt = bench_R (op, src_img, mask_img, dst_img, n, func, WIDTH, HEIGHT);
5211b18d63aSmrg    t3 = gettime ();
5221b18d63aSmrg    printf ("  R:%6.2f", (double)pix_cnt / ((t3 - t2) - (t2 - t1)) / 1000000.);
5231b18d63aSmrg    fflush (stdout);
5241b18d63aSmrg
5251b18d63aSmrg    memcpy (src, dst, BUFSIZE);
5261b18d63aSmrg    memcpy (dst, src, BUFSIZE);
5271b18d63aSmrg
5281b18d63aSmrg    n = 1 + npix / (16 * TINYWIDTH * TINYWIDTH);
5291b18d63aSmrg    t1 = gettime ();
5301b18d63aSmrg#if EXCLUDE_OVERHEAD
5311b18d63aSmrg    pix_cnt = bench_RT (op, src_img, mask_img, dst_img, n, pixman_image_composite_empty, WIDTH, HEIGHT);
5321b18d63aSmrg#endif
5331b18d63aSmrg    t2 = gettime ();
5341b18d63aSmrg    pix_cnt = bench_RT (op, src_img, mask_img, dst_img, n, func, WIDTH, HEIGHT);
5351b18d63aSmrg    t3 = gettime ();
5361b18d63aSmrg    printf ("  RT:%6.2f (%4.0fKops/s)\n", (double)pix_cnt / ((t3 - t2) - (t2 - t1)) / 1000000., (double) n / ((t3 - t2) * 1000));
5371b18d63aSmrg
5381b18d63aSmrg    if (mask_img) {
5391b18d63aSmrg	pixman_image_unref (mask_img);
5401b18d63aSmrg	pixman_image_unref (xmask_img);
5411b18d63aSmrg    }
5421b18d63aSmrg    pixman_image_unref (src_img);
5431b18d63aSmrg    pixman_image_unref (dst_img);
5441b18d63aSmrg    pixman_image_unref (xsrc_img);
5451b18d63aSmrg    pixman_image_unref (xdst_img);
5461b18d63aSmrg}
5471b18d63aSmrg
5481b18d63aSmrg#define PIXMAN_OP_OUT_REV (PIXMAN_OP_OUT_REVERSE)
5491b18d63aSmrg
5501b18d63aSmrgstruct
5511b18d63aSmrg{
5521b18d63aSmrg    char *testname;
5531b18d63aSmrg    int   src_fmt;
5541b18d63aSmrg    int   src_flags;
5551b18d63aSmrg    int   op;
5561b18d63aSmrg    int   mask_fmt;
5571b18d63aSmrg    int   mask_flags;
5581b18d63aSmrg    int   dst_fmt;
5591b18d63aSmrg}
5601b18d63aSmrgtests_tbl[] =
5611b18d63aSmrg{
5621b18d63aSmrg    { "add_8_8_8",             PIXMAN_a8,          0, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a8 },
5631b18d63aSmrg    { "add_n_8_8",             PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a8 },
5641b18d63aSmrg    { "add_n_8_8888",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
5651b18d63aSmrg    { "add_n_8_x888",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
5661b18d63aSmrg    { "add_n_8_0565",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
5671b18d63aSmrg    { "add_n_8_1555",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a1r5g5b5 },
5681b18d63aSmrg    { "add_n_8_4444",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a4r4g4b4 },
5691b18d63aSmrg    { "add_n_8_2222",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a2r2g2b2 },
5701b18d63aSmrg    { "add_n_8_2x10",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_x2r10g10b10 },
5711b18d63aSmrg    { "add_n_8_2a10",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_a8,       0, PIXMAN_a2r10g10b10 },
5721b18d63aSmrg    { "add_n_8",               PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a8 },
5731b18d63aSmrg    { "add_n_8888",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
5741b18d63aSmrg    { "add_n_x888",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
5751b18d63aSmrg    { "add_n_0565",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
5761b18d63aSmrg    { "add_n_1555",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
5771b18d63aSmrg    { "add_n_4444",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a4r4g4b4 },
5781b18d63aSmrg    { "add_n_2222",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a2r2g2b2 },
5791b18d63aSmrg    { "add_n_2x10",            PIXMAN_a2r10g10b10, 1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_x2r10g10b10 },
5801b18d63aSmrg    { "add_n_2a10",            PIXMAN_a2r10g10b10, 1, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a2r10g10b10 },
5811b18d63aSmrg    { "add_8_8",               PIXMAN_a8,          0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a8 },
5821b18d63aSmrg    { "add_x888_x888",         PIXMAN_x8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
5831b18d63aSmrg    { "add_8888_8888",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
5841b18d63aSmrg    { "add_8888_0565",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
5851b18d63aSmrg    { "add_8888_1555",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
5861b18d63aSmrg    { "add_8888_4444",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a4r4g4b4 },
5871b18d63aSmrg    { "add_8888_2222",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a2r2g2b2 },
5881b18d63aSmrg    { "add_0565_0565",         PIXMAN_r5g6b5,      0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
5891b18d63aSmrg    { "add_1555_1555",         PIXMAN_a1r5g5b5,    0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
5901b18d63aSmrg    { "add_0565_2x10",         PIXMAN_r5g6b5,      0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_x2r10g10b10 },
5911b18d63aSmrg    { "add_2a10_2a10",         PIXMAN_a2r10g10b10, 0, PIXMAN_OP_ADD,     PIXMAN_null,     0, PIXMAN_a2r10g10b10 },
5921b18d63aSmrg    { "src_n_2222",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a2r2g2b2 },
5931b18d63aSmrg    { "src_n_0565",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
5941b18d63aSmrg    { "src_n_1555",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
5951b18d63aSmrg    { "src_n_4444",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a4r4g4b4 },
5961b18d63aSmrg    { "src_n_x888",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
5971b18d63aSmrg    { "src_n_8888",            PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
5981b18d63aSmrg    { "src_n_2x10",            PIXMAN_a2r10g10b10, 1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_x2r10g10b10 },
5991b18d63aSmrg    { "src_n_2a10",            PIXMAN_a2r10g10b10, 1, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a2r10g10b10 },
6001b18d63aSmrg    { "src_8888_0565",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
6011b18d63aSmrg    { "src_8888_4444",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a4r4g4b4 },
6021b18d63aSmrg    { "src_8888_2222",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a2r2g2b2 },
6031b18d63aSmrg    { "src_8888_2x10",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_x2r10g10b10 },
6041b18d63aSmrg    { "src_8888_2a10",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a2r10g10b10 },
6051b18d63aSmrg    { "src_0888_0565",         PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
6061b18d63aSmrg    { "src_0888_8888",         PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
6071b18d63aSmrg    { "src_0888_x888",         PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
6081b18d63aSmrg    { "src_x888_x888",         PIXMAN_x8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
6091b18d63aSmrg    { "src_x888_8888",         PIXMAN_x8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
6101b18d63aSmrg    { "src_8888_8888",         PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
6111b18d63aSmrg    { "src_0565_0565",         PIXMAN_r5g6b5,      0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
6121b18d63aSmrg    { "src_1555_0565",         PIXMAN_a1r5g5b5,    0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_r5g6b5 },
6131b18d63aSmrg    { "src_0565_1555",         PIXMAN_r5g6b5,      0, PIXMAN_OP_SRC,     PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
6141b18d63aSmrg    { "src_n_8_0565",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6151b18d63aSmrg    { "src_n_8_1555",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a1r5g5b5 },
6161b18d63aSmrg    { "src_n_8_4444",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a4r4g4b4 },
6171b18d63aSmrg    { "src_n_8_2222",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a2r2g2b2 },
6181b18d63aSmrg    { "src_n_8_x888",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
6191b18d63aSmrg    { "src_n_8_8888",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
6201b18d63aSmrg    { "src_n_8_2x10",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_x2r10g10b10 },
6211b18d63aSmrg    { "src_n_8_2a10",          PIXMAN_a8r8g8b8,    1, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a2r10g10b10 },
6221b18d63aSmrg    { "src_8888_8_0565",       PIXMAN_a8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6231b18d63aSmrg    { "src_0888_8_0565",       PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6241b18d63aSmrg    { "src_0888_8_8888",       PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
6251b18d63aSmrg    { "src_0888_8_x888",       PIXMAN_r8g8b8,      0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
6261b18d63aSmrg    { "src_x888_8_x888",       PIXMAN_x8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
6271b18d63aSmrg    { "src_x888_8_8888",       PIXMAN_x8r8g8b8,    0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
6281b18d63aSmrg    { "src_0565_8_0565",       PIXMAN_r5g6b5,      0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6291b18d63aSmrg    { "src_1555_8_0565",       PIXMAN_a1r5g5b5,    0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6301b18d63aSmrg    { "src_0565_8_1555",       PIXMAN_r5g6b5,      0, PIXMAN_OP_SRC,     PIXMAN_a8,       0, PIXMAN_a1r5g5b5 },
6311b18d63aSmrg    { "over_n_x888",           PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
6321b18d63aSmrg    { "over_n_8888",           PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_a8r8g8b8 },
6331b18d63aSmrg    { "over_n_0565",           PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_r5g6b5 },
6341b18d63aSmrg    { "over_n_1555",           PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_a1r5g5b5 },
6351b18d63aSmrg    { "over_8888_0565",        PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_r5g6b5 },
6361b18d63aSmrg    { "over_8888_x888",        PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_null,     0, PIXMAN_x8r8g8b8 },
6376ba797d6Smrg    { "over_x888_8_0565",      PIXMAN_x8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6381b18d63aSmrg    { "over_n_8_0565",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6391b18d63aSmrg    { "over_n_8_1555",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_a1r5g5b5 },
6401b18d63aSmrg    { "over_n_8_4444",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_a4r4g4b4 },
6411b18d63aSmrg    { "over_n_8_2222",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_a2r2g2b2 },
6421b18d63aSmrg    { "over_n_8_x888",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
6431b18d63aSmrg    { "over_n_8_8888",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
6441b18d63aSmrg    { "over_n_8_2x10",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_x2r10g10b10 },
6451b18d63aSmrg    { "over_n_8_2a10",         PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8,       0, PIXMAN_a2r10g10b10 },
6461b18d63aSmrg    { "over_n_8888_8888_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_a8r8g8b8 },
6471b18d63aSmrg    { "over_n_8888_x888_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_x8r8g8b8 },
6481b18d63aSmrg    { "over_n_8888_0565_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_r5g6b5 },
6491b18d63aSmrg    { "over_n_8888_1555_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_a1r5g5b5 },
6501b18d63aSmrg    { "over_n_8888_4444_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_a4r4g4b4 },
6511b18d63aSmrg    { "over_n_8888_2222_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_a2r2g2b2 },
6521b18d63aSmrg    { "over_n_8888_2x10_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_x2r10g10b10 },
6531b18d63aSmrg    { "over_n_8888_2a10_ca",   PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OVER,    PIXMAN_a8r8g8b8, 2, PIXMAN_a2r10g10b10 },
6541b18d63aSmrg    { "over_8888_n_8888",      PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_a8,       1, PIXMAN_a8r8g8b8 },
6551b18d63aSmrg    { "over_8888_n_x888",      PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_a8,       1, PIXMAN_x8r8g8b8 },
6561b18d63aSmrg    { "over_8888_n_0565",      PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_a8,       1, PIXMAN_r5g6b5 },
6571b18d63aSmrg    { "over_8888_n_1555",      PIXMAN_a8r8g8b8,    0, PIXMAN_OP_OVER,    PIXMAN_a8,       1, PIXMAN_a1r5g5b5 },
6581b18d63aSmrg    { "outrev_n_8_0565",       PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8,       0, PIXMAN_r5g6b5 },
6591b18d63aSmrg    { "outrev_n_8_1555",       PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8,       0, PIXMAN_a1r5g5b5 },
6601b18d63aSmrg    { "outrev_n_8_x888",       PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8,       0, PIXMAN_x8r8g8b8 },
6611b18d63aSmrg    { "outrev_n_8_8888",       PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8,       0, PIXMAN_a8r8g8b8 },
6621b18d63aSmrg    { "outrev_n_8888_0565_ca", PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8r8g8b8, 2, PIXMAN_r5g6b5 },
6631b18d63aSmrg    { "outrev_n_8888_1555_ca", PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8r8g8b8, 2, PIXMAN_a1r5g5b5 },
6641b18d63aSmrg    { "outrev_n_8888_x888_ca", PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8r8g8b8, 2, PIXMAN_x8r8g8b8 },
6651b18d63aSmrg    { "outrev_n_8888_8888_ca", PIXMAN_a8r8g8b8,    1, PIXMAN_OP_OUT_REV, PIXMAN_a8r8g8b8, 2, PIXMAN_a8r8g8b8 },
6661b18d63aSmrg};
6671b18d63aSmrg
6681b18d63aSmrgint
6691b18d63aSmrgmain (int argc, char *argv[])
6701b18d63aSmrg{
6711b18d63aSmrg    double x;
6721b18d63aSmrg    int i;
6731b18d63aSmrg    char *pattern = argc > 1 ? argv[1] : "all";
6741b18d63aSmrg
6751b18d63aSmrg    src = aligned_malloc (4096, BUFSIZE * 3);
6761b18d63aSmrg    memset (src, 0xCC, BUFSIZE * 3);
6771b18d63aSmrg    dst = src + (BUFSIZE / 4);
6781b18d63aSmrg    mask = dst + (BUFSIZE / 4);
6791b18d63aSmrg
6801b18d63aSmrg    printf ("Benchmark for a set of most commonly used functions\n");
6811b18d63aSmrg    printf ("---\n");
6821b18d63aSmrg    printf ("All results are presented in millions of pixels per second\n");
6831b18d63aSmrg    printf ("L1  - small Xx1 rectangle (fitting L1 cache), always blitted at the same\n");
6841b18d63aSmrg    printf ("      memory location with small drift in horizontal direction\n");
6851b18d63aSmrg    printf ("L2  - small XxY rectangle (fitting L2 cache), always blitted at the same\n");
6861b18d63aSmrg    printf ("      memory location with small drift in horizontal direction\n");
6871b18d63aSmrg    printf ("M   - large %dx%d rectangle, always blitted at the same\n",
6881b18d63aSmrg            WIDTH - 64, HEIGHT);
6891b18d63aSmrg    printf ("      memory location with small drift in horizontal direction\n");
6901b18d63aSmrg    printf ("HT  - random rectangles with %dx%d average size are copied from\n",
6911b18d63aSmrg            TILEWIDTH, TILEWIDTH);
6921b18d63aSmrg    printf ("      one %dx%d buffer to another, traversing from left to right\n",
6931b18d63aSmrg            WIDTH, HEIGHT);
6941b18d63aSmrg    printf ("      and from top to bottom\n");
6951b18d63aSmrg    printf ("VT  - random rectangles with %dx%d average size are copied from\n",
6961b18d63aSmrg            TILEWIDTH, TILEWIDTH);
6971b18d63aSmrg    printf ("      one %dx%d buffer to another, traversing from top to bottom\n",
6981b18d63aSmrg            WIDTH, HEIGHT);
6991b18d63aSmrg    printf ("      and from left to right\n");
7001b18d63aSmrg    printf ("R   - random rectangles with %dx%d average size are copied from\n",
7011b18d63aSmrg            TILEWIDTH, TILEWIDTH);
7021b18d63aSmrg    printf ("      random locations of one %dx%d buffer to another\n",
7031b18d63aSmrg            WIDTH, HEIGHT);
7041b18d63aSmrg    printf ("RT  - as R, but %dx%d average sized rectangles are copied\n",
7051b18d63aSmrg            TINYWIDTH, TINYWIDTH);
7061b18d63aSmrg    printf ("---\n");
7071b18d63aSmrg    bandwidth = x = bench_memcpy ();
7081b18d63aSmrg    printf ("reference memcpy speed = %.1fMB/s (%.1fMP/s for 32bpp fills)\n",
7091b18d63aSmrg            x / 1000000., x / 4000000);
7101b18d63aSmrg    printf ("---\n");
7111b18d63aSmrg
7121b18d63aSmrg    for (i = 0; i < sizeof(tests_tbl) / sizeof(tests_tbl[0]); i++)
7131b18d63aSmrg    {
7141b18d63aSmrg	if (strcmp (pattern, "all") == 0 || strstr (tests_tbl[i].testname, pattern))
7151b18d63aSmrg	{
7161b18d63aSmrg	    bench_composite (tests_tbl[i].testname,
7171b18d63aSmrg			     tests_tbl[i].src_fmt,
7181b18d63aSmrg			     tests_tbl[i].src_flags,
7191b18d63aSmrg			     tests_tbl[i].op,
7201b18d63aSmrg			     tests_tbl[i].mask_fmt,
7211b18d63aSmrg			     tests_tbl[i].mask_flags,
7221b18d63aSmrg			     tests_tbl[i].dst_fmt,
7231b18d63aSmrg			     bandwidth/8);
7241b18d63aSmrg	}
7251b18d63aSmrg    }
7261b18d63aSmrg
7271b18d63aSmrg    free (src);
7281b18d63aSmrg    return 0;
7291b18d63aSmrg}
730