@@ -9,8 +9,9 @@ mod table;
9
9
mod utils;
10
10
11
11
use std:: {
12
- env, fs,
13
- io:: { Read , Write } ,
12
+ env,
13
+ fs,
14
+ io:: Write ,
14
15
path:: { Path , PathBuf } ,
15
16
process,
16
17
} ;
@@ -61,65 +62,82 @@ fn main() {
61
62
panic ! ( "SPIRV-Headers missing - please checkout using git submodule" ) ;
62
63
}
63
64
64
- let mut contents = String :: new ( ) ;
65
-
66
- {
67
- let path = autogen_src_dir
68
- . join ( "external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json" ) ;
69
- let mut file = fs:: File :: open ( path) . unwrap ( ) ;
70
- file. read_to_string ( & mut contents) . unwrap ( ) ;
71
- }
72
-
73
65
let grammar: structs:: Grammar = {
74
- let mut original = serde_json:: from_str ( & contents) . unwrap ( ) ;
66
+ let mut original =
67
+ serde_json:: from_str (
68
+ & std:: str:: from_utf8 (
69
+ & fs:: read ( autogen_src_dir. join (
70
+ "external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json" ,
71
+ ) )
72
+ . unwrap ( ) ,
73
+ )
74
+ . unwrap ( ) ,
75
+ )
76
+ . unwrap ( ) ;
75
77
map_reserved_instructions ( & mut original) ;
76
78
original
77
79
} ;
78
80
79
- // For GLSLstd450 extended instruction set.
80
- {
81
- let path = autogen_src_dir. join (
82
- "external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json" ,
83
- ) ;
84
- let mut file = fs:: File :: open ( path) . unwrap ( ) ;
85
- contents. clear ( ) ;
86
- file. read_to_string ( & mut contents) . unwrap ( ) ;
87
- }
88
- let gl_grammar: structs:: ExtInstSetGrammar = serde_json:: from_str ( & contents) . unwrap ( ) ;
89
-
90
- // For OpenCL extended instruction set.
91
- {
92
- let path = autogen_src_dir. join (
93
- "external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json" ,
94
- ) ;
95
- let mut file = fs:: File :: open ( path) . unwrap ( ) ;
96
- contents. clear ( ) ;
97
- file. read_to_string ( & mut contents) . unwrap ( ) ;
98
- }
99
- let cl_grammar: structs:: ExtInstSetGrammar = serde_json:: from_str ( & contents) . unwrap ( ) ;
81
+ let extended_instruction_sets = [
82
+ ( "GLSL.std.450" , "GLOp" , "https://www.khronos.org/registry/spir-v/specs/unified1/GLSL.std.450.html" ) ,
83
+ ( "OpenCL.std.100" , "CLOp" , "https://www.khronos.org/registry/spir-v/specs/unified1/OpenCL.ExtendedInstructionSet.100.html" ) ,
84
+ ( "NonSemantic.DebugPrintF" , "DebugPrintFOp" , "https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/debug_printf.md" ) ,
85
+ ] ;
86
+ let extended_instruction_sets = extended_instruction_sets. map ( |( ext, op, url) | {
87
+ let grammar: structs:: ExtInstSetGrammar = serde_json:: from_str (
88
+ & std:: str:: from_utf8 (
89
+ & fs:: read ( autogen_src_dir. join ( format ! (
90
+ "external/SPIRV-Headers/include/spirv/unified1/extinst.{}.grammar.json" ,
91
+ ext. to_lowercase( )
92
+ ) ) )
93
+ . unwrap ( ) ,
94
+ )
95
+ . unwrap ( ) ,
96
+ )
97
+ . unwrap ( ) ;
98
+ ( ext, op, url, grammar)
99
+ } ) ;
100
100
101
- // Path to the generated SPIR-V header file.
101
+ // SPIR-V header
102
102
write_formatted ( & autogen_src_dir. join ( "../spirv/autogen_spirv.rs" ) , {
103
103
let core = header:: gen_spirv_header ( & grammar) ;
104
- let gl = header:: gen_glsl_std_450_opcodes ( & gl_grammar) ;
105
- let cl = header:: gen_opencl_std_opcodes ( & cl_grammar) ;
106
- format ! ( "{}\n {}\n {}" , core, gl, cl)
104
+ let extended_instruction_sets =
105
+ extended_instruction_sets
106
+ . iter ( )
107
+ . map ( |( ext, op, url, grammar) | {
108
+ header:: gen_opcodes (
109
+ op,
110
+ & grammar,
111
+ & format ! ( "[{}]({}) extended instruction opcode" , ext, url) ,
112
+ )
113
+ . to_string ( )
114
+ } ) ;
115
+ format ! (
116
+ "{}\n {}" ,
117
+ core,
118
+ extended_instruction_sets. collect:: <Box <_>>( ) . join( "\n " )
119
+ )
107
120
} ) ;
108
121
109
- // Path to the generated instruction table.
122
+ // Instruction table
110
123
write_formatted (
111
124
& autogen_src_dir. join ( "../rspirv/grammar/autogen_table.rs" ) ,
112
125
table:: gen_grammar_inst_table_operand_kinds ( & grammar) ,
113
126
) ;
114
- // Path to the generated GLSLstd450 extended instruction set header.
115
- write_formatted (
116
- & autogen_src_dir. join ( "../rspirv/grammar/autogen_glsl_std_450.rs" ) ,
117
- table:: gen_glsl_std_450_inst_table ( & gl_grammar) ,
118
- ) ;
119
- write_formatted (
120
- & autogen_src_dir. join ( "../rspirv/grammar/autogen_opencl_std_100.rs" ) ,
121
- table:: gen_opencl_std_100_inst_table ( & cl_grammar) ,
122
- ) ;
127
+ // Extended instruction sets
128
+ for ( ext, _, _, grammar) in extended_instruction_sets {
129
+ write_formatted (
130
+ & autogen_src_dir. join ( format ! (
131
+ "../rspirv/grammar/autogen_{}.rs" ,
132
+ ext. replace( "." , "_" ) . to_lowercase( )
133
+ ) ) ,
134
+ table:: gen_instruction_table (
135
+ & grammar. instructions ,
136
+ & format ! ( "{}_INSTRUCTION_TABLE" , ext. replace( "." , "_" ) . to_uppercase( ) ) ,
137
+ true ,
138
+ ) ,
139
+ ) ;
140
+ }
123
141
124
142
// Path to the generated operands kind in data representation.
125
143
write_formatted (
0 commit comments