Mesa (master): gallivm/rgtc: fix the truncation to 8-bit

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Apr 4 02:55:44 UTC 2020


Module: Mesa
Branch: master
Commit: 03204dadbc1829128f3e0a5e74f4f85851f6e708
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=03204dadbc1829128f3e0a5e74f4f85851f6e708

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Apr  3 13:54:17 2020 +1000

gallivm/rgtc: fix the truncation to 8-bit

The 8 bit type wasn't 8-bit so when doing signed work we lost
the sign bit. This fixes it to use a proper vector type,
even if we just end up in here with the 1-wide path for now.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4425>

---

 src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c b/src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c
index d799a5d45a9..174857e06d9 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_s3tc.c
@@ -898,19 +898,23 @@ s3tc_dxt5_alpha_channel(struct gallivm_state *gallivm,
                         LLVMValueRef i, LLVMValueRef j)
 {
    LLVMBuilderRef builder = gallivm->builder;
-   struct lp_type type;
+   struct lp_type type, type8;
    LLVMValueRef tmp, alpha0, alpha1, alphac, alphac0, bit_pos, shift;
    LLVMValueRef sel_mask, tmp_mask, alpha, alpha64, code_s;
    LLVMValueRef mask6, mask7, ainterp;
    LLVMTypeRef i64t = LLVMInt64TypeInContext(gallivm->context);
    LLVMTypeRef i32t = LLVMInt32TypeInContext(gallivm->context);
-   LLVMTypeRef i8t = LLVMInt32TypeInContext(gallivm->context);
    struct lp_build_context bld32;
 
    memset(&type, 0, sizeof type);
    type.width = 32;
    type.length = n;
 
+   memset(&type8, 0, sizeof type8);
+   type8.width = 8;
+   type8.length = n;
+   type8.sign = is_signed;
+
    lp_build_context_init(&bld32, gallivm, type);
    /* this looks pretty complex for vectorization:
     * extract a0/a1 values
@@ -924,8 +928,8 @@ s3tc_dxt5_alpha_channel(struct gallivm_state *gallivm,
    alpha0 = LLVMBuildAnd(builder, alpha_lo,
                          lp_build_const_int_vec(gallivm, type, 0xff), "");
    if (is_signed) {
-      alpha0 = LLVMBuildTrunc(builder, alpha0, i8t, "");
-      alpha0 = LLVMBuildSExt(builder, alpha0, i32t, "");
+      alpha0 = LLVMBuildTrunc(builder, alpha0, lp_build_vec_type(gallivm, type8), "");
+      alpha0 = LLVMBuildSExt(builder, alpha0, lp_build_vec_type(gallivm, type), "");
    }
 
    alpha1 = LLVMBuildLShr(builder, alpha_lo,
@@ -933,8 +937,8 @@ s3tc_dxt5_alpha_channel(struct gallivm_state *gallivm,
    alpha1 = LLVMBuildAnd(builder, alpha1,
                          lp_build_const_int_vec(gallivm, type, 0xff), "");
    if (is_signed) {
-      alpha1 = LLVMBuildTrunc(builder, alpha1, i8t, "");
-      alpha1 = LLVMBuildSExt(builder, alpha1, i32t, "");
+      alpha1 = LLVMBuildTrunc(builder, alpha1, lp_build_vec_type(gallivm, type8), "");
+      alpha1 = LLVMBuildSExt(builder, alpha1, lp_build_vec_type(gallivm, type), "");
    }
 
    /* pos = 3*(4j+i) */



More information about the mesa-commit mailing list