Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net> On Mon, Jul 17, 2017 at 12:31 PM, Ian Romanick <i...@freedesktop.org> wrote:
> From: Ian Romanick <ian.d.roman...@intel.com> > > The old table based spirv_*_to_string functions would return NULL for > any values "inside" the table that didn't have entries. The tables also > needed to be updated by hand each time a new spirv.h was imported. > Generate the file instead. > > v2: Make this script work more like src/mesa/main/format_fallback.py. > Suggested by Jason. Remove SCons supports. Suggested by Jason and > Emil. Put all the build work in Makefile.nir.am in lieu of adding a new > Makefile.spirv.am. Suggested by Emil. Add support for Android builds > based on code provided by Emil. > > Signed-off-by: Ian Romanick <ian.d.roman...@intel.com> > Suggested-by: Jason Ekstrand <ja...@jlekstrand.net> > --- > src/compiler/Android.nir.gen.mk | 7 ++ > src/compiler/Makefile.nir.am | 16 +++- > src/compiler/Makefile.sources | 4 +- > src/compiler/spirv/spirv_info.c | 156 ------------------------------ > ------- > src/compiler/spirv/spirv_info_c.py | 82 +++++++++++++++++++ > 5 files changed, 106 insertions(+), 159 deletions(-) > delete mode 100644 src/compiler/spirv/spirv_info.c > create mode 100644 src/compiler/spirv/spirv_info_c.py > > diff --git a/src/compiler/Android.nir.gen.mk b/src/compiler/Android.nir. > gen.mk > index 908875d..4507ac4 100644 > --- a/src/compiler/Android.nir.gen.mk > +++ b/src/compiler/Android.nir.gen.mk > @@ -94,3 +94,10 @@ nir_opt_algebraic_deps := \ > $(intermediates)/nir/nir_opt_algebraic.c: $(nir_opt_algebraic_deps) > @mkdir -p $(dir $@) > $(hide) $(MESA_PYTHON2) $(nir_opt_algebraic_gen) $< > $@ > + > +LOCAL_GENERATED_SOURCES += $(addprefix $(intermediates)/, \ > + $(SPIRV_GENERATED_FILES)) > + > +$(intermediates)/spirv/spirv_info.c: $(LOCAL_PATH)/spirv/spirv_info_c.py > $(LOCAL_PATH)/spirv/spirv.core.grammar.json > + @mkdir -p $(dir $@) > + $(hide) $(MESA_PYTHON2) $(LOCAL_PATH)/spirv/spirv_info_c.py > $(LOCAL_PATH)/spirv/spirv.core.grammar.json $@ || ($(RM) $@; false) > diff --git a/src/compiler/Makefile.nir.am b/src/compiler/Makefile.nir.am > index 13f02a7..1533ee5 100644 > --- a/src/compiler/Makefile.nir.am > +++ b/src/compiler/Makefile.nir.am > @@ -29,6 +29,7 @@ nir_libnir_la_LIBADD = \ > nir_libnir_la_SOURCES = \ > $(NIR_FILES) \ > $(SPIRV_FILES) \ > + $(SPIRV_GENERATED_FILES) \ > $(NIR_GENERATED_FILES) > > nir/nir_builder_opcodes.h: nir/nir_opcodes.py nir/nir_builder_opcodes_h.py > @@ -51,6 +52,10 @@ nir/nir_opt_algebraic.c: nir/nir_opt_algebraic.py > nir/nir_algebraic.py > $(MKDIR_GEN) > $(PYTHON_GEN) $(srcdir)/nir/nir_opt_algebraic.py > $@ || ($(RM) > $@; false) > > +spirv/spirv_info.c: spirv/spirv_info_c.py spirv/spirv.core.grammar.json > + $(MKDIR_GEN) > + $(PYTHON_GEN) $(srcdir)/spirv/spirv_info_c.py > $(srcdir)/spirv/spirv.core.grammar.json $@ || ($(RM) $@; false) > + > noinst_PROGRAMS += spirv2nir > > spirv2nir_SOURCES = \ > @@ -91,8 +96,13 @@ nir_tests_control_flow_tests_LDADD = \ > TESTS += nir/tests/control_flow_tests > > > -BUILT_SOURCES += $(NIR_GENERATED_FILES) > -CLEANFILES += $(NIR_GENERATED_FILES) > +BUILT_SOURCES += \ > + $(NIR_GENERATED_FILES) \ > + $(SPIRV_GENERATED_FILES) > + > +CLEANFILES += \ > + $(NIR_GENERATED_FILES) \ > + $(SPIRV_GENERATED_FILES) > > EXTRA_DIST += \ > nir/nir_algebraic.py \ > @@ -104,4 +114,6 @@ EXTRA_DIST += \ > nir/nir_opt_algebraic.py \ > nir/tests \ > nir/README \ > + spirv/spirv_info_c.py \ > + spirv/spirv.core.grammar.json \ > SConscript.nir > diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources > index d3447fb..785782b 100644 > --- a/src/compiler/Makefile.sources > +++ b/src/compiler/Makefile.sources > @@ -277,12 +277,14 @@ NIR_FILES = \ > nir/nir_worklist.c \ > nir/nir_worklist.h > > +SPIRV_GENERATED_FILES = \ > + spirv/spirv_info.c > + > SPIRV_FILES = \ > spirv/GLSL.std.450.h \ > spirv/nir_spirv.h \ > spirv/spirv.h \ > spirv/spirv_info.h \ > - spirv/spirv_info.c \ > spirv/spirv_to_nir.c \ > spirv/vtn_alu.c \ > spirv/vtn_cfg.c \ > diff --git a/src/compiler/spirv/spirv_info.c b/src/compiler/spirv/spirv_ > info.c > deleted file mode 100644 > index 1036b41..0000000 > --- a/src/compiler/spirv/spirv_info.c > +++ /dev/null > @@ -1,156 +0,0 @@ > -/* > - * 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 (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 "spirv_info.h" > -#include "util/macros.h" > - > -#define CAPABILITY(cap) [SpvCapability##cap] = #cap > -static const char * const capability_to_string[] = { > - CAPABILITY(Matrix), > - CAPABILITY(Shader), > - CAPABILITY(Geometry), > - CAPABILITY(Tessellation), > - CAPABILITY(Addresses), > - CAPABILITY(Linkage), > - CAPABILITY(Kernel), > - CAPABILITY(Vector16), > - CAPABILITY(Float16Buffer), > - CAPABILITY(Float16), > - CAPABILITY(Float64), > - CAPABILITY(Int64), > - CAPABILITY(Int64Atomics), > - CAPABILITY(ImageBasic), > - CAPABILITY(ImageReadWrite), > - CAPABILITY(ImageMipmap), > - CAPABILITY(Pipes), > - CAPABILITY(Groups), > - CAPABILITY(DeviceEnqueue), > - CAPABILITY(LiteralSampler), > - CAPABILITY(AtomicStorage), > - CAPABILITY(Int16), > - CAPABILITY(TessellationPointSize), > - CAPABILITY(GeometryPointSize), > - CAPABILITY(ImageGatherExtended), > - CAPABILITY(StorageImageMultisample), > - CAPABILITY(UniformBufferArrayDynamicIndexing), > - CAPABILITY(SampledImageArrayDynamicIndexing), > - CAPABILITY(StorageBufferArrayDynamicIndexing), > - CAPABILITY(StorageImageArrayDynamicIndexing), > - CAPABILITY(ClipDistance), > - CAPABILITY(CullDistance), > - CAPABILITY(ImageCubeArray), > - CAPABILITY(SampleRateShading), > - CAPABILITY(ImageRect), > - CAPABILITY(SampledRect), > - CAPABILITY(GenericPointer), > - CAPABILITY(Int8), > - CAPABILITY(InputAttachment), > - CAPABILITY(SparseResidency), > - CAPABILITY(MinLod), > - CAPABILITY(Sampled1D), > - CAPABILITY(Image1D), > - CAPABILITY(SampledCubeArray), > - CAPABILITY(SampledBuffer), > - CAPABILITY(ImageBuffer), > - CAPABILITY(ImageMSArray), > - CAPABILITY(StorageImageExtendedFormats), > - CAPABILITY(ImageQuery), > - CAPABILITY(DerivativeControl), > - CAPABILITY(InterpolationFunction), > - CAPABILITY(TransformFeedback), > - CAPABILITY(GeometryStreams), > - CAPABILITY(StorageImageReadWithoutFormat), > - CAPABILITY(StorageImageWriteWithoutFormat), > - CAPABILITY(MultiViewport), > - CAPABILITY(SubgroupDispatch), > - CAPABILITY(NamedBarrier), > - CAPABILITY(PipeStorage), > - CAPABILITY(SubgroupBallotKHR), > - CAPABILITY(DrawParameters), > -}; > - > -const char * > -spirv_capability_to_string(SpvCapability cap) > -{ > - if (cap < ARRAY_SIZE(capability_to_string)) > - return capability_to_string[cap]; > - else > - return "unknown"; > -} > - > -#define DECORATION(dec) [SpvDecoration##dec] = #dec > -static const char * const decoration_to_string[] = { > - DECORATION(RelaxedPrecision), > - DECORATION(SpecId), > - DECORATION(Block), > - DECORATION(BufferBlock), > - DECORATION(RowMajor), > - DECORATION(ColMajor), > - DECORATION(ArrayStride), > - DECORATION(MatrixStride), > - DECORATION(GLSLShared), > - DECORATION(GLSLPacked), > - DECORATION(CPacked), > - DECORATION(BuiltIn), > - DECORATION(NoPerspective), > - DECORATION(Flat), > - DECORATION(Patch), > - DECORATION(Centroid), > - DECORATION(Sample), > - DECORATION(Invariant), > - DECORATION(Restrict), > - DECORATION(Aliased), > - DECORATION(Volatile), > - DECORATION(Constant), > - DECORATION(Coherent), > - DECORATION(NonWritable), > - DECORATION(NonReadable), > - DECORATION(Uniform), > - DECORATION(SaturatedConversion), > - DECORATION(Stream), > - DECORATION(Location), > - DECORATION(Component), > - DECORATION(Index), > - DECORATION(Binding), > - DECORATION(DescriptorSet), > - DECORATION(Offset), > - DECORATION(XfbBuffer), > - DECORATION(XfbStride), > - DECORATION(FuncParamAttr), > - DECORATION(FPRoundingMode), > - DECORATION(FPFastMathMode), > - DECORATION(LinkageAttributes), > - DECORATION(NoContraction), > - DECORATION(InputAttachmentIndex), > - DECORATION(Alignment), > - DECORATION(MaxByteOffset), > -}; > - > -const char * > -spirv_decoration_to_string(SpvDecoration dec) > -{ > - if (dec < ARRAY_SIZE(decoration_to_string)) > - return decoration_to_string[dec]; > - else > - return "unknown"; > -} > diff --git a/src/compiler/spirv/spirv_info_c.py > b/src/compiler/spirv/spirv_info_c.py > new file mode 100644 > index 0000000..c5e11df > --- /dev/null > +++ b/src/compiler/spirv/spirv_info_c.py > @@ -0,0 +1,82 @@ > +COPYRIGHT = """\ > +/* > + * Copyright (C) 2017 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. > + */ > +""" > + > +import argparse > +import json > +from sys import stdout > +from mako.template import Template > + > +def collect_data(spirv, kind): > + for x in spirv["operand_kinds"]: > + if x["kind"] == kind: > + operands = x > + break > + > + # There are some duplicate values in some of the tables (thanks > guys!), so > + # filter them out. > + last_value = -1 > + values = [] > + for x in operands["enumerants"]: > + if x["value"] != last_value: > + last_value = x["value"] > + values.append(x["enumerant"]) > + > + return (kind, values) > + > +def parse_args(): > + p = argparse.ArgumentParser() > + p.add_argument("json") > + p.add_argument("out") > + return p.parse_args() > + > +TEMPLATE = Template(COPYRIGHT + """\ > +#include "spirv_info.h" > +% for kind,values in info: > + > +const char * > +spirv_${kind.lower()}_to_string(Spv${kind} v) > +{ > + switch (v) { > + % for name in values: > + case Spv${kind}${name}: return "Spv${kind}${name}"; > + % endfor > + case Spv${kind}Max: break; /* silence warnings about unhandled enums. > */ > + } > + > + return "unknown"; > +} > +% endfor > +""") > + > +if __name__ == "__main__": > + pargs = parse_args() > + > + spirv_info = json.JSONDecoder().decode(open(pargs.json, "r").read()) > + > + capabilities = collect_data(spirv_info, "Capability") > + decorations = collect_data(spirv_info, "Decoration") > + > + with open(pargs.out, 'w') as f: > + f.write(TEMPLATE.render(info=[capabilities, decorations])) > -- > 2.9.4 > > _______________________________________________ > 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