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 <e...@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 <e...@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@lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to