[Piglit] [PATCH 3/4] Add a fast clear test for non-MSRT surfaces

Pohjolainen, Topi topi.pohjolainen at intel.com
Tue Dec 1 00:29:58 PST 2015


On Wed, Nov 25, 2015 at 06:11:52PM +0100, Neil Roberts wrote:
> ext_framebuffer_multisample-fast-clear can now take a parameter on the
> command line to make it test a single-sample buffer instead. This is
> worth testing at least on i965 because fast clears are handled
> differently when multisampling is not used.
> ---
>  tests/all.py                                       |  15 +++
>  .../spec/ext_framebuffer_multisample/fast-clear.c  | 138 +++++++++++++--------
>  2 files changed, 102 insertions(+), 51 deletions(-)
> 
> diff --git a/tests/all.py b/tests/all.py
> index fd07adb..ab9f181 100644
> --- a/tests/all.py
> +++ b/tests/all.py
> @@ -135,6 +135,10 @@ def add_fbo_formats_tests(adder, extension, suffix=''):
>                'fbo-alphatest-formats{}'.format(suffix))
>          adder(['fbo-colormask-formats', extension],
>                'fbo-colormask-formats{}'.format(suffix))
> +        adder(['ext_framebuffer_multisample-fast-clear',
> +               extension,
> +               'single-sample'],
> +              'fbo-fast-clear{}'.format(suffix))
>  
>  
>  def add_msaa_formats_tests(adder, extension):
> @@ -2043,6 +2047,11 @@ with profile.group_manager(
>         'GL_EXT_texture_sRGB',
>         'enable-fb-srgb'],
>        'msaa-fast-clear')
> +    g(['ext_framebuffer_multisample-fast-clear',
> +       'GL_EXT_texture_sRGB',
> +       'enable-fb-srgb',
> +       'single-sample'],
> +      'fbo-fast-clear')
>  
>  with profile.group_manager(
>          PiglitGLTest,
> @@ -2937,6 +2946,8 @@ with profile.group_manager(
>      g(['fbo-storage-completeness'])
>      g(['fbo-storage-formats'])
>      g(['getteximage-formats', 'init-by-rendering'])
> +    g(['ext_framebuffer_multisample-fast-clear', 'single-sample'],
> +      'fbo-fast-clear')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX1')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX4')
>      add_fbo_stencil_tests(g, 'GL_STENCIL_INDEX8')
> @@ -3241,6 +3252,10 @@ with profile.group_manager(
>      #   'fbo-blending-formats')
>      g(['fbo-alphatest-formats', 'GL_EXT_texture_sRGB'],
>        'fbo-alphatest-formats')
> +    g(['ext_framebuffer_multisample-fast-clear',
> +       'GL_EXT_texture_sRGB',
> +       'single-sample'],
> +      'fbo-fast-clear')
>      add_msaa_formats_tests(g, 'GL_EXT_texture_sRGB')
>      add_texwrap_format_tests(g, 'GL_EXT_texture_sRGB')
>      add_texwrap_format_tests(g, 'GL_EXT_texture_sRGB-s3tc', '-s3tc')
> diff --git a/tests/spec/ext_framebuffer_multisample/fast-clear.c b/tests/spec/ext_framebuffer_multisample/fast-clear.c
> index 5935b2f..fc745da 100644
> --- a/tests/spec/ext_framebuffer_multisample/fast-clear.c
> +++ b/tests/spec/ext_framebuffer_multisample/fast-clear.c
> @@ -40,6 +40,7 @@
>   *    before clearing the buffer so that it can test that the color
>   *    gets correctly converted to SRGB before being stored in the
>   *    color buffer.
> + *  single-sample: A single sample texture will be created instead.
>   */
>  
>  #include "piglit-util-gl.h"
> @@ -64,9 +65,10 @@ vertex_source[] =
>  
>  static const char
>  fragment_source_float[] =
> -	"#extension GL_ARB_texture_multisample : require\n"
> +	"#version 130\n"
> +	"%s\n"
>  	"\n"
> -	"uniform sampler2DMS tex;\n"
> +	"uniform %s tex;\n"
>  	"\n"
>  	"void\n"
>  	"main()\n"
> @@ -77,9 +79,9 @@ fragment_source_float[] =
>  static const char
>  fragment_source_int[] =
>  	"#version 130\n"
> -	"#extension GL_ARB_texture_multisample : require\n"
> +	"%s\n"
>  	"\n"
> -	"uniform isampler2DMS tex;\n"
> +	"uniform i%s tex;\n"
>  	"\n"
>  	"void\n"
>  	"main()\n"
> @@ -90,9 +92,9 @@ fragment_source_int[] =
>  static const char
>  fragment_source_uint[] =
>  	"#version 130\n"
> -	"#extension GL_ARB_texture_multisample : require\n"
> +	"%s\n"
>  	"\n"
> -	"uniform usampler2DMS tex;\n"
> +	"uniform u%s tex;\n"
>  	"\n"
>  	"void\n"
>  	"main()\n"
> @@ -129,6 +131,7 @@ struct component_sizes {
>  static GLuint prog_float, prog_int, prog_uint;
>  static GLuint result_fbo;
>  static bool enable_fb_srgb = false;
> +static bool single_sample = false;
>  
>  static void
>  convert_srgb_color(const struct format_desc *format,
> @@ -318,6 +321,7 @@ test_format(const struct format_desc *format)
>  	enum piglit_result color_result;
>  	struct component_sizes sizes;
>  	GLenum type_param;
> +	GLenum tex_target;
>  	GLenum tex_error;
>  	GLint type;
>  	GLuint tex;
> @@ -333,47 +337,71 @@ test_format(const struct format_desc *format)
>  
>  	printf("Testing %s\n", format->name);
>  
> -	glGenTextures(1, &tex);
> -	glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
> -
> -	piglit_reset_gl_error();
> -
> -	glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,
> -				1, /* samples */
> -				format->internalformat,
> -				1, 1, /* width/height */
> -				GL_FALSE /* fixed sample locations */);
> -
> -	tex_error = glGetError();
> +	if (single_sample)
> +		tex_target = GL_TEXTURE_2D;
> +	else
> +		tex_target = GL_TEXTURE_2D_MULTISAMPLE;
>  
> -	if (tex_error != GL_NO_ERROR) {
> -		glDeleteTextures(1, &tex);
> -
> -		if (tex_error == GL_INVALID_ENUM) {
> -			/* You're only supposed to pass color renderable
> -			 * formats to glTexImage2DMultisample.
> -			 */
> -			printf("Format is not color renderable\n");
> -			return PIGLIT_SKIP;
> -		} else {
> -			printf("Unexpected GL error: %s 0x%x\n",
> -			       piglit_get_gl_error_name(tex_error),
> -			       tex_error);
> -			return PIGLIT_FAIL;
> +	glGenTextures(1, &tex);
> +	glBindTexture(tex_target, tex);
> +
> +	if (single_sample) {
> +		glTexParameteri(tex_target,
> +				GL_TEXTURE_MAG_FILTER,
> +				GL_NEAREST);
> +		glTexParameteri(tex_target,
> +				GL_TEXTURE_MIN_FILTER,
> +				GL_NEAREST);
> +		glTexParameteri(tex_target,
> +				GL_TEXTURE_MAX_LEVEL,
> +				0);
> +		glTexImage2D(tex_target,
> +			     0, /* level */
> +			     format->internalformat,
> +			     128, 128, /* width/height */

Do we need 128x128 instead of simply 1x1 for the driver to take a different
path?

> +			     0, /* border */
> +			     GL_RGBA, GL_UNSIGNED_BYTE,
> +			     NULL);
> +	} else {
> +		piglit_reset_gl_error();
> +
> +		glTexImage2DMultisample(tex_target,
> +					2, /* samples */
> +					format->internalformat,
> +					128, 128, /* width/height */

Before this was 1x1, it is not clear to me why we need to change this? Or do
we?

> +					GL_FALSE /* fixed sample locations */);
> +		tex_error = glGetError();
> +
> +		if (tex_error != GL_NO_ERROR) {
> +			glDeleteTextures(1, &tex);
> +
> +			if (tex_error == GL_INVALID_ENUM) {
> +				/* You're only supposed to pass color
> +				 * renderable formats to
> +				 * glTexImage2DMultisample.
> +				 */
> +				printf("Format is not color renderable\n");
> +				return PIGLIT_SKIP;
> +			} else {
> +				printf("Unexpected GL error: %s 0x%x\n",
> +				       piglit_get_gl_error_name(tex_error),
> +				       tex_error);
> +				return PIGLIT_FAIL;
> +			}
>  		}
>  	}
>  
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_LUMINANCE_SIZE, &sizes.l);
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_ALPHA_SIZE, &sizes.a);
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_INTENSITY_SIZE, &sizes.i);
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_RED_SIZE, &sizes.r);
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_GREEN_SIZE, &sizes.g);
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0,
> +	glGetTexLevelParameteriv(tex_target, 0,
>  				 GL_TEXTURE_BLUE_SIZE, &sizes.b);
>  
>  	if (sizes.l > 0)
> @@ -388,7 +416,7 @@ test_format(const struct format_desc *format)
>  		assert(0);
>  		type_param = GL_NONE;
>  	}
> -	glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE,
> +	glGetTexLevelParameteriv(tex_target,
>  				 0, /* level */
>  				 type_param,
>  				 &type);
> @@ -424,7 +452,7 @@ test_format(const struct format_desc *format)
>  	glBindFramebuffer(GL_FRAMEBUFFER, fbo);
>  	glFramebufferTexture2D(GL_FRAMEBUFFER,
>  			       GL_COLOR_ATTACHMENT0,
> -			       GL_TEXTURE_2D_MULTISAMPLE,
> +			       tex_target,
>  			       tex,
>  			       0);
>  	if (glCheckFramebufferStatus(GL_FRAMEBUFFER) ==
> @@ -462,8 +490,19 @@ build_program(const char *fragment_source)
>  {
>  	GLint tex_location;
>  	GLuint prog;
> +	char *source;
> +
> +	asprintf(&source,
> +		 fragment_source,
> +		 single_sample ?
> +		 "" :
> +		 "#extension GL_ARB_texture_multisample : require\n",
> +		 single_sample ? "sampler2D" : "sampler2DMS");
> +
> +	prog = piglit_build_simple_program(vertex_source, source);
> +
> +	free(source);
>  
> -	prog = piglit_build_simple_program(vertex_source, fragment_source);
>  	glUseProgram(prog);
>  	tex_location = glGetUniformLocation(prog, "tex");
>  	glUniform1i(tex_location, 0);
> @@ -475,22 +514,24 @@ void
>  piglit_init(int argc, char **argv)
>  {
>  	int test_set_index = 0;
> -	int glsl_major, glsl_minor;
>  	GLuint rb;
> -	bool es;
>  	int i;
>  
>  	for (i = 1; i < argc; i++) {
>  		if (!strcmp(argv[i], "enable-fb-srgb")) {
>  			enable_fb_srgb = true;
>  			piglit_require_extension("GL_ARB_framebuffer_sRGB");
> +		} else if (!strcmp(argv[i], "single-sample")) {
> +			single_sample = true;
>  		} else {
>  			test_set_index = fbo_lookup_test_set(argv[i]);
>  		}
>  	}
>  
> -	piglit_require_extension("GL_ARB_texture_multisample");
> +	if (!single_sample)
> +		piglit_require_extension("GL_ARB_texture_multisample");
>  	piglit_require_extension("GL_ARB_texture_float");
> +	piglit_require_GLSL_version(130);
>  
>  	test_set = test_set + test_set_index;
>  
> @@ -519,11 +560,6 @@ piglit_init(int argc, char **argv)
>  	glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
>  
>  	prog_float = build_program(fragment_source_float);
> -
> -	piglit_get_glsl_version(&es, &glsl_major, &glsl_minor);
> -
> -	if (!es && (glsl_major > 1 || (glsl_major == 1 && glsl_minor >= 3))) {
> -		prog_int = build_program(fragment_source_int);
> -		prog_uint = build_program(fragment_source_uint);
> -	}
> +	prog_int = build_program(fragment_source_int);
> +	prog_uint = build_program(fragment_source_uint);
>  }
> -- 
> 1.9.3
> 
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit


More information about the Piglit mailing list