[Piglit] [PATCH] texelFetch: test various texture dimensions
Chris Forbes
chrisf at ijw.co.nz
Thu Sep 19 13:56:06 PDT 2013
Sounds like a good thing to do. I haven't looked closely enough to
determine if it's correct.
Acked-by: Chris Forbes <chrisf at ijw.co.nz>
On Fri, Sep 20, 2013 at 2:57 AM, Jose Fonseca <jfonseca at vmware.com> wrote:
> 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
>>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
More information about the Piglit
mailing list