[Piglit] [PATCH 12/13 v2] glsl: Enhance built-in-constants to test extensions too

Pohjolainen, Topi topi.pohjolainen at intel.com
Wed Aug 28 02:26:57 PDT 2013


On Mon, Aug 26, 2013 at 07:15:27PM -0700, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> v2: Use an array of pointers to char for required_extensions (using
> strndup) instead of the previous static buffer cleverness.  Also replace
> the previous cleverness for generating the GLSL extension enables with
> something less clever and easier to understand.  Both suggested by Eric.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  tests/shaders/built-in-constants.c | 78 +++++++++++++++++++++++++++++++++++++-
>  1 file changed, 77 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/shaders/built-in-constants.c b/tests/shaders/built-in-constants.c
> index af87107..54af859 100644
> --- a/tests/shaders/built-in-constants.c
> +++ b/tests/shaders/built-in-constants.c
> @@ -39,6 +39,22 @@ unsigned num_tests = 0;
>  int required_glsl_version = 0;
>  char *required_glsl_version_string = NULL;
>  
> +/**
> + * List of extensions required by the current test set.
> + */
> +char *required_extensions[32];
> +unsigned num_required_extensions = 0;
> +
> +/**
> + * Array of extension enables for the shader code
> + *
> + * For each used entry in \c required_extensions, there is text in
> + * this string of the form "#extension ...: require\n".
> + */
> +#define MAX_EXTENSION_ENABLE_LINE_LEN 80
> +char extension_enables[ARRAY_SIZE(required_extensions)
> +		       * MAX_EXTENSION_ENABLE_LINE_LEN];
> +unsigned extension_enables_len = 0;
>  
>  static const char *const uniform_template =
>  	"uniform float f[%s %s %d ? 1 : -1];\n"
> @@ -131,6 +147,7 @@ parse_file(const char *filename)
>  	/* The format of the test file is:
>  	 *
>  	 * major.minor
> +	 * GL_ARB_some_extension
>  	 * gl_MaxFoo 8
>  	 * gl_MaxBar 16
>  	 * gl_MinAsdf -2
> @@ -152,6 +169,32 @@ parse_file(const char *filename)
>  	if (line[0] != '\0')
>  		line++;
>  
> +	/* Process the list of required extensions.
> +	 */
> +	while (strncmp("GL_", line, 3) == 0) {
> +		char *end_of_line = strchrnul(line, '\n');
> +		const ptrdiff_t len = end_of_line - line;
> +
> +		assert(end_of_line[0] == '\n' || end_of_line[0] == '\0');
> +
> +		if (num_required_extensions >= ARRAY_SIZE(required_extensions)) {
> +			fprintf(stderr, "Too many required extensions!\n");
> +			piglit_report_result(PIGLIT_FAIL);
> +		}
> +
> +		/* Copy the new extension to the list.
> +		 */
> +		required_extensions[num_required_extensions] =
> +			strndup(line, len);

Isn't this version now missing the corresponding 'free()'?

> +		num_required_extensions++;
> +
> +		/* Advance to the next input line.
> +		 */
> +		line = end_of_line;
> +		if (line[0] == '\n')
> +			line++;
> +	}
> +
>  	while (line[0] != '\0') {
>  		char *endptr;
>  
> @@ -254,16 +297,49 @@ piglit_init(int argc, char **argv)
>  	if (glsl_version < required_glsl_version)
>  		piglit_report_result(PIGLIT_SKIP);
>  
> +	/* Process the list of required extensions.  While doing this,
> +	 * generate the GLSL code that will enable those extensions in the
> +	 * shaders.
> +	 */
> +	for (i = 0; i < num_required_extensions; i++) {
> +		int len;
> +
> +		if (!piglit_is_extension_supported(required_extensions[i])) {
> +			printf("%s not supported\n", required_extensions[i]);
> +			piglit_report_result(PIGLIT_SKIP);
> +		}
> +
> +		if ((extension_enables_len + MAX_EXTENSION_ENABLE_LINE_LEN)
> +		    >= sizeof(extension_enables)) {
> +			printf("Extension enables too long.\n");
> +			piglit_report_result(PIGLIT_FAIL);
> +		}
> +
> +		len = snprintf(&extension_enables[extension_enables_len],
> +			       MAX_EXTENSION_ENABLE_LINE_LEN,
> +			       "#extension %s: require\n",
> +			       required_extensions[i]);
> +
> +		if (len <= 0) {
> +			printf("Extension enable snprintf failed.\n");
> +			piglit_report_result(PIGLIT_FAIL);
> +		}
> +
> +		extension_enables_len += len;
> +	}
> +
>  	/* Generate the version declaration that will be used by all of the
>  	 * shaders in the test run.
>  	 */
>  	asprintf(&version_string,
>  		 "#version %d %s\n"
> +		 "%s"
>  		 "#ifdef GL_ES\n"
>  		 "precision mediump float;\n"
>  		 "#endif\n",
>  		 required_glsl_version,
> -		 required_glsl_version == 300 ? "es" : "");
> +		 required_glsl_version == 300 ? "es" : "",
> +		 extension_enables);
>  
>  	/* Create the shaders that will be used for the real part of the test.
>  	 */
> -- 
> 1.8.1.4
> 
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list