[Piglit] [PATCH 11/14] util: Define PIGLIT_GL_TEST_MAIN() and friends

Chad Versace chad.versace at linux.intel.com
Wed Jun 20 10:26:16 PDT 2012


On 06/20/2012 02:32 AM, Kenneth Graunke wrote:
> 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.versace at 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

Good idea. I'll do that before pushing the series today.

> 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).

I generally frown upon public headers that define non-prefixed symbols for commonly used names.
Wayland does that for container_of(), and it has caused all sorts of problems with Waffle. I'm
going to keep the PIGLIT_ prefix, but thanks for the advice.


More information about the Piglit mailing list