i965/fs_surface_builder: Only apply predicate to components that exist
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 14 Sep 2015 22:36:24 +0000 (15:36 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 15 Sep 2015 18:09:48 +0000 (11:09 -0700)
In certain conditions, we have to do bounds-checking in the shader for
image_load_store.  The way this works for image loads is that we do a
predicated load and then emit a series of selects, one per component,
that gives us 0 or the loaded value depending on whether or not you're
in bounds.  However, we were hard-coding 4 components which may not be
correct.  Instead, we should be using size which is the number of
components read.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp

index 727e8d1b82a2e037ff3c58573199e9a09da736ba..88f22fa9c7f7dd79dfdd256b81f4631a1c8f1590 100644 (file)
@@ -905,7 +905,7 @@ namespace brw {
             tmp = emit_untyped_read(bld, image, laddr, 1, size, pred);
 
             /* An out of bounds surface access should give zero as result. */
-            for (unsigned c = 0; c < 4; ++c)
+            for (unsigned c = 0; c < size; ++c)
                set_predicate(pred, bld.SEL(offset(tmp, bld, c),
                                            offset(tmp, bld, c), fs_reg(0)));
          }