intel/isl/format: Add an srgb_to_linear helper
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 22 Jun 2017 18:51:55 +0000 (11:51 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sun, 23 Jul 2017 03:59:22 +0000 (20:59 -0700)
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/intel/isl/gen_format_layout.py
src/intel/isl/isl.h

index aa4e2d8cb9cebe1e1afac8aaf04d8b0886889d9f..0ca42dbab8dfa9ebbb241ace37142903ff033dbe 100644 (file)
@@ -88,6 +88,19 @@ isl_format_layouts[] = {
 
 % endfor
 };
+
+enum isl_format
+isl_format_srgb_to_linear(enum isl_format format)
+{
+    switch (format) {
+% for srgb, rgb in srgb_to_linear_map:
+    case ISL_FORMAT_${srgb}:
+        return ISL_FORMAT_${rgb};
+%endfor
+    default:
+        return format;
+    }
+}
 """)
 
 
@@ -167,6 +180,34 @@ def reader(csvfile):
             if line and not line[0].startswith('#'):
                 yield line
 
+def get_srgb_to_linear_map(formats):
+    """Compute a map from sRGB to linear formats.
+
+    This function uses some probably somewhat fragile string munging to do
+    the conversion.  However, we do assert that, if it's SRGB, the munging
+    succeeded so that gives some safety.
+    """
+    names = {f.name for f in formats}
+    for fmt in formats:
+        if fmt.colorspace != 'SRGB':
+            continue
+
+        replacements = [
+            ('_SRGB',   ''),
+            ('SRGB',    'RGB'),
+            ('U8SRGB',  'FLT16'),
+        ]
+
+        found = False;
+        for rep in replacements:
+            rgb_name = fmt.name.replace(rep[0], rep[1])
+            if rgb_name in names:
+                found = True
+                yield fmt.name, rgb_name
+                break;
+
+        # We should have found a format name
+        assert found
 
 def main():
     """Main function."""
@@ -183,11 +224,14 @@ def main():
     # problem: Unicode can be rendered even if the shell calling this script
     # doesn't.
     with open(args.out, 'wb') as f:
+        formats = [Format(l) for l in reader(args.csv)]
         try:
             # This basically does lazy evaluation and initialization, which
             # saves on memory and startup overhead.
             f.write(TEMPLATE.render(
-                formats=(Format(l) for l in reader(args.csv))))
+                formats             = formats,
+                srgb_to_linear_map  = list(get_srgb_to_linear_map(formats)),
+            ))
         except Exception:
             # In the even there's an error this imports some helpers from mako
             # to print a useful stack trace and prints it, then exits with
index b9f9fb60d07ef9af2fb4f0ffff97dfbe24fb25a2..b61a0dd86199f46a3ea5c57b0eb0cbdbb1d3298f 100644 (file)
@@ -1498,6 +1498,14 @@ isl_format_block_is_1x1x1(enum isl_format fmt)
    return fmtl->bw == 1 && fmtl->bh == 1 && fmtl->bd == 1;
 }
 
+static inline bool
+isl_format_is_srgb(enum isl_format fmt)
+{
+   return isl_format_layouts[fmt].colorspace == ISL_COLORSPACE_SRGB;
+}
+
+enum isl_format isl_format_srgb_to_linear(enum isl_format fmt);
+
 static inline bool
 isl_format_is_rgb(enum isl_format fmt)
 {