aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Galibert <[email protected]>2012-07-19 18:55:14 +0200
committerBrian Paul <[email protected]>2012-07-19 13:19:14 -0600
commitfbe3fa74e5cdaf02f3738da7d6052e1f1fd7bbf2 (patch)
treec80eb020d0163a873da477fd71779ef1ed61b3ca
parentd7522ed13052a3d30bc4faedce04685263f57933 (diff)
softpipe: Fix segfault with fbo-cubemap.
The cube sampler generates two-dimensional texture coordinates and hence passes NULL for the array for the third one. The actual 2D sampler, lower in the pipe, knew not to used that array since it didn't need it. But the samplers have become single-texel and the coordinate array dereference has been moved up one step, to a level where the code does not know only two coordinates are used. Hence the segfault. The simplest fix by far is to add a third dummy coordinate array in the call to the next pipe step, which will be dereferenced to an harmless 0 which then will be happily ignored by the sampler. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=52250 Signed-off-by: Olivier Galibert <[email protected]> Reviewed-by: Brian Paul <[email protected]>
-rw-r--r--src/gallium/drivers/softpipe/sp_tex_sample.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c
index 292dc6e8d71..f215b9022f4 100644
--- a/src/gallium/drivers/softpipe/sp_tex_sample.c
+++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
@@ -2090,6 +2090,11 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,
unsigned j;
float ssss[4], tttt[4];
+ /* Not actually used, but the intermediate steps that do the
+ * dereferencing don't know it.
+ */
+ static const float pppp[4] = { 0, 0, 0, 0 };
+
/*
major axis
direction target sc tc ma
@@ -2157,7 +2162,7 @@ sample_cube(struct tgsi_sampler *tgsi_sampler,
* is not active, this will point somewhere deeper into the
* pipeline, eg. to mip_filter or even img_filter.
*/
- samp->compare(tgsi_sampler, ssss, tttt, NULL, c0, control, rgba);
+ samp->compare(tgsi_sampler, ssss, tttt, pppp, c0, control, rgba);
}