[Mesa-dev] [PATCH 1.2/8 v2] spirv: Generate spirv_info.c
Ian Romanick
idr at freedesktop.org
Mon Jul 17 19:31:06 UTC 2017
From: Ian Romanick <ian.d.romanick at 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.romanick at intel.com>
Suggested-by: Jason Ekstrand <jason at 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
More information about the mesa-dev
mailing list