[PATCH rendercheck 3/5] Use ELF sections to make test setup easier.

Jeremy Huddleston Sequoia jeremyhu at apple.com
Sun Apr 3 08:20:41 UTC 2016


The use of __attribute(section()), __start_test_section, and __stop_test_section is not portable.  Could you please follow this up with a change that allows rendercheck to continue to function on non-ELF platforms as well? Preferably by just having alternate implementations of the DECLARE_RENDERCHECK_ARG_TEST and for_each_test macros.

Thanks,
Jeremy

> On Feb 1, 2016, at 13:48, Eric Anholt <eric at anholt.net> wrote:
> 
> Managing the group logic was really error-prone (forget to edit
> success_mask when copy and pasting?  Forget to printf a description of
> the group?).  Most new tests being written can be described as a single
> call that does a couple subtests.
> 
> This doesn't convert all of the tests.  Some of the remaining ones use
> "win" for presenting results (which we may want to just put in a
> global?), and the rest use the pre-created pictures, which would need
> some much bigger refactoring if we want to move their test logic into
> their test files.
> 
> Signed-off-by: Eric Anholt <eric at anholt.net>
> ---
> main.c               | 47 ++++++++++++++++++++++++++++++++++-------------
> rendercheck.h        | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
> t_gtk_argb_xbgr.c    | 17 ++++++++++++-----
> t_libreoffice_xrgb.c | 18 ++++++++++++++++--
> tests.c              | 37 ++++++++++++++-----------------------
> 5 files changed, 120 insertions(+), 50 deletions(-)
> 
> diff --git a/main.c b/main.c
> index b5d67cc..4cec99b 100644
> --- a/main.c
> +++ b/main.c
> @@ -121,27 +121,38 @@ struct {
>     {TEST_REPEAT, "repeat"},
>     {TEST_TRIANGLES, "triangles"},
>     {TEST_BUG7366, "bug7366"},
> -    {TEST_GTK_ARGB_XBGR, "gtk_argb_xbgr"},
> -    {TEST_LIBREOFFICE_XRGB, "libreoffice_xrgb"},
>     {0, NULL}
> };
> 
> +static void
> +print_test_separator(int i)
> +{
> +        if (i % 5 == 0) {
> +            if(i != 0)
> +                putc('\n', stderr);
> +            putc('\t', stderr);
> +        } else {
> +            fprintf(stderr, ", ");
> +        }
> +}
> +
> void print_tests(FILE *file, int tests) {
>     int i, j;
> 
>     for (i=0, j=0; available_tests[i].name; i++) {
>         if (!(available_tests[i].flag & tests))
>             continue;
> -        if (j % 5 == 0) {
> -            if(j != 0)
> -                putc('\n', stderr);
> -            putc('\t', stderr);
> -        } else {
> -            fprintf(stderr, ", ");
> -        }
> +	print_test_separator(j++);
>         fprintf(stderr, "%s", available_tests[i].name);
>         j++;
>     }
> +    for_each_test(test) {
> +	if (!(test->bit & tests))
> +	    continue;
> +	print_test_separator(j++);
> +        fprintf(stderr, "%s", test->arg_name);
> +        j++;
> +    }
>     if (j)
>         fprintf(file, "\n");
> }
> @@ -169,7 +180,7 @@ int main(int argc, char **argv)
> 	XSetWindowAttributes as;
> 	picture_info window;
> 	char *display = NULL;
> -	char *test, *format, *opname, *nextname;
> +	char *test_name, *format, *opname, *nextname;
> 
> 	static struct option longopts[] = {
> 		{ "display",	required_argument,	NULL,	'd' },
> @@ -239,15 +250,25 @@ int main(int argc, char **argv)
> 			/* disable all tests */
> 			enabled_tests = 0;
> 
> -			while ((test = strsep(&nextname, ",")) != NULL) {
> +			while ((test_name = strsep(&nextname, ",")) != NULL) {
> 				int i;
> +				bool found = false;
> 				for(i=0; available_tests[i].name; i++) {
> -					if(strcmp(test, available_tests[i].name) == 0) {
> +					if(strcmp(test_name, available_tests[i].name) == 0) {
> 						enabled_tests |= available_tests[i].flag;
> +						found = true;
> +						break;
> +					}
> +				}
> +				for_each_test(test) {
> +					if (strcmp(test_name,
> +						   test->arg_name) == 0) {
> +						enabled_tests |= test->bit;
> +						found = true;
> 						break;
> 					}
> 				}
> -				if(available_tests[i].name == NULL)
> +				if (!found)
> 					usage(argv[0]);
> 			}
> 
> diff --git a/rendercheck.h b/rendercheck.h
> index 2195cb4..f0fa7b7 100644
> --- a/rendercheck.h
> +++ b/rendercheck.h
> @@ -64,6 +64,19 @@ struct op_info {
> 	bool disabled;
> };
> 
> +struct rendercheck_test_result {
> +	int tests;
> +	int passed;
> +};
> +
> +static inline void
> +record_result(struct rendercheck_test_result *result, bool success)
> +{
> +	result->tests++;
> +	if (success)
> +		result->passed++;
> +}
> +
> #define TEST_FILL		0x0001
> #define TEST_DSTCOORDS		0x0002
> #define TEST_SRCCOORDS		0x0004
> @@ -77,8 +90,27 @@ struct op_info {
> #define TEST_REPEAT	  	0x0400
> #define TEST_TRIANGLES  	0x0800
> #define TEST_BUG7366		0x1000
> -#define TEST_GTK_ARGB_XBGR	0x2000
> -#define TEST_LIBREOFFICE_XRGB	0x4000
> +#define TEST_gtk_argb_xbgr	0x2000
> +#define TEST_libreoffice_xrgb	0x4000
> +
> +struct rendercheck_test {
> +	int bit;
> +	const char *arg_name;
> +	const char *long_name;
> +	struct rendercheck_test_result (*func)(Display *dpy);
> +};
> +
> +#define DECLARE_RENDERCHECK_TEST(name)		  \
> +	const struct rendercheck_test test_desc_##name \
> +	__attribute__ ((section ("test_section")))
> +
> +#define DECLARE_RENDERCHECK_ARG_TEST(arg_name_, long_name_, func_)		\
> +	DECLARE_RENDERCHECK_TEST(arg_name_) = {				\
> +		.bit = TEST_##arg_name_,				\
> +		.arg_name = #arg_name_,					\
> +		.long_name = long_name_,				\
> +		.func = func_,						\
> +	}
> 
> struct render_format {
> 	XRenderPictFormat *format;
> @@ -88,6 +120,12 @@ struct render_format {
> extern struct render_format *formats;
> extern int nformats;
> 
> +/* Storage that will point at the start and end of the ELF section for test
> + * structs.  These are automatically set up by the linker when placing things
> + * in their sections.
> + */
> +extern struct rendercheck_test __start_test_section, __stop_test_section;
> +
> extern int pixmap_move_iter;
> extern int win_width, win_height;
> extern struct op_info ops[];
> @@ -226,8 +264,7 @@ trifan_test(Display *dpy, picture_info *win, picture_info *dst, int op,
> bool
> bug7366_test(Display *dpy);
> 
> -bool
> -gtk_argb_xbgr_test(Display *dpy);
> -
> -bool
> -libreoffice_xrgb_test(Display *dpy, bool invert);
> +#define for_each_test(test)						\
> +	for (struct rendercheck_test *test = &__start_test_section;	\
> +	     test < &__stop_test_section;				\
> +	     test++)
> diff --git a/t_gtk_argb_xbgr.c b/t_gtk_argb_xbgr.c
> index 2b004d5..f19dfea 100644
> --- a/t_gtk_argb_xbgr.c
> +++ b/t_gtk_argb_xbgr.c
> @@ -31,8 +31,8 @@
> #define PIXEL_ABGR	0xff886644
> #define PIXEL_RGB	0x446688
> 
> -bool
> -gtk_argb_xbgr_test(Display *dpy)
> +static struct rendercheck_test_result
> +test_gtk_argb_xbgr(Display *dpy)
> {
> 	int x, y;
> 	Pixmap	pix_32;
> @@ -46,6 +46,7 @@ gtk_argb_xbgr_test(Display *dpy)
> 	XRenderPictFormat	*pic_rgb_format;
> 	GC	gc_32;
> 	XImage	*image_24, *image_32;
> +	struct rendercheck_test_result result = {};
> 
> 	templ.type = PictTypeDirect;
> 	templ.depth = 32;
> @@ -95,7 +96,8 @@ gtk_argb_xbgr_test(Display *dpy)
> 
> 	if (!pic_argb_format || !pic_xbgr_format || !pic_rgb_format) {
> 		printf("Couldn't find xBGR and ARGB formats\n");
> -		return false;
> +		record_result(&result, false);
> +		return result;
> 	}
> 
> 	pix_32 = XCreatePixmap(dpy, RootWindow(dpy, DefaultScreen(dpy)),
> @@ -141,10 +143,15 @@ gtk_argb_xbgr_test(Display *dpy)
> 				printf("fail: pixel value is %08lx "
> 				    "should be %08x\n",
> 				    pixel, PIXEL_RGB);
> -				return false;
> +				record_result(&result, false);
> +				return result;
> 			}
> 		}
> 	}
> 
> -	return true;
> +	record_result(&result, true);
> +	return result;
> }
> +
> +DECLARE_RENDERCHECK_ARG_TEST(gtk_argb_xbgr, "GTK xRGB/ABGR same picture",
> +			     test_gtk_argb_xbgr);
> diff --git a/t_libreoffice_xrgb.c b/t_libreoffice_xrgb.c
> index 9efca58..1398a01 100644
> --- a/t_libreoffice_xrgb.c
> +++ b/t_libreoffice_xrgb.c
> @@ -39,8 +39,8 @@
> #define PIXEL_ARGB		0xff886644
> #define INVERT_PIXEL_ARGB	0xff7799bb
> 
> -bool
> -libreoffice_xrgb_test(Display *dpy, bool invert)
> +static bool
> +libreoffice_xrgb_test_one(Display *dpy, bool invert)
> {
> 	int x, y;
> 	Pixmap	src_pix, dst_pix;
> @@ -163,3 +163,17 @@ libreoffice_xrgb_test(Display *dpy, bool invert)
> 
> 	return true;
> }
> +
> +static struct rendercheck_test_result
> +test_libreoffice_xrgb(Display *dpy)
> +{
> +	struct rendercheck_test_result result = { };
> +
> +	record_result(&result, libreoffice_xrgb_test_one(dpy, false));
> +	record_result(&result, libreoffice_xrgb_test_one(dpy, true));
> +
> +	return result;
> +}
> +
> +DECLARE_RENDERCHECK_ARG_TEST(libreoffice_xrgb, "LibreOffice xRGB",
> +			     test_libreoffice_xrgb);
> diff --git a/tests.c b/tests.c
> index 456e778..730acbf 100644
> --- a/tests.c
> +++ b/tests.c
> @@ -462,6 +462,20 @@ do {								\
> 	    test_dst[num_test_dst++] = &pictures_solid[i];
> 	}
> 
> +	for_each_test(test) {
> +		struct rendercheck_test_result result;
> +
> +		if (!(enabled_tests & test->bit))
> +			continue;
> +
> +		result = test->func(dpy);
> +		tests_total += result.tests;
> +		tests_passed += result.passed;
> +
> +		if (result.tests == result.passed)
> +			success_mask |= test->bit;
> +	}
> +
> 	if (enabled_tests & TEST_FILL) {
> 		bool ok, group_ok = true;
> 
> @@ -733,29 +747,6 @@ do {								\
> 		success_mask |= TEST_BUG7366;
> 	}
> 
> -        if (enabled_tests & TEST_GTK_ARGB_XBGR) {
> -		bool ok, group_ok = true;
> -
> -		ok = gtk_argb_xbgr_test(dpy);
> -		RECORD_RESULTS();
> -
> -		if (group_ok)
> -			success_mask |= TEST_GTK_ARGB_XBGR;
> -	}
> -
> -        if (enabled_tests & TEST_LIBREOFFICE_XRGB) {
> -		bool ok, group_ok = true;
> -
> -		ok = libreoffice_xrgb_test(dpy, false);
> -		RECORD_RESULTS();
> -
> -		ok = libreoffice_xrgb_test(dpy, true);
> -		RECORD_RESULTS();
> -
> -		if (group_ok)
> -			success_mask |= TEST_LIBREOFFICE_XRGB;
> -	}
> -
> 	free(test_ops);
> 	free(test_src);
> 	free(test_mask);
> -- 
> 2.7.0
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4465 bytes
Desc: not available
URL: <https://lists.x.org/archives/xorg-devel/attachments/20160403/37b14cd7/attachment.bin>


More information about the xorg-devel mailing list