diff options
author | Chad Versace <[email protected]> | 2017-06-20 16:53:36 -0700 |
---|---|---|
committer | Chad Versace <[email protected]> | 2017-06-27 16:56:28 -0700 |
commit | a1983223d8839a0c9f5ca5aaf305ca6d2e01860b (patch) | |
tree | 514e67fd002ed15351dc746a0ff17c5df772d596 /src/mesa/main | |
parent | 4a10d6154e1a6086e1eecf0e17ab63cc41862ea6 (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/.gitignore | 1 | ||||
-rw-r--r-- | src/mesa/main/format_fallback.py | 104 | ||||
-rw-r--r-- | src/mesa/main/formats.h | 3 |
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 |