[Piglit] [PATCH] max-texture-size: test non-proxy targets with max size from proxy test

Ian Romanick idr at freedesktop.org
Tue Feb 11 03:49:53 CET 2014


On 02/07/2014 03:34 PM, Brian Paul wrote:
> Save the max texture size found with the proxy targets.  Then use
> that max size when we test the regular/non-proxy targets with
> glTexImage and glTexSubImage().
> 
> The whole point of proxy textures is to be able to probe the maximum
> texture size.  So let's use that size when we try the real textures.
> That's what an application would typically do.
> 
> As it was, most of the GL_TEXTURE_3D tests were returning 'skip'
> results because we couldn't allocate a 2048^3 or 1024^3 texture.
> Now we should get pass/fail/crash when we try creating an N^3
> texture when OpenGL told us that N should work.

Which hardware, if any, have you tried this on?  Any closed source drivers?

> This patch also renames the global target and internalformat arrays
> to be plural.
> ---
>  tests/texturing/max-texture-size.c |   73 +++++++++++++++++++++++++++++++-----
>  1 file changed, 64 insertions(+), 9 deletions(-)
> 
> diff --git a/tests/texturing/max-texture-size.c b/tests/texturing/max-texture-size.c
> index 45e01c9..6a6140f 100644
> --- a/tests/texturing/max-texture-size.c
> +++ b/tests/texturing/max-texture-size.c
> @@ -52,7 +52,7 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
>  
>  PIGLIT_GL_TEST_CONFIG_END
>  
> -static const GLenum target[] = {
> +static const GLenum targets[] = {
>  	GL_TEXTURE_1D,
>  	GL_TEXTURE_2D,
>  	GL_TEXTURE_RECTANGLE,
> @@ -60,7 +60,7 @@ static const GLenum target[] = {
>  	GL_TEXTURE_3D,
>  };
>  
> -static const GLenum internalformat[] = {
> +static const GLenum internalformats[] = {
>  	GL_RGBA8,
>  	GL_RGBA16,
>  	GL_RGBA32F,
> @@ -157,6 +157,59 @@ initTexData(GLenum target, uint64_t sideLength)
>  	return ((GLfloat *) calloc(nPixels * COLOR_COMPONENTS, sizeof(float)));
>  }
>  
> +/** Convert the given format to an index */
> +static int
> +format_to_index(GLenum format)
> +{
> +	int i;
> +	for (i = 0; i < ARRAY_SIZE(internalformats); i++) {
> +		if (format == internalformats[i])
> +			return i;
> +	}
> +	assert(!"Unexpected format");
> +	return 0;
> +}
> +
> +/** Convert the given target to an index */
> +static int
> +target_to_index(GLenum target)
> +{
> +	int i;
> +	for (i = 0; i < ARRAY_SIZE(targets); i++) {
> +		if (target == targets[i])
> +			return i;
> +	}
> +	assert(!"Unexpected target");
> +	return 0;
> +}
> +
> +/** to save max texture size info */
> +static int max_texture_size[ARRAY_SIZE(targets)][ARRAY_SIZE(internalformats)];
> +
> +/**
> + * Save the max side value for the given target/format.
> + * This is done when testing the proxy targets.
> + */
> +static void
> +save_max_side(GLenum target, GLenum format, int maxSide)
> +{
> +	int tex = target_to_index(target), fmt = format_to_index(format);
> +	max_texture_size[tex][fmt] = maxSide;
> +}
> +
> +/**
> + * Get the max side value for the given target/format.
> + * This is done when testing the non-proxy targets.
> + */
> +static int
> +get_max_side(GLenum target, GLenum format)
> +{
> +	int tex = target_to_index(target), fmt = format_to_index(format);
> +	int maxSide = max_texture_size[tex][fmt];
> +	assert(maxSide);
> +	return maxSide;
> +}
> +
>  static void
>  test_proxy_texture_size(GLenum target, GLenum internalformat)
>  {
> @@ -221,6 +274,8 @@ test_proxy_texture_size(GLenum target, GLenum internalformat)
>  		result = PIGLIT_PASS;
>  	}
>  
> +	save_max_side(target, internalformat, maxSide);
> +
>  	piglit_report_subtest_result(result, "%s-%s",
>  				     piglit_get_gl_enum_name(getProxyTarget(target)),
>  				     piglit_get_gl_enum_name(internalformat));
> @@ -257,8 +312,8 @@ test_non_proxy_texture_size(GLenum target, GLenum internalformat)
>  	glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
>  	glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
>  
> -	/* Query the largest supported texture size */
> -	glGetIntegerv(getMaxTarget(target), &maxSide);
> +	/* Use the max texture size which was found when testing the proxy targets */
> +	maxSide = get_max_side(target, internalformat);
>  
>  	printf("%s, Internal Format = %s, Largest Texture Size = %d\n",
>  	       piglit_get_gl_enum_name(target),
> @@ -347,16 +402,16 @@ static void
>  for_targets_and_formats(void(*test)(GLenum, GLenum))
>  {
>  	int i, j;
> -	for (i = 0; i < ARRAY_SIZE(target); i++) {
> -		for (j = 0; j < ARRAY_SIZE(internalformat); j++) {
> +	for (i = 0; i < ARRAY_SIZE(targets); i++) {
> +		for (j = 0; j < ARRAY_SIZE(internalformats); j++) {
>  			/* Skip floating point formats if
>  			 * GL_ARB_texture_float is not supported
>  			 */
> -			if ((internalformat[j] == GL_RGBA16F ||
> -			    internalformat[j] == GL_RGBA32F) &&
> +			if ((internalformats[j] == GL_RGBA16F ||
> +			    internalformats[j] == GL_RGBA32F) &&
>  			    !piglit_is_extension_supported("GL_ARB_texture_float"))
>  				continue;
> -			 test(target[i], internalformat[j]);
> +			 test(targets[i], internalformats[j]);
>  		}
>  	}
>  }
> 



More information about the Piglit mailing list