On Tue, Jun 20, 2017 at 4:53 PM, Jason Ekstrand <[email protected]> wrote:
> From: Chad Versace <[email protected]> > > 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 > --- > src/mesa/Android.gen.mk | 12 +++++ > src/mesa/Makefile.am | 7 +++ > src/mesa/Makefile.sources | 2 + > src/mesa/main/.gitignore | 1 + > src/mesa/main/format_fallback.h | 31 ++++++++++++ > src/mesa/main/format_fallback.py | 104 ++++++++++++++++++++++++++++++ > +++++++++ > src/mesa/main/formats.h | 3 ++ > 7 files changed, 160 insertions(+) > create mode 100644 src/mesa/main/format_fallback.h > create mode 100644 src/mesa/main/format_fallback.py > > diff --git a/src/mesa/Android.gen.mk b/src/mesa/Android.gen.mk > index 366a6b1..8d24260 100644 > --- a/src/mesa/Android.gen.mk > +++ b/src/mesa/Android.gen.mk > @@ -34,6 +34,7 @@ sources := \ > main/enums.c \ > main/api_exec.c \ > main/dispatch.h \ > + main/format_fallback.c \ > main/format_pack.c \ > main/format_unpack.c \ > main/format_info.h \ > @@ -123,6 +124,17 @@ $(intermediates)/main/get_hash.h: > $(glapi)/gl_and_es_API.xml \ > $(LOCAL_PATH)/main/get_hash_params.py $(GET_HASH_GEN) > $(call es-gen) > > +FORMAT_FALLBACK := $(LOCAL_PATH)/main/format_fallback.py > +format_fallback_deps := \ > + $(LOCAL_PATH)/main/formats.csv \ > + $(LOCAL_PATH)/main/format_parser.py \ > + $(FORMAT_FALLBACK) > + > +$(intermediates)/main/format_fallback.c: PRIVATE_SCRIPT := > $(MESA_PYTHON2) $(FORMAT_FALLBACK) > +$(intermediates)/main/format_fallback.c: PRIVATE_XML := > +$(intermediates)/main/format_fallback.c: $(format_fallback_deps) > + $(call es-gen, $<) > + > FORMAT_INFO := $(LOCAL_PATH)/main/format_info.py > format_info_deps := \ > $(LOCAL_PATH)/main/formats.csv \ > diff --git a/src/mesa/Makefile.am b/src/mesa/Makefile.am > index 53f311d..97a9bbd 100644 > --- a/src/mesa/Makefile.am > +++ b/src/mesa/Makefile.am > @@ -37,6 +37,7 @@ include Makefile.sources > > EXTRA_DIST = \ > drivers/SConscript \ > + main/format_fallback.py \ > main/format_info.py \ > main/format_pack.py \ > main/format_parser.py \ > @@ -54,6 +55,7 @@ EXTRA_DIST = \ > > BUILT_SOURCES = \ > main/get_hash.h \ > + main/format_fallback.c \ > main/format_info.h \ > main/format_pack.c \ > main/format_unpack.c \ > @@ -70,6 +72,11 @@ main/get_hash.h: ../mapi/glapi/gen/gl_and_es_API.xml > main/get_hash_params.py \ > $(PYTHON_GEN) $(srcdir)/main/get_hash_generator.py \ > -f $(srcdir)/../mapi/glapi/gen/gl_and_es_API.xml > $@ > > +main/format_fallback.c: main/format_fallback.py \ > + main/format_parser.py \ > + main/formats.csv > + $(PYTHON_GEN) $(srcdir)/main/format_fallback.py > $(srcdir)/main/formats.csv $@ > + > main/format_info.h: main/formats.csv \ > main/format_parser.py main/format_info.py > $(PYTHON_GEN) $(srcdir)/main/format_info.py > $(srcdir)/main/formats.csv > $@ > diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources > index b80882f..3756e33 100644 > --- a/src/mesa/Makefile.sources > +++ b/src/mesa/Makefile.sources > @@ -94,6 +94,8 @@ MAIN_FILES = \ > main/ffvertex_prog.h \ > main/fog.c \ > main/fog.h \ > + main/format_fallback.h \ > + main/format_fallback.c \ > main/format_info.h \ > main/format_pack.h \ > main/format_pack.c \ > diff --git a/src/mesa/main/.gitignore b/src/mesa/main/.gitignore > index 836d8f1..8cc33cf 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.h b/src/mesa/main/format_ > fallback.h > new file mode 100644 > index 0000000..5ca8269 > --- /dev/null > +++ b/src/mesa/main/format_fallback.h > @@ -0,0 +1,31 @@ > +/* > + * 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, > sublicense, > + * 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 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 NONINFRINGEMENT. IN NO EVENT > SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS 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. > + */ > + > +#ifndef FORMAT_FALLBACK_H > +#define FORMAT_FALLBACK_H > + > +#include "formats.h" > + > +mesa_format > +_mesa_format_fallback_rgbx_to_rgba(mesa_format format); > Whoever merges this, should make sure this extra header gets dropped. > + > +#endif /* FORMAT_FALLBACK_H */ > diff --git a/src/mesa/main/format_fallback.py b/src/mesa/main/format_ > fallback.py > new file mode 100644 > index 0000000..b12f2ab > --- /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_get_rgbx_format_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 b88466f..12790df 100644 > --- a/src/mesa/main/formats.h > +++ b/src/mesa/main/formats.h > @@ -749,6 +749,9 @@ extern mesa_format > _mesa_get_srgb_format_linear(mesa_format format); > > extern mesa_format > +_mesa_get_rgbx_format_rgba(mesa_format format); > + > +extern mesa_format > _mesa_get_uncompressed_format(mesa_format format); > > extern GLuint > -- > 2.5.0.400.gff86faf > >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
