On 15 October 2013 17:32, Ian Romanick <i...@freedesktop.org> wrote: > From: Ian Romanick <ian.d.roman...@intel.com> > > There are two parts to this. > > First, command line options of the form "-subtest foo" have their > argument (the "foo" part) stored in a list in the > piglit_gl_test_config. Tests can use this functionality without having > to use any of the other parts. This allows every piglit test to have > the same syntax for specifying which subtests to run. > > Second, tests can create a list of piglit_gl_subtest structures. Each > structure describes a single subtest: the name (as it will apear in the > log), the command-line name (as supplied to -subtest), and the function > that implements the test. Helper function use this table and the list > of tests specified by -subtest options to run a group of tests. > > A later patch shows an example of using this functionality. > > v2: Use piglit_merge_result instead of > piglit_update_result_from_subtest_result. Suggested by Eric, seconded > by Chad. > > v3: Rename piglit_gl_subtest::subtest to > piglit_gl_subtest::subtest_func. Fix some Doxygen comments. Both > suggested by Chad. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > Cc: Chad Versace <chad.vers...@linux.intel.com> > --- > tests/util/piglit-framework-gl.c | 94 > ++++++++++++++++++++++++++++++++++++++-- > tests/util/piglit-framework-gl.h | 32 ++++++++++++++ > 2 files changed, 123 insertions(+), 3 deletions(-) > > diff --git a/tests/util/piglit-framework-gl.c > b/tests/util/piglit-framework-gl.c > index dd2e6a5..635b52c 100644 > --- a/tests/util/piglit-framework-gl.c > +++ b/tests/util/piglit-framework-gl.c > @@ -40,7 +40,8 @@ int piglit_width; > int piglit_height; > > static void > -process_args(int *argc, char *argv[], unsigned *force_samples); > +process_args(int *argc, char *argv[], unsigned *force_samples, > + struct piglit_gl_test_config *config); > > void > piglit_gl_test_config_init(struct piglit_gl_test_config *config) > @@ -63,7 +64,8 @@ delete_arg(char *argv[], int argc, int arg) > * length is returned in @a argc. > */ > static void > -process_args(int *argc, char *argv[], unsigned *force_samples) > +process_args(int *argc, char *argv[], unsigned *force_samples, > + struct piglit_gl_test_config *config) > { > int j; > > @@ -111,6 +113,33 @@ process_args(int *argc, char *argv[], unsigned > *force_samples) > *force_samples = atoi(argv[j]+9); > delete_arg(argv, *argc, j--); > *argc -= 1; > + } else if (!strcmp(argv[j], "-subtest")) { > + int i; > + > + j++; > + if (j >= *argc) { > + fprintf(stderr, > + "-subtest requires an argument\n"); > + piglit_report_result(PIGLIT_FAIL); > + } > + > + config->selected_subtests = > + realloc(config->selected_subtests, > + sizeof(char *) > + * (config->num_selected_subtests + > 1)); > + > config->selected_subtests[config->num_selected_subtests] = > + argv[j]; > + > + config->num_selected_subtests++; > + > + /* Remove 2 arguments (hence the 'i - 2') from the > + * command line. > + */ > + for (i = j + 1; i < *argc; i++) { > + argv[i - 2] = argv[i]; > + } > + *argc -= 2; > + j -= 2; > } > } > } > @@ -121,7 +150,7 @@ piglit_gl_process_args(int *argc, char *argv[], > { > unsigned force_samples = 0; > > - process_args(argc, argv, &force_samples); > + process_args(argc, argv, &force_samples, config); > > if (force_samples > 1) > config->window_samples = force_samples; > @@ -223,3 +252,62 @@ piglit_destroy_dma_buf(struct piglit_dma_buf *buf) > if (gl_fw->destroy_dma_buf) > gl_fw->destroy_dma_buf(buf); > } > + > +const struct piglit_gl_subtest * > +piglit_find_subtest(const struct piglit_gl_subtest *subtests, const char > *name) > +{ > + unsigned i; > + > + for (i = 0; subtests[i].subtest_func != NULL; i++) { > + if (strcmp(subtests[i].option, name) == 0) > + return &subtests[i]; > + } > + > + return NULL; > +} > + > +enum piglit_result > +piglit_run_selected_subtests(const struct piglit_gl_subtest *all_subtests, > + const char **selected_subtests, > + size_t num_selected_subtests, > + enum piglit_result previous_result) > +{ > + enum piglit_result result = previous_result; > + > + if (num_selected_subtests) { > + unsigned i; > + > + for (i = 0; i < num_selected_subtests; i++) { > + enum piglit_result subtest_result; > + const char *const name = selected_subtests[i]; > + const struct piglit_gl_subtest *subtest = > + piglit_find_subtest(all_subtests, name); > + > + if (subtest == NULL) { > + fprintf(stderr, > + "Unknown subtest \"%s\".\n", > + name); > + piglit_report_result(PIGLIT_FAIL); > + } > + > + subtest_result = subtest->subtest_func(); > + piglit_report_subtest_result(subtest_result, > + subtest->name); > + > + piglit_merge_result(&result, subtest_result); > + } > + } else { > + unsigned i; > + > + for (i = 0; all_subtests[i].subtest_func != NULL; i++) { > + const enum piglit_result subtest_result = > + all_subtests[i].subtest_func(); > + piglit_report_subtest_result(subtest_result, > + all_subtests[i].name); > + > + piglit_merge_result(&result, subtest_result); > + } > + } > + > + return result; > +} > diff --git a/tests/util/piglit-framework-gl.h > b/tests/util/piglit-framework-gl.h > index fcc1594..0aca75c 100644 > --- a/tests/util/piglit-framework-gl.h > +++ b/tests/util/piglit-framework-gl.h > @@ -43,6 +43,20 @@ enum piglit_gl_visual { > }; > > /** > + * An idividual subtest that makes up part of a test group. > + */ > +struct piglit_gl_subtest { > + /** Name of the subtest as it will appear in the log. */ > + const char *name; > + > + /** Command line name used to select this test. */ > + const char *option; > + > + /** Function that implements the test. */ > + enum piglit_result (*subtest_func)(void); >
Would you have any objection to adding a void * to this structure, which would then get passed to subtest_func? That would give the test implementor extra flexibility if they want to share a single subtest_func between multiple similar subtests. It would also allow for the possibility that the set of available subtests is determined at run time rather than compile time. > +}; > + > +/** > * @brief Configuration for running an OpenGL test. > * > * To run a test, pass this to piglit_gl_test_run(). > @@ -168,6 +182,15 @@ struct piglit_gl_test_config { > */ > enum piglit_result > (*display)(void); > + > + /** > + * Names of subtests supplied on the command line. > + * > + * The paramaters passed to each -subtest command line option is > + * stored here in the order of appearance on the command line. > + */ > + const char **selected_subtests; > + size_t num_selected_subtests; > }; > > /** > @@ -287,4 +310,13 @@ piglit_create_dma_buf(unsigned w, unsigned h, > unsigned cpp, > void > piglit_destroy_dma_buf(struct piglit_dma_buf *buf); > > +const struct piglit_gl_subtest * > +piglit_find_subtest(const struct piglit_gl_subtest *subtests, const char > *name); > + > +enum piglit_result > +piglit_run_selected_subtests(const struct piglit_gl_subtest *all_subtests, > + const char **selected_subtests, > + size_t num_selected_subtests, > + enum piglit_result previous_result); > + > #endif /* PIGLIT_FRAMEWORK_H */ > -- > 1.8.1.4 > > _______________________________________________ > Piglit mailing list > Piglit@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/piglit >
_______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit