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