summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2010-07-01 18:27:39 +0100
committerJosé Fonseca <jfonseca@vmware.com>2010-07-02 11:50:00 +0100
commit37f4c2f906c8e2a6df609a190e4ca9ff028b265b (patch)
tree136b83bda6536b6d6cc83e5fef4de84996998c24 /src
parent8556b77c56f3f1f0e75ce46d6b5c0d84c7b4eabd (diff)
gallivm: Fix 4 x unorm8 -> 4 x float conversion.
Also fix the test.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_conv.c19
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_pack.c18
-rw-r--r--src/gallium/drivers/llvmpipe/lp_test_conv.c2
3 files changed, 31 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_conv.c b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
index 5e7260dc21..44428f884d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_conv.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
@@ -330,15 +330,24 @@ lp_build_conv(LLVMBuilderRef builder,
/*
* Truncate or expand bit width
+ *
+ * No data conversion should happen here, although the sign bits are
+ * crucial to avoid bad clamping.
*/
- assert(!tmp_type.floating || tmp_type.width == dst_type.width);
+ {
+ struct lp_type new_type;
+
+ new_type = tmp_type;
+ new_type.sign = dst_type.sign;
+ new_type.width = dst_type.width;
+ new_type.length = dst_type.length;
- lp_build_resize(builder, tmp_type, dst_type, tmp, num_srcs, tmp, num_dsts);
+ lp_build_resize(builder, tmp_type, new_type, tmp, num_srcs, tmp, num_dsts);
- tmp_type.width = dst_type.width;
- tmp_type.length = dst_type.length;
- num_tmps = num_dsts;
+ tmp_type = new_type;
+ num_tmps = num_dsts;
+ }
/*
* Scale to the widest range
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_pack.c b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
index dfe83b36c4..7748f8f099 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_pack.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
@@ -430,7 +430,10 @@ lp_build_pack(LLVMBuilderRef builder,
/**
- * Truncate or expand the bitwidth
+ * Truncate or expand the bitwidth.
+ *
+ * NOTE: Getting the right sign flags is crucial here, as we employ some
+ * intrinsics that do saturation.
*/
void
lp_build_resize(LLVMBuilderRef builder,
@@ -442,7 +445,18 @@ lp_build_resize(LLVMBuilderRef builder,
LLVMValueRef tmp[LP_MAX_VECTOR_LENGTH];
unsigned i;
- assert(!src_type.floating || src_type.width == dst_type.width);
+ /*
+ * We don't support float <-> int conversion here. That must be done
+ * before/after calling this function.
+ */
+ assert(src_type.floating == dst_type.floating);
+
+ /*
+ * We don't support double <-> float conversion yet, although it could be
+ * added with little effort.
+ */
+ assert((!src_type.floating && !dst_type.floating) ||
+ src_type.width == dst_type.width);
/* We must not loose or gain channels. Only precision */
assert(src_type.length * num_srcs == dst_type.length * num_dsts);
diff --git a/src/gallium/drivers/llvmpipe/lp_test_conv.c b/src/gallium/drivers/llvmpipe/lp_test_conv.c
index 081f2d324b..cf41b40581 100644
--- a/src/gallium/drivers/llvmpipe/lp_test_conv.c
+++ b/src/gallium/drivers/llvmpipe/lp_test_conv.c
@@ -167,7 +167,7 @@ test_one(unsigned verbose,
unsigned i, j;
void *code;
- if (src_type.width * src_type.length != dst_type.width * dst_type.length ||
+ if (src_type.width * src_type.length != dst_type.width * dst_type.length &&
src_type.length != dst_type.length) {
return TRUE;
}