summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/softpipe
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/softpipe')
-rw-r--r--src/gallium/drivers/softpipe/sp_tex_sample.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/src/gallium/drivers/softpipe/sp_tex_sample.c b/src/gallium/drivers/softpipe/sp_tex_sample.c
index 8de2712ee21..4121857b869 100644
--- a/src/gallium/drivers/softpipe/sp_tex_sample.c
+++ b/src/gallium/drivers/softpipe/sp_tex_sample.c
@@ -2294,6 +2294,8 @@ sample_compare(struct sp_sampler_view *sp_sview,
int j, k0, k1, k2, k3;
float val;
float pc0, pc1, pc2, pc3;
+ const struct util_format_description *format_desc;
+ unsigned chan_type;
/**
* Compare texcoord 'p' (aka R) against texture value 'rgba[0]'
@@ -2304,21 +2306,39 @@ sample_compare(struct sp_sampler_view *sp_sview,
if (sp_sview->base.texture->target == PIPE_TEXTURE_2D_ARRAY ||
sp_sview->base.texture->target == PIPE_TEXTURE_CUBE) {
- pc0 = CLAMP(c0[0], 0.0F, 1.0F);
- pc1 = CLAMP(c0[1], 0.0F, 1.0F);
- pc2 = CLAMP(c0[2], 0.0F, 1.0F);
- pc3 = CLAMP(c0[3], 0.0F, 1.0F);
+ pc0 = c0[0];
+ pc1 = c0[1];
+ pc2 = c0[2];
+ pc3 = c0[3];
} else if (sp_sview->base.texture->target == PIPE_TEXTURE_CUBE_ARRAY) {
- pc0 = CLAMP(c1[0], 0.0F, 1.0F);
- pc1 = CLAMP(c1[1], 0.0F, 1.0F);
- pc2 = CLAMP(c1[2], 0.0F, 1.0F);
- pc3 = CLAMP(c1[3], 0.0F, 1.0F);
+ pc0 = c1[0];
+ pc1 = c1[1];
+ pc2 = c1[2];
+ pc3 = c1[3];
} else {
- pc0 = CLAMP(p[0], 0.0F, 1.0F);
- pc1 = CLAMP(p[1], 0.0F, 1.0F);
- pc2 = CLAMP(p[2], 0.0F, 1.0F);
- pc3 = CLAMP(p[3], 0.0F, 1.0F);
+ pc0 = p[0];
+ pc1 = p[1];
+ pc2 = p[2];
+ pc3 = p[3];
+ }
+
+ format_desc = util_format_description(sp_sview->base.format);
+ /* not entirely sure we couldn't end up with non-valid swizzle here */
+ chan_type = format_desc->swizzle[0] <= UTIL_FORMAT_SWIZZLE_W ?
+ format_desc->channel[format_desc->swizzle[0]].type :
+ UTIL_FORMAT_TYPE_FLOAT;
+ if (chan_type != UTIL_FORMAT_TYPE_FLOAT) {
+ /*
+ * clamping is a result of conversion to texture format, hence
+ * doesn't happen with floats. Technically also should do comparison
+ * in texture format (quantization!).
+ */
+ pc0 = CLAMP(pc0, 0.0F, 1.0F);
+ pc1 = CLAMP(pc1, 0.0F, 1.0F);
+ pc2 = CLAMP(pc2, 0.0F, 1.0F);
+ pc3 = CLAMP(pc3, 0.0F, 1.0F);
}
+
/* compare four texcoords vs. four texture samples */
switch (sampler->compare_func) {
case PIPE_FUNC_LESS: