diff options
author | Martin Peres <martin.peres@linux.intel.com> | 2015-08-21 14:29:22 +0300 |
---|---|---|
committer | Martin Peres <martin.peres@linux.intel.com> | 2015-08-31 10:32:39 +0300 |
commit | 561eb50a0e4458cfe2f41c66eb8faed01878abc7 (patch) | |
tree | 1a85c899548b8377900be2656f85deeb174d16a6 | |
parent | 44931bed4ac0e5616b2117d1419f36b1a244c870 (diff) |
arb_shader_image_size/builtin: test all the image formats
This patch introduces the concept of stage and image format of interest in
order to reduce the number of subtests actually being tested.
The quick mode's behaviour is unchanged while we also introduce the slow mode
that forces running the tests over all the image formats and stages.
The slow mode takes 6.5 minutes on a Fermi with the NVIDIA proprietary driver
while the normal execution time is around 1 second.
Signed-off-by: Martin Peres <martin.peres@linux.intel.com>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
-rwxr-xr-x | tests/spec/arb_shader_image_size/builtin.c | 87 |
1 files changed, 68 insertions, 19 deletions
diff --git a/tests/spec/arb_shader_image_size/builtin.c b/tests/spec/arb_shader_image_size/builtin.c index 48a1d1ed1..854e2b308 100755 --- a/tests/spec/arb_shader_image_size/builtin.c +++ b/tests/spec/arb_shader_image_size/builtin.c @@ -131,13 +131,14 @@ check(const struct grid_info grid, struct image_info img_src) } static bool -run_test(const struct image_target_info *target, +run_test(const struct image_format_info *format, + const struct image_target_info *target, const struct image_extent size) { const struct grid_info grid = grid_info(GL_FRAGMENT_SHADER, GL_RGBA32I, 16, 16); const struct image_info img = { - target, grid.format, size, + target, format, size, image_format_epsilon(grid.format) }; GLuint prog = generate_program( @@ -208,14 +209,72 @@ is_test_reasonable(bool quick, const struct image_extent size) return product(size) < (quick ? 4 : 64) * 1024 * 1024; } +static bool +is_format_interesting(const struct image_format_info *format, bool override) +{ + switch(format->format) + { + case GL_RGBA32F: + case GL_RGBA16F: + case GL_RGBA32I: + case GL_RGBA16I: + case GL_RGBA8I: + case GL_RGBA32UI: + case GL_RGBA16UI: + case GL_RGBA8UI: + return true; + default: + return override; + } +} + +static bool +is_stage_interesting(const struct image_stage_info *stage, bool override) +{ + switch(stage->stage) + { + case GL_FRAGMENT_SHADER: + case GL_COMPUTE_SHADER: + return true; + default: + return override; + } +} + +static void +test_max_dimensions(const struct image_format_info *format, + const struct image_target_info *target, + const struct image_stage_info *stage, + enum piglit_result *status, + bool quick, bool slow) +{ + int d; + for (d = 0; d < 4; ++d) { + if (should_test_dimension(target, d)) { + const struct image_extent size = + get_test_extent(target, d); + + subtest(status, + is_test_reasonable(quick, size) && + is_format_interesting(format, slow) && + is_stage_interesting(stage, slow), + run_test(format, target, size), + "%s/%s/image%s max size test/%dx%dx%dx%d", + format->name, stage->name, target->name, + size.x, size.y, size.z, size.w); + } + } +} + void piglit_init(int argc, char **argv) { const bool quick = (argc >= 2 && !strcmp(argv[1], "--quick")); + const bool slow = (argc >= 2 && !strcmp(argv[1], "--slow")); enum piglit_result status = PIGLIT_PASS; + const struct image_format_info *format; const struct image_target_info *target; const struct image_stage_info *stage; - int d; /* The spec of the extension says we should require GL 4.2 but let's * just request GL_ARB_shader_image_size which will in turn require @@ -223,22 +282,12 @@ piglit_init(int argc, char **argv) */ piglit_require_extension("GL_ARB_shader_image_size"); - - for (stage = image_stages(); stage->stage; ++stage) { - for (target = image_targets(); target->name; ++target) { - for (d = 0; d < 4; ++d) { - if (should_test_dimension(target, d)) { - const struct image_extent size = - get_test_extent(target, d); - - subtest(&status, - is_test_reasonable(quick, size), - run_test(target, size), - "%s/image%s max size test/" - "%dx%dx%dx%d", stage->name, - target->name, - size.x, size.y, size.z, size.w); - } + for (format = image_formats_load_store; format->format; ++format) { + for (stage = image_stages(); stage->stage; ++stage) { + for (target = image_targets(); target->name; ++target) { + test_max_dimensions(format, target, + stage, &status, + quick, slow); } } } |