On Jun 7, 2016 5:32 PM, "Dylan Baker" <dy...@pnwbakers.com> wrote: > > This replaces the current bash generator with a python based generator > using mako. It's quite fast and works with both python 2.7 and python > 3.5, and should work with 3.3+ and maybe even 3.2. > > It produces an almost identical file except for a minor layout changes, > and the addition of a "generated file, do not edit" warning. > > Signed-off-by: Dylan Baker <dylanx.c.ba...@intel.com> > --- > src/intel/isl/Makefile.am | 7 +- > src/intel/isl/gen_format_layout.c.mako | 77 +++++++++++++++++ > src/intel/isl/gen_format_layout.py | 143 +++++++++++++++++++++++++++++++ > src/intel/isl/isl_format_layout_gen.bash | 129 ---------------------------- > 4 files changed, 224 insertions(+), 132 deletions(-) > create mode 100644 src/intel/isl/gen_format_layout.c.mako > create mode 100644 src/intel/isl/gen_format_layout.py > delete mode 100755 src/intel/isl/isl_format_layout_gen.bash > > diff --git a/src/intel/isl/Makefile.am b/src/intel/isl/Makefile.am > index 74f863a..ee75bbd 100644 > --- a/src/intel/isl/Makefile.am > +++ b/src/intel/isl/Makefile.am > @@ -66,10 +66,11 @@ libisl_gen9_la_CFLAGS = $(libisl_la_CFLAGS) -DGEN_VERSIONx10=90 > > BUILT_SOURCES = $(ISL_GENERATED_FILES) > > -isl_format_layout.c: isl_format_layout_gen.bash \ > +isl_format_layout.c: gen_format_layout.py \ > + gen_format_layout.c.mako \ > isl_format_layout.csv > - $(AM_V_GEN)$(srcdir)/isl_format_layout_gen.bash \ > - <$(srcdir)/isl_format_layout.csv >$@ > + $(PYTHON_GEN) $(AM_V_GEN)$(srcdir)/gen_format_layout.py \ > + <$(srcdir)/isl_format_layout.csv > > # ---------------------------------------------------------------------------- > # Tests > diff --git a/src/intel/isl/gen_format_layout.c.mako b/src/intel/isl/gen_format_layout.c.mako
I made this comment in the office today but I think the mako here is simple enough that we might be better off just putting it all in one file. > new file mode 100644 > index 0000000..241a923 > --- /dev/null > +++ b/src/intel/isl/gen_format_layout.c.mako > @@ -0,0 +1,77 @@ > +## encoding=utf-8 > +## Copyright © 2016 Intel Corporation > +## > +## 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. > +## > +## This is the mako template companion to gen_format_layout.py > +## > +/* This file is autogenerated by gen_format_layout.{c.mako,py}. DO NOT EDIT! */ > + > +/* > + * Copyright 2015 Intel Corporation > + * > + * 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 (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 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. > + */ > + > +#include "isl.h" > + > +const struct isl_format_layout > +isl_format_layouts[] = { > +% for format in formats: > + [ISL_FORMAT_${format.name}] = { > + .format = ISL_FORMAT_${format.name}, > + .name = "ISL_FORMAT_${format.name}", > + .bs = ${format.bs}, > + .bw = ${format.bw}, > + .bh = ${format.bh}, > + .bd = ${format.bd}, > + .channels = { > + % for mask in ['r', 'g', 'b', 'a', 'l', 'i', 'p']: > + <% channel = getattr(format, mask, None) %>\ > + % if channel.type is not None: > + .${mask} = { ISL_${channel.type}, ${channel.size} }, > + % else: > + .${mask} = {}, > + % endif > + % endfor > + }, > + .colorspace = ISL_COLORSPACE_${format.colorspace}, > + .txc = ISL_TXC_${format.txc}, > + }, > + > +% endfor > +}; > + > diff --git a/src/intel/isl/gen_format_layout.py b/src/intel/isl/gen_format_layout.py > new file mode 100644 > index 0000000..314e4ca > --- /dev/null > +++ b/src/intel/isl/gen_format_layout.py > @@ -0,0 +1,143 @@ > +# encoding=utf-8 > +# Copyright © 2016 Intel Corporation > + > +# 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. > + > +"""Generates isl_format_layout.c.""" > + > +from __future__ import ( > + absolute_import, division, print_function, unicode_literals > +) > +import csv > +import re > + > +from mako import template > + > +# Load the template, ensure that __future__.division is imported, and set the > +# bytes encoding to be utf-8. This last bit is important to getting simple > +# consistent behavior for python 3 when we get there. > +TEMPLATE = template.Template(filename="gen_format_layout.c.mako", > + future_imports=['division'], > + output_encoding='utf-8') > + > + > +class Channel(object): > + """Class representing a Channel. > + > + Converts the csv encoded data into the format that the template (and thus > + the consuming C code) expects. > + > + """ > + # If the csv file grew very large this class could be put behind a factory > + # to increase efficiency. Right now though it's fast enough that It didn't > + # seem worthwhile to add all of the boilerplate > + _types = { > + 'x': 'void', > + 'r': 'raw', > + 'un': 'unorm', > + 'sn': 'snorm', > + 'uf': 'ufloat', > + 'sf': 'sfloat', > + 'ux': 'ufixed', > + 'sx': 'sfixed', > + 'ui': 'uint', > + 'si': 'sint', > + 'us': 'uscaled', > + 'ss': 'sscaled', > + } > + _splitter = re.compile(r'\s*(?P<type>[a-z]+)(?P<size>[0-9]+)') > + > + def __init__(self, line): > + # If the line is just whitespace then just set everything to None to > + # save on the regex cost and let the template skip on None. > + if line.isspace(): > + self.size = None > + self.type = None > + else: > + grouped = self._splitter.match(line) > + self.type = self._types[grouped.group('type')].upper() > + self.size = grouped.group('size') > + > + > +class Format(object): > + """Class taht contains all values needed by the template.""" > + def __init__(self, line): > + # pylint: disable=invalid-name > + self.name = line[0].strip() > + > + # Future division makes this work in python 2. > + self.bs = int(line[1]) // 8 > + self.bw = line[2].strip() > + self.bh = line[3].strip() > + self.bd = line[4].strip() > + self.r = Channel(line[5]) > + self.g = Channel(line[6]) > + self.b = Channel(line[7]) > + self.a = Channel(line[8]) > + self.l = Channel(line[9]) > + self.i = Channel(line[10]) > + self.p = Channel(line[11]) > + > + # alpha doesn't have a colorspace of it's own. > + self.colorspace = line[12].strip().upper() > + if self.colorspace in ['', 'ALPHA']: > + self.colorspace = 'NONE' > + > + # This sets it to the line value, or if it's an empty string 'NONE' > + self.txc = line[13].strip().upper() or 'NONE' > + > + > +def reader(): > + """Wrapper around csv.reader that skips comments and blanks.""" > + # csv.reader actually reads the file one line at a time (it was designed to > + # open excel generated sheets), so hold the file until all of the lines are > + # read. > + with open('isl_format_layout.csv', 'r') as f: I'm not so sure this works. It's probably better to pass the file name in. Maybe this is safe but I'm skeptical. Other than those two comments, this seems perfectly reasonable. > + for line in csv.reader(f): > + if line and not line[0].startswith('#'): > + yield line > + > + > +def main(): > + """Main function.""" > + # This generator opens and writes the file itself, and it does so in bytes > + # mode. This solves both python 2 vs 3 problems and solves the locale > + # problem: Unicode can be rendered even if the shell calling this script > + # doesn't. > + with open('isl_format_layout.c', 'wb') as f: > + 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()))) > + 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 > + # status 1, if python is run with debug; otherwise it just raises > + # the exception > + if __debug__: > + import sys > + from mako import exceptions > + print(exceptions.text_error_template().render(), > + file=sys.stderr) > + sys.exit(1) > + raise > + > + > +if __name__ == '__main__': > + main() > diff --git a/src/intel/isl/isl_format_layout_gen.bash b/src/intel/isl/isl_format_layout_gen.bash > deleted file mode 100755 > index e20da55..0000000 > --- a/src/intel/isl/isl_format_layout_gen.bash > +++ /dev/null > @@ -1,129 +0,0 @@ > -#!/usr/bin/env bash > -# > -# Copyright 2015 Intel Corporation > -# > -# 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 (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 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. > - > -set -eu > -set -o pipefail > - > -cat <<'EOF' > -/* > - * Copyright 2015 Intel Corporation > - * > - * 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 (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 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. > - */ > - > -#include "isl.h" > - > -const struct isl_format_layout > -isl_format_layouts[] = { > -EOF > - > -sed -r ' > -# Delete comment lines and empty lines > -/^[[:space:]]*#/d > -/^[[:space:]]*$/d > - > -# Delete spaces > -s/[[:space:]]//g > - > -# Translate formats > -s/^([A-Za-z0-9_]+),*/ISL_FORMAT_\1,/ > - > -# Translate data type of channels > -s/\<x([0-9]+),/ISL_VOID@\1,/g > -s/\<r([0-9]+),/ISL_RAW@\1,/g > -s/\<un([0-9]+),/ISL_UNORM@\1,/g > -s/\<sn([0-9]+),/ISL_SNORM@\1,/g > -s/\<uf([0-9]+),/ISL_UFLOAT@\1,/g > -s/\<sf([0-9]+),/ISL_SFLOAT@\1,/g > -s/\<ux([0-9]+),/ISL_UFIXED@\1,/g > -s/\<sx([0-9]+),/ISL_SFIXED@\1,/g > -s/\<ui([0-9]+),/ISL_UINT@\1,/g > -s/\<si([0-9]+),/ISL_SINT@\1,/g > -s/\<us([0-9]+),/ISL_USCALED@\1,/g > -s/\<ss([0-9]+),/ISL_SSCALED@\1,/g > - > -# Translate colorspaces > -# Interpret alpha-only formats as having no colorspace. > -s/\<(linear|srgb|yuv)\>/ISL_COLORSPACE_\1/ > -s/\<alpha\>// > - > -# Translate texture compression > -s/\<(dxt|fxt|rgtc|bptc|etc|astc)([0-9]*)\>/ISL_TXC_\1\2/ > -' | > -tr 'a-z' 'A-Z' | # Convert to uppersace > -while IFS=, read -r format bpb bw bh bd \ > - red green blue alpha \ > - luminance intensity palette \ > - colorspace txc > -do > - : ${colorspace:=ISL_COLORSPACE_NONE} > - : ${txc:=ISL_TXC_NONE} > - > - cat <<EOF > - [$format] = { > - .format = $format, > - .name = "$format", > - .bs = $((bpb/8)), > - .bw = $bw, .bh = $bh, .bd = $bd, > - .channels = { > - .r = { $red }, > - .g = { $green }, > - .b = { $blue }, > - .a = { $alpha }, > - .l = { $luminance }, > - .i = { $intensity }, > - .p = { $palette }, > - }, > - .colorspace = $colorspace, > - .txc = $txc, > - }, > - > -EOF > -done | > -sed -r ' > -# Collapse empty channels > -s/\{ \}/{}/ > - > -# Split non-empty channels into two members: base type and bit size > -s/@/, / > -' > - > -# Terminate the table > -printf '};\n' > -- > 2.8.3 > > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev