Sounds like a good thing to do. I haven't looked closely enough to determine if it's correct.
Acked-by: Chris Forbes <[email protected]> On Fri, Sep 20, 2013 at 2:57 AM, Jose Fonseca <[email protected]> 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 >> [email protected] >> http://lists.freedesktop.org/mailman/listinfo/piglit >> > _______________________________________________ > Piglit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/piglit _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
