[Piglit] [PATCH] texelFetch: test various texture dimensions
Jose Fonseca
jfonseca at vmware.com
Thu Sep 19 07:57:50 PDT 2013
Did't look closely at the implementation, but this seems a great idea!
Jose
----- Original Message -----
> This is the ultimate test for validating texture allocation in the driver.
> texelFetch is a perfect test for it: it supports various texture targets,
> NPOT textures, and mipmapping. It's also our only test for NPOT 3D mipmapped
> textures. This commit adds support for testing various texture dimensions.
>
> There are several ways to specify the range of dimensions to test, for
> example:
>
> texelFetch fs sampler3D 1x129x9-98x129x9
> This runs the test with the texture width of 1, 2, 3, ... up to 98.
>
> texelFetch fs sampler3D 1x1x1-30x30x30
> This tests all WxHxD combinations, where W,H,D is in {1,..,30}.
> This one takes a really long time, so it's not practical for all.tests, but
> the option is there. The main difference between this and tex3d-npot is
> that
> this also tests mipmaps and you have the option to test bigger dimensions.
>
> The options for the last parameter are:
> WxH - test just WxHx1 (can be non-auto)
> WxHxD - test just WxHxD (can be non-auto)
> W1-W2 - start with W1x1x1 and end with W2x1x1
> W1xH1-W2xH2 - test all combinations between and including the specified
> values, and D=1
> W1xH1xD1-W2xH2xD2 - test all combinations between and including
> the specified values
>
> The new items in all.tests only iterate over one dimension, the other
> dimensions are fixed. It should cover most cases.
>
> Other changes:
>
> - the space between drawn quads is changed to 1 and the mipmaps are
> positioned
> next to each other for more stuff to fit on the window
>
> - the test fails if a texture with all its layers and mipmaps doesn't fit
> on the window
>
> - some but not all memory leaks are fixed
> ---
> tests/all.tests | 22 +++++
> tests/texturing/shaders/common.h | 1 +
> tests/texturing/shaders/texelFetch.c | 172
> ++++++++++++++++++++++++++---------
> 3 files changed, 152 insertions(+), 43 deletions(-)
>
> diff --git a/tests/all.tests b/tests/all.tests
> index dc36841..720f5ae 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -876,6 +876,21 @@ for stage in ['vs', 'gs', 'fs']:
> 'texelFetch {0} {1}sampler2DArray b0r1'.format(
> stage, type))
>
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler1D
> 1-513')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler1DArray 1x71-501x71')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler1DArray 1x281-501x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler1DArray 71x1-71x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler1DArray 281x1-281x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler2D
> 1x71-501x71')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler2D
> 1x281-501x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler2D
> 71x1-71x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler2D
> 281x1-281x281')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler3D
> 1x129x9-98x129x9')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler3D
> 98x1x9-98x129x9')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs sampler3D
> 98x129x1-98x129x9')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler2DArray 1x129x9-98x129x9')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler2DArray 98x1x9-98x129x9')
> +add_concurrent_test(spec['glsl-1.30']['execution'], 'texelFetch fs
> sampler2DArray 98x129x1-98x129x9')
> add_plain_test(spec['glsl-1.30']['execution'], 'fs-texelFetch-2D')
> add_plain_test(spec['glsl-1.30']['execution'], 'fs-texelFetchOffset-2D')
> add_shader_test_dir(spec['glsl-1.30']['execution'],
> @@ -1034,6 +1049,13 @@ for sample_count in MSAA_SAMPLE_COUNTS:
> # sample positions
> spec['ARB_texture_multisample/sample-position/%d' % (sample_count,)] = \
> concurrent_test('arb_texture_multisample-sample-position %d' %
> (sample_count,))
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMS 4
> 1x71-501x71')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMS 4
> 1x130-501x130')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMS 4
> 71x1-71x130')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMS 4
> 281x1-281x130')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMSArray
> 4 1x129x9-98x129x9')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMSArray
> 4 98x1x9-98x129x9')
> +add_concurrent_test(arb_texture_multisample, 'texelFetch fs sampler2DMSArray
> 4 98x129x1-98x129x9')
> add_concurrent_test(arb_texture_multisample,
> 'arb_texture_multisample-texstate')
> add_concurrent_test(arb_texture_multisample,
> 'arb_texture_multisample-errors')
> add_concurrent_test(arb_texture_multisample,
> 'arb_texture_multisample-sample-mask')
> diff --git a/tests/texturing/shaders/common.h
> b/tests/texturing/shaders/common.h
> index 7b241b9..a4d1dc0 100644
> --- a/tests/texturing/shaders/common.h
> +++ b/tests/texturing/shaders/common.h
> @@ -80,6 +80,7 @@ struct sampler_info
>
> /** Whether or not we're using GL_EXT_texture_swizzle */
> bool swizzling;
> +int minx, miny, minz, maxx, maxy, maxz;
> int sample_count;
> extern int shader_version;
>
> diff --git a/tests/texturing/shaders/texelFetch.c
> b/tests/texturing/shaders/texelFetch.c
> index badaac7..1c4c97f 100644
> --- a/tests/texturing/shaders/texelFetch.c
> +++ b/tests/texturing/shaders/texelFetch.c
> @@ -93,13 +93,13 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
> config.supports_gl_core_version = 31;
> }
>
> - config.window_width = 355;
> - config.window_height = 350;
> + config.window_width = 900;
> + config.window_height = 600;
> config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
>
> PIGLIT_GL_TEST_CONFIG_END
>
> -#define MAX_LOD_OR_SAMPLES 8.0
> +#define MAX_LOD_OR_SAMPLES 10.0
>
> /** Vertex shader attribute locations */
> const int pos_loc = 0;
> @@ -123,6 +123,9 @@ int divisor_loc;
> */
> float ***expected_colors;
>
> +int prog;
> +GLuint tex;
> +
> /**
> * Return the divisors necessary to scale the unnormalized texture data to
> * a floating point color value in the range [0, 1].
> @@ -139,21 +142,16 @@ compute_divisors(int lod, float *divisors)
> divisors[0] = -divisors[0];
> }
>
> -enum piglit_result
> -piglit_display()
> +static bool test_once()
> {
> - int i, l, z;
> + int i, l, z, level_y = 0;
> bool pass = true;
>
> - glViewport(0, 0, piglit_width, piglit_height);
> -
> - glClearColor(0.1, 0.1, 0.1, 1.0);
> - glClear(GL_COLOR_BUFFER_BIT);
> -
> - glPointSize(1.0);
> -
> i = 0;
> for (l = 0; l < miplevels; ++l) {
> + if (l && !has_samples())
> + level_y += 1 + MAX2(base_size[1] >> (l-1), 1);
> +
> for (z = 0; z < level_size[l][2]; z++) {
> /* Draw the "rectangle" for this miplevel/slice. */
> int points = level_size[l][0] * level_size[l][1];
> @@ -168,17 +166,15 @@ piglit_display()
> i += points;
>
> /* Compare results against reference image. */
> - pass &= piglit_probe_image_rgba(5+(5+base_size[0]) * z,
> - 5+(5+base_size[1]) * l,
> + pass &= piglit_probe_image_rgba(5+(1+base_size[0]) * z,
> + has_samples() ? 5+(1+base_size[1]) * l
> + : 5 + level_y,
> level_size[l][0],
> level_size[l][1],
> expected_colors[l][z]);
> }
> }
> -
> - piglit_present_results();
> -
> - return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> + return pass;
> }
>
> /**
> @@ -198,6 +194,7 @@ generate_VBOs()
> int *tc, *tc_data;
> bool array_1D = sampler.target == GL_TEXTURE_1D_ARRAY;
> int num_texels = 0;
> + int level_y = 0;
>
> /* Calculate the # of texels a.k.a. size of the VBOs */
> for (l = 0; l < miplevels; l++) {
> @@ -208,12 +205,18 @@ generate_VBOs()
> tc = tc_data = malloc(num_texels * 4 * sizeof(int));
>
> for (l = 0; l < miplevels; l++) {
> + if (l && !has_samples())
> + level_y += 1 + MAX2(base_size[1] >> (l-1), 1);
> +
> for (z = 0; z < level_size[l][2]; z++) {
> for (y = 0; y < level_size[l][1]; y++) {
> for (x = 0; x < level_size[l][0]; x++) {
> /* Assign pixel positions: */
> - pos[0] = 5.5 + (5 + base_size[0])*z + x;
> - pos[1] = 5.5 + (5 + base_size[1])*l + y;
> + pos[0] = 5.5 + (1 + base_size[0])*z + x;
> + if (has_samples())
> + pos[1] = 5.5 + (1 + base_size[1])*l + y;
> + else
> + pos[1] = 5.5 + level_y + y;
> pos[2] = 0.0;
> pos[3] = 1.0;
>
> @@ -273,6 +276,9 @@ generate_VBOs()
> tc_data, GL_STATIC_DRAW);
> glVertexAttribIPointer(texcoord_loc, 4, GL_INT, 0, 0);
> glEnableVertexAttribArray(texcoord_loc);
> +
> + free(pos_data);
> + free(tc_data);
> }
>
> /* like piglit_draw_rect(), but works in a core context too.
> @@ -432,7 +438,6 @@ generate_texture()
> float *expected_ptr;
> void *level_image;
> float divisors[4];
> - GLuint tex;
> GLenum target = sampler.target;
>
> glActiveTexture(GL_TEXTURE0);
> @@ -528,6 +533,10 @@ generate_texture()
>
> if (!has_samples())
> upload_miplevel_data(target, l, level_image);
> +
> + free(f_level);
> + free(u_level);
> + free(i_level);
> }
>
> if (has_samples())
> @@ -754,17 +763,6 @@ generate_GLSL(enum shader_target test_stage)
> }
>
> /**
> - * Set the size of the texture's base level.
> - */
> -void
> -set_base_size()
> -{
> - base_size[0] = 65;
> - base_size[1] = has_height() ? 32 : 1;
> - base_size[2] = has_slices() ? 5 : 1;
> -}
> -
> -/**
> * Is this sampler supported by texelFetch?
> */
> static bool
> @@ -798,8 +796,12 @@ parse_args(int argc, char **argv)
> {
> int i;
> bool sampler_found = false;
> + bool dim_range_found = false;
>
> sample_count = 0;
> + minx = maxx = 65;
> + miny = maxy = 32;
> + minz = maxz = 5;
>
> for (i = 1; i < argc; i++) {
> if (test_stage == UNKNOWN) {
> @@ -833,13 +835,45 @@ parse_args(int argc, char **argv)
> /* Maybe it's the sample count? */
> if (sampler_found && has_samples() && !sample_count) {
> sample_count = atoi(argv[i]);
> -
> continue;
> }
>
> if (!swizzling && (swizzling = parse_swizzle(argv[i])))
> continue;
>
> + if (!dim_range_found) {
> + if (sscanf(argv[i], "%ux%ux%u-%ux%ux%u",
> + &minx, &miny, &minz, &maxx, &maxy, &maxz) == 6) {
> + dim_range_found = true;
> + continue;
> + }
> + if (sscanf(argv[i], "%ux%u-%ux%u",
> + &minx, &miny, &maxx, &maxy) == 4) {
> + minz = maxz = 1;
> + dim_range_found = true;
> + continue;
> + }
> + if (sscanf(argv[i], "%u-%u", &minx, &maxx) == 2) {
> + miny = maxy = minz = maxz = 1;
> + dim_range_found = true;
> + continue;
> + }
> + if (sscanf(argv[i], "%ux%ux%u", &minx, &miny, &minz) == 3) {
> + maxx = minx;
> + maxy = miny;
> + maxz = minz;
> + dim_range_found = true;
> + continue;
> + }
> + if (sscanf(argv[i], "%ux%u", &minx, &miny) == 2) {
> + maxx = minx;
> + maxy = miny;
> + minz = maxz = 1;
> + dim_range_found = true;
> + continue;
> + }
> + }
> +
> fail_and_show_usage();
> }
>
> @@ -848,13 +882,73 @@ parse_args(int argc, char **argv)
>
> if (test_stage == GS && shader_version < 150)
> shader_version = 150;
> +
> + if (!has_height()) {
> + miny = maxy = 1;
> + }
> +
> + if (!has_slices()) {
> + minz = maxz = 1;
> + }
> +
> + if (minx < maxx || miny < maxy || minz < maxz)
> + piglit_automatic = true;
> }
>
> +enum piglit_result
> +piglit_display()
> +{
> + int x, y, z;
> + bool pass = true;
> +
> + glClearColor(0.1, 0.1, 0.1, 1.0);
> + glPointSize(1.0);
> +
> + for (x = minx; x <= maxx; x++) {
> + for (y = miny; y <= maxy; y++) {
> + for (z = minz; z <= maxz; z++) {
> + printf("%ix%ix%i\n", x, y, z);
> +
> + if (5 + (x+1) * z >= piglit_width) {
> + printf("Width or depth is too big.\n");
> + piglit_report_result(PIGLIT_FAIL);
> + }
> +
> + if ((has_samples() && 5 + (y+1) * miplevels >= piglit_height) ||
> + (!has_samples() && 5 + y*2 + miplevels-2 >= piglit_height)) {
> + printf("Height is too big or too many samples.\n");
> + piglit_report_result(PIGLIT_FAIL);
> + }
> +
> + base_size[0] = x;
> + base_size[1] = y;
> + base_size[2] = z;
> +
> + /* Create textures and set miplevel info */
> + compute_miplevel_info();
> + generate_texture();
> + generate_VBOs();
> +
> + glViewport(0, 0, piglit_width, piglit_height);
> + glClear(GL_COLOR_BUFFER_BIT);
> + glUseProgram(prog);
> +
> + pass &= test_once();
> +
> + glUseProgram(0);
> + glDeleteTextures(1, &tex);
> + }
> + }
> + }
> +
> + piglit_present_results();
> +
> + return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
>
> void
> piglit_init(int argc, char **argv)
> {
> - int prog;
> int tex_location;
>
> if (!supported_sampler()) {
> @@ -893,14 +987,6 @@ piglit_init(int argc, char **argv)
> tex_location = glGetUniformLocation(prog, "tex");
> divisor_loc = glGetUniformLocation(prog, "divisor");
>
> - /* Create textures and set miplevel info */
> - set_base_size();
> - compute_miplevel_info();
> - generate_texture();
> -
> - generate_VBOs();
> -
> glUseProgram(prog);
> -
> glUniform1i(tex_location, 0);
> }
> --
> 1.8.1.2
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
>
More information about the Piglit
mailing list