From 82dc91e8c24a1fbbf03dcf89a3955319b3399ea0 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 5 Feb 2013 21:50:43 +0000 Subject: test: Add a very basic blt benchmark Signed-off-by: Chris Wilson --- test/lowlevel-blt-bench.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 test/lowlevel-blt-bench.c (limited to 'test/lowlevel-blt-bench.c') diff --git a/test/lowlevel-blt-bench.c b/test/lowlevel-blt-bench.c new file mode 100644 index 00000000..0cea0a81 --- /dev/null +++ b/test/lowlevel-blt-bench.c @@ -0,0 +1,135 @@ +/* + * Copyright © 2009 Nokia Corporation + * Copyright © 2010 Movial Creative Technologies Oy + * Copyright © 2013 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include + +#include +#include /* for XDestroyImage */ +#include /* for pixman blt functions */ + +#include "test.h" + +static const struct format { + const char *name; + pixman_format_code_t pixman_format; +} formats[] = { + { "a8r8g8b8", PIXMAN_a8r8g8b8 }, + { "x8r8g8b8", PIXMAN_x8r8g8b8 }, + { "a8", PIXMAN_a8 }, + { "a4", PIXMAN_a4 }, + { "a1", PIXMAN_a1 }, +}; + +static const struct op { + const char *name; +} ops[] = { + [PictOpClear] = { "Clear" }, + [PictOpSrc] = { "Src" }, + [PictOpDst] = { "Dst" }, + [PictOpOver] = { "Over" }, + [PictOpOverReverse] = { "OverReverse" }, + [PictOpIn] = { "In" }, + [PictOpInReverse] = { "InReverse" }, + [PictOpOut] = { "Out" }, + [PictOpOutReverse] = { "OutReverse" }, + [PictOpAtop] = { "Atop" }, + [PictOpAtopReverse] = { "AtopReverse" }, + [PictOpXor] = { "Xor" }, + [PictOpAdd] = { "Add" }, + [PictOpSaturate] = { "Saturate" }, +}; + +static double _bench(struct test_display *t, enum target target_type, + int op, int src_format, + int loops) +{ + XRenderColor render_color = { 0x8000, 0x8000, 0x8000, 0x8000 }; + struct test_target target; + Pixmap pixmap; + Picture picture; + struct timespec tv; + double elapsed; + + test_target_create_render(t, target_type, &target); + XRenderFillRectangle(t->dpy, PictOpClear, target.picture, &render_color, + 0, 0, target.width, target.height); + + pixmap = XCreatePixmap(t->dpy, t->root, + target.width, target.height, + PIXMAN_FORMAT_DEPTH(formats[src_format].pixman_format)); + + picture = XRenderCreatePicture(t->dpy, pixmap, + XRenderFindStandardFormat(t->dpy, src_format), + 0, NULL); + XRenderFillRectangle(t->dpy, PictOpSrc, picture, &render_color, + 0, 0, target.width, target.height); + + test_timer_start(t, &tv); + while (loops--) + XRenderComposite(t->dpy, op, + picture, 0, target.picture, + 0, 0, + 0, 0, + 0, 0, + target.width, target.height); + elapsed = test_timer_stop(t, &tv); + + XRenderFreePicture(t->dpy, picture); + XFreePixmap(t->dpy, pixmap); + test_target_destroy_render(t, &target); + + return elapsed; +} + +static void bench(struct test *t, enum target target, int op, int sf) +{ + double real, ref; + + ref = _bench(&t->ref, target, op, sf, 1000); + real = _bench(&t->real, target, op, sf, 1000); + + fprintf (stdout, "Testing %s with %s: ref=%f, real=%f\n", + formats[sf].name, ops[op].name, ref, real); +} + +int main(int argc, char **argv) +{ + struct test test; + int op, sf; + + test_init(&test, argc, argv); + + for (op = 0; op < sizeof(ops)/sizeof(ops[0]); op++) { + for (sf = 0; sf < sizeof(formats)/sizeof(formats[0]); sf++) + bench(&test, ROOT, op, sf); + fprintf (stdout, "\n"); + } + + return 0; +} -- cgit v1.2.3