On 06/12/2012 04:02 PM, Chad Versace wrote:
> PIGLIT_GL_TEST_MAIN() defines a boilerplate main() that should be suitable
> for most OpenGL test executables.
> 
> This patch redefines piglit-framework.c:main() with PIGLIT_GL_TEST_MAIN().
> In an upcoming patch, each test executable will define its own main()
> likewise.
> 
> This patch also defines the following, which are used by
> PIGLIT_GL_TEST_MAIN():
>     struct piglit_gl_test_info
>     piglit_gl_test_info_init()
>     piglit_gl_test_run()
> 
> Even though piglit_gl_test_run() takes an info struct as input, it does
> not yet use that info struct. A follow-on patch fixes this.
> 
> Signed-off-by: Chad Versace <chad.vers...@linux.intel.com>
> ---
>  tests/util/piglit-framework.c |   19 +++++++-
>  tests/util/piglit-framework.h |   98 
> +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 115 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/util/piglit-framework.c b/tests/util/piglit-framework.c
> index 16b8516..7d9dcce 100644
> --- a/tests/util/piglit-framework.c
> +++ b/tests/util/piglit-framework.c
> @@ -55,6 +55,12 @@ __attribute__((weak)) void piglit_init(int argc, char 
> **argv)
>  }
>  #endif
>  
> +void
> +piglit_gl_test_info_init(struct piglit_gl_test_info *info)
> +{
> +     memset(info, 0, sizeof(*info));
> +}
> +
>  static void
>  delete_arg(char *argv[], int argc, int arg)
>  {
> @@ -118,10 +124,16 @@ process_args(int *argc, char *argv[])
>       }
>  }
>  
> -int main(int argc, char *argv[])
> +void
> +piglit_gl_test_run(int argc, char *argv[],
> +                const struct piglit_gl_test_info *info)
>  {
>       process_args(&argc, argv);
>  
> +     piglit_width = info->window_width;
> +     piglit_height = info->window_height;
> +     piglit_window_mode = info->window_visual;
> +
>       if (piglit_use_fbo) {
>               if (!piglit_framework_fbo_init())
>                       piglit_use_fbo = false;
> @@ -139,5 +151,8 @@ int main(int argc, char *argv[])
>       }
>  
>       assert(false);
> -     return 0;
>  }
> +
> +PIGLIT_GL_TEST_MAIN(piglit_width,
> +                    piglit_height,
> +                    piglit_window_mode)
> diff --git a/tests/util/piglit-framework.h b/tests/util/piglit-framework.h
> index fcf38cf..04894bb 100644
> --- a/tests/util/piglit-framework.h
> +++ b/tests/util/piglit-framework.h
> @@ -23,8 +23,106 @@
>  
>  #pragma once
>  
> +#include <assert.h>
>  #include <stdbool.h>
>  
> +/**
> + * @brief Info needed to run an OpenGL test.
> + *
> + * To run a test, pass this to piglit_gl_test_run().
> + *
> + * This is named piglit_gl_test_info, rather than piglit_test_info, in
> + * order to distinguish it from other test types, such as EGL and GLX tests.
> + *
> + * TODO: Add fields here that declare test requirements on GL context
> + * TODO: flavor, extensions, and window system.
> + */
> +struct piglit_gl_test_info {
> +     int window_width;
> +     int window_height;
> +
> +     /** A bitmask such as `GLUT_RGBA | GLUT_DOUBLE`. */
> +     int window_visual;
> +
> +     /**
> +      * This is called once per test, after the GL context has been created
> +      * and made current but before display() is called.
> +      */
> +     void
> +     (*init)(int argc, char *argv[]);
> +
> +     /**
> +      * If the test is run in auto mode, then this is called once after
> +      * init(). Otherwise, it is called repeatedly from some ill-defined
> +      * event loop.
> +      */
> +     enum piglit_result
> +     (*display)(void);
> +};
> +
> +/**
> + * Initialize @a info with default values.
> + */
> +void
> +piglit_gl_test_info_init(struct piglit_gl_test_info *info);
> +
> +/**
> + * Run the OpenGL test described by @a info. Does not return.
> + */
> +void
> +piglit_gl_test_run(int argc, char *argv[],
> +                const struct piglit_gl_test_info *info);
> +
> +#ifdef __cplusplus
> +#  define _PIGLIT_GL_TEST_EXTERN_C_BEGIN extern "C" {
> +#else
> +#  define _PIGLIT_GL_TEST_EXTERN_C_BEGIN
> +#endif
> +
> +#ifdef __cplusplus
> +#  define _PIGLIT_GL_TEST_EXTERN_C_END }
> +#else
> +#  define _PIGLIT_GL_TEST_EXTERN_C_END
> +#endif

I would coalesce these into one block, to be a bit more concise:

#ifdef __cplusplus
#  define _PIGLIT_GL_TEST_EXTERN_C_BEGIN extern "C" {
#  define _PIGLIT_GL_TEST_EXTERN_C_END }
#else
#  define _PIGLIT_GL_TEST_EXTERN_C_BEGIN
#  define _PIGLIT_GL_TEST_EXTERN_C_END
#endif

You probably could also just call them EXTERN_C_BEGIN and EXTERN_C_END.
 It looks like a few other projects use that convention, though not any
we'd #include headers from (which could cause conflicts).

> +/**
> + * Define a boilerplate main() that should be suitable for most OpenGL test
> + * executables.
> + */
> +#define PIGLIT_GL_TEST_MAIN(_window_width,                                   
> \
> +                            _window_height,                                  
> \
> +                            _window_visual)                                  
> \
> +                                                                             
> \
> +        _PIGLIT_GL_TEST_EXTERN_C_BEGIN                                       
> \
> +                                                                             
> \
> +        void                                                                 
> \
> +        piglit_init(int argc, char *argv[]);                                 
> \
> +                                                                             
> \
> +        enum piglit_result                                                   
> \
> +        piglit_display(void);                                                
> \
> +                                                                             
> \
> +        _PIGLIT_GL_TEST_EXTERN_C_END                                         
> \
> +                                                                             
> \
> +        int                                                                  
> \
> +        main(int argc, char *argv[])                                         
> \
> +        {                                                                    
> \
> +                struct piglit_gl_test_info info;                             
> \
> +                                                                             
> \
> +                piglit_gl_test_info_init(&info);                             
> \
> +                                                                             
> \
> +                info.window_width = _window_width;                           
> \
> +                info.window_height = _window_height;                         
> \
> +                info.window_visual = _window_visual;                         
> \
> +                                                                             
> \
> +                info.init = piglit_init;                                     
> \
> +                info.display = piglit_display;                               
> \
> +                                                                             
> \
> +                piglit_gl_test_run(argc, argv, &info);                       
> \
> +                                                                             
> \
> +                assert(false);                                               
> \
> +                return 0;                                                    
> \
> +        }
> +
>  extern int piglit_automatic;
>  
>  extern int piglit_window_mode;
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to