util: ubyte_to_float and float_to_ubyte whenever possible.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Apr 2010 15:53:07 +0000 (16:53 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 9 Apr 2010 15:53:07 +0000 (16:53 +0100)
More accurate results.

We should probably generalize these functions for more cases.

src/gallium/auxiliary/util/u_format_pack.py

index a92a5bcfa9e631aa48c5e611a9a07c0d82327546..a6070934f045249f2115cb248c7d0731ecdd17ec 100644 (file)
@@ -299,6 +299,13 @@ def conversion_expr(src_channel,
         value = 'util_half_to_float(%s)' % value
         src_size = 32
 
+    # Special case for float <-> ubytes for more accurate results
+    # Done before clamping since these functions already take care of that
+    if src_type == UNSIGNED and src_norm and src_size == 8 and dst_channel.type == FLOAT and dst_channel.size == 32:
+        return 'ubyte_to_float(%s)' % value
+    if src_type == FLOAT and src_type == 32 and dst_channel.type == UNSIGNED and dst_channel.norm and dst_channel.size == 8:
+        return 'float_to_ubyte(%s)' % value
+
     if clamp:
         if dst_channel.type != FLOAT or src_type != FLOAT:
             value = clamp_expr(src_channel, dst_channel, dst_native_type, value)