genX/pack: Add a __gen_fixed helper and use it for TextureLODBias
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 18 Jan 2016 19:35:04 +0000 (11:35 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 18 Jan 2016 19:35:04 +0000 (11:35 -0800)
The __gen_fixed helper properly clamps the value and also handles negative
values correctly.  Eventually, we need to make the scripts generate this
and use it for more things.

src/vulkan/gen75_pack.h
src/vulkan/gen7_pack.h
src/vulkan/gen8_pack.h
src/vulkan/gen9_pack.h

index 3d336848592d8bf93978b6bf3b6845b69e5b17c4..b012032190eabd95a842156f76ec3da2091b8464 100644 (file)
@@ -62,6 +62,36 @@ __gen_field(uint64_t v, uint32_t start, uint32_t end)
    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)
 {
@@ -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 << 8), 1, 13) |
+      __gen_fixed(values->TextureLODBias, 1, 13, true, 8) |
       __gen_field(values->AnisotropicAlgorithm, 0, 0) |
       0;
 
index 0fe13de89dfaef4096a24e12a62f9c0e342d8720..a3ba30a9745dca20a1774a2553aee35d7425392e 100644 (file)
@@ -62,6 +62,36 @@ __gen_field(uint64_t v, uint32_t start, uint32_t end)
    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)
 {
@@ -6630,7 +6660,7 @@ GEN7_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 << 8), 1, 13) |
+      __gen_fixed(values->TextureLODBias, 1, 13, true, 8) |
       __gen_field(values->AnisotropicAlgorithm, 0, 0) |
       0;
 
index 0d77b68a9c5f22a6da697148d1b8ed5527771096..042e0290a74dd94ce501ba71706d95f6f60aa41d 100644 (file)
@@ -62,6 +62,36 @@ __gen_field(uint64_t v, uint32_t start, uint32_t end)
    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)
 {
@@ -8666,7 +8696,7 @@ GEN8_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 << 8), 1, 13) |
+      __gen_fixed(values->TextureLODBias, 1, 13, true, 8) |
       __gen_field(values->AnisotropicAlgorithm, 0, 0) |
       0;
 
index fabcd7bb1e7e6494f8b982aa0dcd5fda2f34608e..db54e9cf85b630f86b97fbcae2dfbdd46a661143 100644 (file)
@@ -62,6 +62,36 @@ __gen_field(uint64_t v, uint32_t start, uint32_t end)
    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)
 {
@@ -9232,7 +9262,7 @@ GEN9_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 << 8), 1, 13) |
+      __gen_fixed(values->TextureLODBias, 1, 13, true, 8) |
       __gen_field(values->AnisotropicAlgorithm, 0, 0) |
       0;