SpvBuiltInViewIndex})},
})), );
+// SPV_AMD_gcn_shader
+
+#define PREAMBLE "%1 = OpExtInstImport \"SPV_AMD_gcn_shader\"\n"
+INSTANTIATE_TEST_CASE_P(
+ SPV_AMD_gcn_shader, ExtensionRoundTripTest,
+ // We'll get coverage over operand tables by trying the universal
+ // environments, and at least one specific environment.
+ Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1,
+ SPV_ENV_VULKAN_1_0),
+ ValuesIn(std::vector<AssemblyCase>{
+ {PREAMBLE "%3 = OpExtInst %2 %1 CubeFaceCoordAMD %4\n",
+ Concatenate({MakeInstruction(SpvOpExtInstImport, {1},
+ MakeVector("SPV_AMD_gcn_shader")),
+ MakeInstruction(SpvOpExtInst, {2, 3, 1, 2, 4})})},
+ {PREAMBLE "%3 = OpExtInst %2 %1 CubeFaceIndexAMD %4\n",
+ Concatenate({MakeInstruction(SpvOpExtInstImport, {1},
+ MakeVector("SPV_AMD_gcn_shader")),
+ MakeInstruction(SpvOpExtInst, {2, 3, 1, 1, 4})})},
+ {PREAMBLE "%3 = OpExtInst %2 %1 TimeAMD\n",
+ Concatenate({MakeInstruction(SpvOpExtInstImport, {1},
+ MakeVector("SPV_AMD_gcn_shader")),
+ MakeInstruction(SpvOpExtInst, {2, 3, 1, 3})})},
+ })), );
+#undef PREAMBLE
+
} // anonymous namespace
# Prefix for all C variables generated by this script.
PYGEN_VARIABLE_PREFIX = 'pygen_variable'
+# Extensions to recognize, but which don't come from the SPIRV-V core grammar.
+NONSTANDARD_EXTENSIONS = ['SPV_AMD_gcn_shader',]
+
def make_path_to_file(f):
"""Makes all ancestor directories to the given file, if they
don't yet exist.
extensions = sum([item.get('extensions', []) for item in enumerants
if item.get('extensions')], [])
+ extensions.extend(NONSTANDARD_EXTENSIONS)
+
return sorted(set(extensions))
import argparse
parser = argparse.ArgumentParser(description='Generate SPIR-V info tables')
parser.add_argument('--spirv-core-grammar', metavar='<path>',
- type=str, required=True,
+ type=str, required=False,
help='input JSON grammar file for core SPIR-V '
'instructions')
parser.add_argument('--extinst-glsl-grammar', metavar='<path>',
'instruction set')
parser.add_argument('--extinst-opencl-grammar', metavar='<path>',
type=str, required=False, default=None,
- help='input JSON grammar file for OpenGL extended '
+ help='input JSON grammar file for OpenCL extended '
'instruction set')
parser.add_argument('--core-insts-output', metavar='<path>',
type=str, required=False, default=None,
parser.add_argument('--enum-string-mapping-output', metavar='<path>',
type=str, required=False, default=None,
help='output file for enum-string mappings')
+ parser.add_argument('--extinst-vendor-grammar', metavar='<path>',
+ type=str, required=False, default=None,
+ help='input JSON grammar file for vendor extended '
+ 'instruction set'),
+ parser.add_argument('--vendor-insts-output', metavar='<path>',
+ type=str, required=False, default=None,
+ help='output file for vendor extended instruction set')
args = parser.parse_args()
if (args.core_insts_output is None) != \
print('error: --opencl-insts-output and --extinst-opencl-grammar '
'should be specified together.')
exit(1)
+ if (args.vendor_insts_output is None) != \
+ (args.extinst_vendor_grammar is None):
+ print('error: --vendor-insts-output and '
+ '--extinst-vendor-grammar should be specified together.')
+ exit(1)
if all([args.core_insts_output is None,
args.glsl_insts_output is None,
args.opencl_insts_output is None,
+ args.vendor_insts_output is None,
args.extension_enum_output is None,
args.enum_string_mapping_output is None]):
print('error: at least one output should be specified.')
exit(1)
- with open(args.spirv_core_grammar) as json_file:
- grammar = json.loads(json_file.read())
- if args.core_insts_output is not None:
- make_path_to_file(args.core_insts_output)
- make_path_to_file(args.operand_kinds_output)
- print(generate_instruction_table(grammar['instructions'], False),
- file=open(args.core_insts_output, 'w'))
- print(generate_operand_kind_table(grammar['operand_kinds']),
- file=open(args.operand_kinds_output, 'w'))
- if args.extension_enum_output is not None:
- make_path_to_file(args.extension_enum_output)
- print(generate_extension_enum(grammar['operand_kinds']),
- file=open(args.extension_enum_output, 'w'))
- if args.enum_string_mapping_output is not None:
- make_path_to_file(args.enum_string_mapping_output)
- print(generate_all_string_enum_mappings(
- grammar['operand_kinds']),
- file=open(args.enum_string_mapping_output, 'w'))
+ if args.spirv_core_grammar is not None:
+ with open(args.spirv_core_grammar) as json_file:
+ grammar = json.loads(json_file.read())
+ if args.core_insts_output is not None:
+ make_path_to_file(args.core_insts_output)
+ make_path_to_file(args.operand_kinds_output)
+ print(generate_instruction_table(grammar['instructions'], False),
+ file=open(args.core_insts_output, 'w'))
+ print(generate_operand_kind_table(grammar['operand_kinds']),
+ file=open(args.operand_kinds_output, 'w'))
+ if args.extension_enum_output is not None:
+ make_path_to_file(args.extension_enum_output)
+ print(generate_extension_enum(grammar['operand_kinds']),
+ file=open(args.extension_enum_output, 'w'))
+ if args.enum_string_mapping_output is not None:
+ make_path_to_file(args.enum_string_mapping_output)
+ print(generate_all_string_enum_mappings(
+ grammar['operand_kinds']),
+ file=open(args.enum_string_mapping_output, 'w'))
if args.extinst_glsl_grammar is not None:
with open(args.extinst_glsl_grammar) as json_file:
print(generate_instruction_table(grammar['instructions'], True),
file=open(args.opencl_insts_output, 'w'))
+ if args.extinst_vendor_grammar is not None:
+ with open(args.extinst_vendor_grammar) as json_file:
+ grammar = json.loads(json_file.read())
+ make_path_to_file(args.vendor_insts_output)
+ print(generate_instruction_table(grammar['instructions'], True),
+ file=open(args.vendor_insts_output, 'w'))
+
if __name__ == '__main__':
main()