[Mesa-dev] [PATCH v2] mesa: Add _mesa_format_fallback_rgba_to_rgbx()

Jason Ekstrand jason at jlekstrand.net
Wed Jun 28 21:50:31 UTC 2017


On Tue, Jun 20, 2017 at 4:53 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> From: Chad Versace <chadversary at chromium.org>
>
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170628/3af5ebb1/attachment-0001.html>


More information about the mesa-dev mailing list