[Piglit] [PATCH] textureGather: add new options for testing mirror address modes

Brian Paul brianp at vmware.com
Mon Dec 11 15:03:44 UTC 2017


On 12/09/2017 09:48 PM, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> The existing repeat and clamp modes are easy to implement. The
> mirror_repeat (GL_MIRRORED_REPEAT) and mirror_clamp
> (GL_MIRROR_CLAMP_TO_EDGE) modes however have some very interesting
> differences to "gather is just the same as bilinear filtering without
> the actual filtering". In particular, a bilinear filter implementation
> can cut a lot of corners wrt texel selection as it doesn't need to
> maintain texel order (as long as the weights follow the same order) and
> can even pick different samples (as long as they have weight 0).
> So, test these modes too. I used this for fixing llvmpipe, passes with
> nvidia blob too (the test actually always hits exactly the cases where
> one texel would have weight 0).
> ---
>   tests/texturing/shaders/textureGather.c | 21 ++++++++++++++++++++-
>   1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/tests/texturing/shaders/textureGather.c b/tests/texturing/shaders/textureGather.c
> index f364c5c..8ea94b6 100644
> --- a/tests/texturing/shaders/textureGather.c
> +++ b/tests/texturing/shaders/textureGather.c
> @@ -135,6 +135,23 @@ pixel_value(int i, int j, int offset_sel)
>   		if (i > texture_width - 1) i = texture_width - 1;
>   		if (j > texture_height - 1) j = texture_height - 1;
>   	}
> +	else if (address_mode == GL_MIRRORED_REPEAT) {
> +		bool isOdd;
> +		if (i < 0) i = -i - 1;

One nit-pick:  I realize you're following the style above, but I think 
putting this on two lines is better.  That is:

if (i < 0)
	i = -i - 1;

Just in case someone ever needs to set a breakpoint when debugging.

Reviewed-by: Brian Paul <brianp at vmware.com>

> +		isOdd = (i / texture_width) & 1;
> +		i = i % texture_width;
> +		if (isOdd) i = texture_width - i - 1;
> +		if (j < 0) j = -j - 1;
> +		isOdd = (j / texture_height) & 1;
> +		j = j % texture_height;
> +		if (isOdd) j = texture_height - j - 1;
> +	}
> +	else if (address_mode == GL_MIRROR_CLAMP_TO_EDGE) {
> +		if (i < 0) i = -i - 1;
> +		if (j < 0) j = -j - 1;
> +		if (i > texture_width - 1) i = texture_width - 1;
> +		if (j > texture_height - 1) j = texture_height - 1;
> +	}
>
>   	return i + j * texture_width;
>   }
> @@ -555,7 +572,7 @@ fail_with_usage(void)
>   	       "	comptype = unorm|float|uint|int|shadow\n"
>   	       "	sampler = 2D|2DArray|Cube|CubeArray|2DRect\n"
>   	       "	compselect = 0|1|2|3\n"
> -	       "	addressmode = repeat|clamp\n");
> +	       "	addressmode = repeat|clamp|mirror_repeat|mirror_clamp\n");
>   	piglit_report_result(PIGLIT_SKIP);
>   }
>
> @@ -596,6 +613,8 @@ piglit_init(int argc, char **argv)
>   		else if (!strcmp(opt, "3")) comp_select = 3;
>   		else if (!strcmp(opt, "repeat")) address_mode = GL_REPEAT;
>   		else if (!strcmp(opt, "clamp")) address_mode = GL_CLAMP_TO_EDGE;
> +		else if (!strcmp(opt, "mirror_repeat")) address_mode = GL_MIRRORED_REPEAT;
> +		else if (!strcmp(opt, "mirror_clamp")) address_mode = GL_MIRROR_CLAMP_TO_EDGE;
>   	}
>
>   	if (stage == NOSTAGE) fail_with_usage();
>



More information about the Piglit mailing list