summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorChad Versace <[email protected]>2017-06-20 16:53:36 -0700
committerChad Versace <[email protected]>2017-06-27 16:56:28 -0700
commita1983223d8839a0c9f5ca5aaf305ca6d2e01860b (patch)
tree514e67fd002ed15351dc746a0ff17c5df772d596 /src/mesa/main
parent4a10d6154e1a6086e1eecf0e17ab63cc41862ea6 (diff)
mesa: Add _mesa_format_fallback_rgbx_to_rgba() [v2]
The new function takes a mesa_format and, if the format is an alpha format with a non-alpha variant, returns the non-alpha format. Otherwise, it returns the original format. Example: input -> output // Fallback exists MESA_FORMAT_R8G8B8X8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM MESA_FORMAT_RGBX_UNORM16 -> MESA_FORMAT_RGBA_UNORM16 // No fallback MESA_FORMAT_R8G8B8A8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM MESA_FORMAT_Z_FLOAT32 -> MESA_FORMAT_Z_FLOAT32 i965 will use this for EGLImages and DRIimages. v2 (Jason Ekstrand): - Use mako - Rework to be easier to read - Write directly to the output file Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/.gitignore1
-rw-r--r--src/mesa/main/format_fallback.py104
-rw-r--r--src/mesa/main/formats.h3
3 files changed, 108 insertions, 0 deletions
diff --git a/src/mesa/main/.gitignore b/src/mesa/main/.gitignore
index 836d8f104a8..8cc33cfee68 100644
--- a/src/mesa/main/.gitignore
+++ b/src/mesa/main/.gitignore
@@ -4,6 +4,7 @@ enums.c
remap_helper.h
get_hash.h
get_hash.h.tmp
+format_fallback.c
format_info.h
format_info.c
format_pack.c
diff --git a/src/mesa/main/format_fallback.py b/src/mesa/main/format_fallback.py
new file mode 100644
index 00000000000..e3b9916f6ee
--- /dev/null
+++ b/src/mesa/main/format_fallback.py
@@ -0,0 +1,104 @@
+COPYRIGHT = """\
+/*
+ * Copyright 2017 Google
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+"""
+
+# stdlib
+import argparse
+from sys import stdout
+from mako.template import Template
+
+# local
+import format_parser
+
+def parse_args():
+ p = argparse.ArgumentParser()
+ p.add_argument("csv")
+ p.add_argument("out")
+ return p.parse_args()
+
+def get_rgbx_to_rgba_map(formats):
+ names = {fmt.name for fmt in formats}
+
+ for fmt in formats:
+ if not fmt.has_channel('r') or not fmt.has_channel('x'):
+ continue
+
+ # The condition above will still let MESA_FORMAT_R9G9B9E5_FLOAT
+ # through. We need to ensure it actually has an X in the name.
+ if not 'X' in fmt.name:
+ continue
+
+ rgbx_name = fmt.name
+ rgba_name = rgbx_name.replace("X", "A")
+ if rgba_name not in names:
+ continue;
+
+ yield rgbx_name, rgba_name
+
+TEMPLATE = Template(COPYRIGHT + """
+#include "formats.h"
+
+/**
+ * If the format has an alpha channel, and there exists a non-alpha
+ * variant of the format with an identical bit layout, then return
+ * the non-alpha format. Otherwise return the original format.
+ *
+ * Examples:
+ * Fallback exists:
+ * MESA_FORMAT_R8G8B8X8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM
+ * MESA_FORMAT_RGBX_UNORM16 -> MESA_FORMAT_RGBA_UNORM16
+ *
+ * No fallback:
+ * MESA_FORMAT_R8G8B8A8_UNORM -> MESA_FORMAT_R8G8B8A8_UNORM
+ * MESA_FORMAT_Z_FLOAT32 -> MESA_FORMAT_Z_FLOAT32
+ */
+mesa_format
+_mesa_format_fallback_rgbx_to_rgba(mesa_format format)
+{
+ switch (format) {
+%for rgbx, rgba in rgbx_to_rgba_map:
+ case ${rgbx}:
+ return ${rgba};
+%endfor
+ default:
+ return format;
+ }
+}
+""");
+
+def main():
+ pargs = parse_args()
+
+ formats = list(format_parser.parse(pargs.csv))
+
+ template_env = {
+ 'rgbx_to_rgba_map': list(get_rgbx_to_rgba_map(formats)),
+ }
+
+ with open(pargs.out, 'w') as f:
+ f.write(TEMPLATE.render(**template_env))
+
+if __name__ == "__main__":
+ main()
diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
index b88466f0368..62b5e0c1a7e 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -762,6 +762,9 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
GLenum format, GLenum type,
GLboolean swapBytes, GLenum *error);
+mesa_format
+_mesa_format_fallback_rgbx_to_rgba(mesa_format format);
+
#ifdef __cplusplus
}
#endif