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:
parent
de765ec9dc
commit
2dd4e2ece3
|
@ -94,3 +94,10 @@ nir_opt_algebraic_deps := \
|
||||||
$(intermediates)/nir/nir_opt_algebraic.c: $(nir_opt_algebraic_deps)
|
$(intermediates)/nir/nir_opt_algebraic.c: $(nir_opt_algebraic_deps)
|
||||||
@mkdir -p $(dir $@)
|
@mkdir -p $(dir $@)
|
||||||
$(hide) $(MESA_PYTHON2) $(nir_opt_algebraic_gen) $< > $@
|
$(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)
|
||||||
|
|
|
@ -29,6 +29,7 @@ nir_libnir_la_LIBADD = \
|
||||||
nir_libnir_la_SOURCES = \
|
nir_libnir_la_SOURCES = \
|
||||||
$(NIR_FILES) \
|
$(NIR_FILES) \
|
||||||
$(SPIRV_FILES) \
|
$(SPIRV_FILES) \
|
||||||
|
$(SPIRV_GENERATED_FILES) \
|
||||||
$(NIR_GENERATED_FILES)
|
$(NIR_GENERATED_FILES)
|
||||||
|
|
||||||
nir/nir_builder_opcodes.h: nir/nir_opcodes.py nir/nir_builder_opcodes_h.py
|
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)
|
$(MKDIR_GEN)
|
||||||
$(PYTHON_GEN) $(srcdir)/nir/nir_opt_algebraic.py > $@ || ($(RM) $@; false)
|
$(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
|
noinst_PROGRAMS += spirv2nir
|
||||||
|
|
||||||
spirv2nir_SOURCES = \
|
spirv2nir_SOURCES = \
|
||||||
|
@ -91,8 +96,13 @@ nir_tests_control_flow_tests_LDADD = \
|
||||||
TESTS += nir/tests/control_flow_tests
|
TESTS += nir/tests/control_flow_tests
|
||||||
|
|
||||||
|
|
||||||
BUILT_SOURCES += $(NIR_GENERATED_FILES)
|
BUILT_SOURCES += \
|
||||||
CLEANFILES += $(NIR_GENERATED_FILES)
|
$(NIR_GENERATED_FILES) \
|
||||||
|
$(SPIRV_GENERATED_FILES)
|
||||||
|
|
||||||
|
CLEANFILES += \
|
||||||
|
$(NIR_GENERATED_FILES) \
|
||||||
|
$(SPIRV_GENERATED_FILES)
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
nir/nir_algebraic.py \
|
nir/nir_algebraic.py \
|
||||||
|
@ -104,4 +114,6 @@ EXTRA_DIST += \
|
||||||
nir/nir_opt_algebraic.py \
|
nir/nir_opt_algebraic.py \
|
||||||
nir/tests \
|
nir/tests \
|
||||||
nir/README \
|
nir/README \
|
||||||
|
spirv/spirv_info_c.py \
|
||||||
|
spirv/spirv.core.grammar.json \
|
||||||
SConscript.nir
|
SConscript.nir
|
||||||
|
|
|
@ -277,12 +277,14 @@ NIR_FILES = \
|
||||||
nir/nir_worklist.c \
|
nir/nir_worklist.c \
|
||||||
nir/nir_worklist.h
|
nir/nir_worklist.h
|
||||||
|
|
||||||
|
SPIRV_GENERATED_FILES = \
|
||||||
|
spirv/spirv_info.c
|
||||||
|
|
||||||
SPIRV_FILES = \
|
SPIRV_FILES = \
|
||||||
spirv/GLSL.std.450.h \
|
spirv/GLSL.std.450.h \
|
||||||
spirv/nir_spirv.h \
|
spirv/nir_spirv.h \
|
||||||
spirv/spirv.h \
|
spirv/spirv.h \
|
||||||
spirv/spirv_info.h \
|
spirv/spirv_info.h \
|
||||||
spirv/spirv_info.c \
|
|
||||||
spirv/spirv_to_nir.c \
|
spirv/spirv_to_nir.c \
|
||||||
spirv/vtn_alu.c \
|
spirv/vtn_alu.c \
|
||||||
spirv/vtn_cfg.c \
|
spirv/vtn_cfg.c \
|
||||||
|
|
|
@ -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";
|
|
||||||
}
|
|
|
@ -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]))
|
Loading…
Reference in New Issue