gallivm/nir: allow 64-bit arit ops
[mesa.git] / src / gallium / auxiliary / gallivm / lp_bld_format_aos.c
index 781ceb8b03de1374466a25895844e5f06bd4e152..74fe1672b27f8ec9fcd392ef59478972a365747a 100644 (file)
@@ -54,7 +54,7 @@
 #include "lp_bld_intr.h"
 #include "lp_bld_logic.h"
 #include "lp_bld_bitarit.h"
-
+#include "lp_bld_misc.h"
 
 /**
  * Basic swizzling.  Rearrange the order of the unswizzled array elements
@@ -478,6 +478,8 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
                         LLVMValueRef j,
                         LLVMValueRef cache)
 {
+   const struct util_format_unpack_description *unpack =
+      util_format_unpack_description(format_desc->format);
    LLVMBuilderRef builder = gallivm->builder;
    unsigned num_pixels = type.length / 4;
    struct lp_build_context bld;
@@ -770,32 +772,26 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
                        format_desc->format == PIPE_FORMAT_LATC1_SNORM ||
                        format_desc->format == PIPE_FORMAT_LATC2_SNORM);
 
-      if (!tmp_type.sign) {
-         /*
-          * FIXME: this is buggy for snorm formats, likely the lerp is
-          * busted.
-          */
-         tmp = lp_build_fetch_rgtc_rgba_aos(gallivm,
-                                            format_desc,
-                                            num_pixels,
-                                            base_ptr,
-                                            offset,
-                                            i, j,
-                                            cache);
-
-         lp_build_conv(gallivm,
-                       tmp_type, type,
-                       &tmp, 1, &tmp, 1);
-
-         return tmp;
-      }
+      tmp = lp_build_fetch_rgtc_rgba_aos(gallivm,
+                                         format_desc,
+                                         num_pixels,
+                                         base_ptr,
+                                         offset,
+                                         i, j,
+                                         cache);
+
+      lp_build_conv(gallivm,
+                    tmp_type, type,
+                    &tmp, 1, &tmp, 1);
+
+       return tmp;
    }
 
    /*
     * Fallback to util_format_description::fetch_rgba_8unorm().
     */
 
-   if (format_desc->fetch_rgba_8unorm &&
+   if (unpack->fetch_rgba_8unorm &&
        !type.floating && type.width == 8 && !type.sign && type.norm) {
       /*
        * Fallback to calling util_format_description::fetch_rgba_8unorm.
@@ -841,9 +837,11 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
          function_type = LLVMFunctionType(ret_type, arg_types,
                                           ARRAY_SIZE(arg_types), 0);
 
+         if (gallivm->cache)
+            gallivm->cache->dont_cache = true;
          /* make const pointer for the C fetch_rgba_8unorm function */
          function = lp_build_const_int_pointer(gallivm,
-            func_to_pointer((func_pointer) format_desc->fetch_rgba_8unorm));
+            func_to_pointer((func_pointer) unpack->fetch_rgba_8unorm));
 
          /* cast the callee pointer to the function's type */
          function = LLVMBuildBitCast(builder, function,
@@ -896,10 +894,12 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
    }
 
    /*
-    * Fallback to util_format_description::fetch_rgba_float().
+    * Fallback to fetch_rgba().
     */
 
-   if (format_desc->fetch_rgba_float) {
+   util_format_fetch_rgba_func_ptr fetch_rgba =
+      util_format_fetch_rgba_func(format_desc->format);
+   if (fetch_rgba) {
       /*
        * Fallback to calling util_format_description::fetch_rgba_float.
        *
@@ -926,7 +926,7 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
       }
 
       /*
-       * Declare and bind format_desc->fetch_rgba_float().
+       * Declare and bind unpack->fetch_rgba_float().
        */
 
       {
@@ -943,8 +943,10 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
          arg_types[2] = i32t;
          arg_types[3] = i32t;
 
+         if (gallivm->cache)
+            gallivm->cache->dont_cache = true;
          function = lp_build_const_func_pointer(gallivm,
-                                                func_to_pointer((func_pointer) format_desc->fetch_rgba_float),
+                                                func_to_pointer((func_pointer) fetch_rgba),
                                                 ret_type,
                                                 arg_types, ARRAY_SIZE(arg_types),
                                                 format_desc->short_name);