diff --git a/src/compiler/Android.nir.gen.mk b/src/compiler/Android.nir.gen.mk index 908875d7eb5..4507ac4ba8c 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 13f02a7fc29..1533ee536d3 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 d3447fb9dec..785782b54d1 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 1036b41c31c..00000000000 --- 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 00000000000..c5e11dfc837 --- /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]))