llvmpipe: fix out-of-bounds texture sampling
authorBrian Paul <brianp@vmware.com>
Fri, 30 Apr 2010 19:54:31 +0000 (13:54 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 30 Apr 2010 19:59:07 +0000 (13:59 -0600)
If we're using a wrap mode in which border color sampling is possible
it means that texcoords may be outside of the texture image bounds.
Fetching the texel may result in a segfault.

Use the 'use_border' variable to catch such texcoords and replace
the texel offset with zero (which will be in bounds).

Fixes segfault in Lightsmark demo, fd.o bug 27877.

src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c

index 7c9c8e2d9f7517f09c82be29ad36f05ae27be206..54c0ad7ce4397ec82a99e6e0f8e05d04a5af88d7 100644 (file)
@@ -325,6 +325,18 @@ lp_build_sample_texel_soa(struct lp_build_sample_context *bld,
                                    bld->format_desc,
                                    x, y, z, y_stride, z_stride);
 
+   if (use_border) {
+      /* If we can sample the border color, it means that texcoords may
+       * lie outside the bounds of the texture image.  We need to do
+       * something to prevent reading out of bounds and causing a segfault.
+       *
+       * Simply AND the texture coords with !use_border.  This will cause
+       * coords which are out of bounds to become zero.  Zero's guaranteed
+       * to be inside the texture image.
+       */
+      offset = lp_build_andc(&bld->uint_coord_bld, offset, use_border);
+   }
+
    lp_build_fetch_rgba_soa(bld->builder,
                            bld->format_desc,
                            bld->texel_type,