[Piglit] [PATCH 2/2] arb_shader_image_load_store/invalid: Skip the index bounds test on Intel Ivybridge hardware.

Francisco Jerez currojerez at riseup.net
Fri Jul 24 11:01:47 PDT 2015

This test is known to cause a GPU hang on IVB due to a hardware bug.
The reason is that the hardware seems to be unable to cope with
binding table indices mapping to an invalid surface, which is
sometimes the case when a shader accesses an array of images out of

According to the ARB_shader_image_load_store spec "if the index used
to select an individual element [of an array of images] is negative or
greater than or equal to the size of the array, the results of the
operation are undefined but may not lead to termination." -- Which is
precisely one of the typical outcomes of the GPU hang caused by this

In theory this could be fixed by implementing array bounds checking in
software, but it doesn't seem worth doing because on the one hand it
would punish well-behaved applications unnecessarily, and on the other
hand there doesn't seem to be any reasonable use-case for the
behaviour required by the spec [the implementation may set the
computer on fire as long as it somehow manages not to terminate the
program ;)].

If the breakage caused by this test case was confined to a single
process I would probably consider to leave it alone, however I've
noticed that in some cases the hang will cause other unrelated piglit
tests that happen to be run in parallel to fail, causing some random
noise in the results we get from our piglit system, what makes them
rather difficult to interpret.
 tests/spec/arb_shader_image_load_store/invalid.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/tests/spec/arb_shader_image_load_store/invalid.c b/tests/spec/arb_shader_image_load_store/invalid.c
index a0981e4..52b3275 100644
--- a/tests/spec/arb_shader_image_load_store/invalid.c
+++ b/tests/spec/arb_shader_image_load_store/invalid.c
@@ -292,6 +292,17 @@ invalidate_address_bounds(const struct image_info img, GLuint prog)
 static bool
+   /* This test is known to cause a GPU hang on Intel Ivybridge
+    * hardware due to a hardware bug.  Don't annoy users
+    * unnecessarily.
+    */
+   return !strstr((const char *)glGetString(GL_RENDERER),
+                  "Intel(R) Ivybridge");
+static bool
 invalidate_index_bounds(const struct image_info img, GLuint prog)
         return set_uniform_int(prog, "u", 0xdeadcafe);
@@ -444,7 +455,7 @@ piglit_init(int argc, char **argv)
                  *  element is negative or greater than or equal to
                  *  the size of the array [...]"
-                subtest(&status, true,
+                subtest(&status, can_test_index_bounds(),
                         run_test(op, def_img, def_img,
                                  invalidate_index_bounds, true),
                         "%s/index bounds test", op->name);

More information about the Piglit mailing list