i965: fix unsigned long overflows for i386
[mesa.git] / src / vulkan / gen75_pack.h
index 3ed685bed0c32684fe3646ff295317203c987817..7b098894ee2dee2ec0850e45776977311ce4528f 100644 (file)
@@ -47,7 +47,7 @@ union __gen_value {
 static inline uint64_t
 __gen_mbo(uint32_t start, uint32_t end)
 {
-   return (~0ul >> (64 - (end - start + 1))) << start;
+   return (~0ull >> (64 - (end - start + 1))) << start;
 }
 
 static inline uint64_t
@@ -56,18 +56,48 @@ __gen_field(uint64_t v, uint32_t start, uint32_t end)
    __gen_validate_value(v);
 #if DEBUG
    if (end - start + 1 < 64)
-      assert(v < 1ul << (end - start + 1));
+      assert(v < 1ull << (end - start + 1));
 #endif
 
    return v << start;
 }
 
+static inline uint64_t
+__gen_fixed(float v, uint32_t start, uint32_t end,
+            bool is_signed, uint32_t fract_bits)
+{
+   __gen_validate_value(v);
+
+   const float factor = (1 << fract_bits);
+
+   float max, min;
+   if (is_signed) {
+      max = ((1 << (end - start)) - 1) / factor;
+      min = -(1 << (end - start)) / factor;
+   } else {
+      max = ((1 << (end - start + 1)) - 1) / factor;
+      min = 0.0f;
+   }
+
+   if (v > max)
+      v = max;
+   else if (v < min)
+      v = min;
+
+   int32_t int_val = roundf(v * factor);
+
+   if (is_signed)
+      int_val &= (1 << (end - start + 1)) - 1;
+
+   return int_val << start;
+}
+
 static inline uint64_t
 __gen_offset(uint64_t v, uint32_t start, uint32_t end)
 {
    __gen_validate_value(v);
 #if DEBUG
-   uint64_t mask = (~0ul >> (64 - (end - start + 1))) << start;
+   uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start;
 
    assert((v & ~mask) == 0);
 #endif
@@ -7984,7 +8014,7 @@ struct GEN75_SAMPLER_STATE {
 #define     MAPFILTER_ANISOTROPIC                              2
 #define     MAPFILTER_MONO                                     6
    uint32_t                                     MinModeFilter;
-   uint32_t                                     TextureLODBias;
+   float                                        TextureLODBias;
 #define     LEGACY                                             0
 #define     EWAApproximation                                   1
    uint32_t                                     AnisotropicAlgorithm;
@@ -8048,7 +8078,7 @@ GEN75_SAMPLER_STATE_pack(__gen_user_data *data, void * restrict dst,
       __gen_field(values->MipModeFilter, 20, 21) |
       __gen_field(values->MagModeFilter, 17, 19) |
       __gen_field(values->MinModeFilter, 14, 16) |
-      __gen_field(values->TextureLODBias, 1, 13) |
+      __gen_fixed(values->TextureLODBias, 1, 13, true, 8) |
       __gen_field(values->AnisotropicAlgorithm, 0, 0) |
       0;