spirv: Generate spirv_info.c

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@intel.com>
Suggested-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
This commit is contained in:
Ian Romanick 2017-07-17 12:31:06 -07:00 committed by Jason Ekstrand
parent de765ec9dc
commit 2dd4e2ece3
5 changed files with 106 additions and 159 deletions

View File

@ -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)

View File

@ -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

View File

@ -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 \

View File

@ -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";
}

View File

@ -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]))