1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
use spirv;
#[derive(Debug)]
pub struct Instruction<'a> {
pub opname: &'a str,
pub opcode: spirv::Op,
pub capabilities: &'a [spirv::Capability],
pub operands: &'a [LogicalOperand],
}
pub struct ExtendedInstruction<'a> {
pub opname: &'a str,
pub opcode: spirv::Word,
pub capabilities: &'a [spirv::Capability],
pub operands: &'a [LogicalOperand],
}
#[derive(Debug)]
pub struct LogicalOperand {
pub kind: OperandKind,
pub quantifier: OperandQuantifier,
}
#[derive(Clone, Copy, Debug)]
pub enum OperandQuantifier {
One,
ZeroOrOne,
ZeroOrMore,
}
macro_rules! inst {
($op:ident, [$( $cap:ident ),*], [$( ($kind:ident, $quant:ident) ),*]) => {
Instruction {
opname: stringify!($op),
opcode: spirv::Op::$op,
capabilities: &[
$( spirv::Capability::$cap ),*
],
operands: &[
$( LogicalOperand {
kind: OperandKind::$kind,
quantifier: OperandQuantifier::$quant }
),*
],
}
}
}
macro_rules! ext_inst {
($opname:ident, $opcode: expr, [$( $cap:ident ),*],
[$( ($kind:ident, $quant:ident) ),*]) => {
ExtendedInstruction {
opname: stringify!($opname),
opcode: $opcode,
capabilities: &[
$( spirv::Capability::$cap ),*
],
operands: &[
$( LogicalOperand {
kind: OperandKind::$kind,
quantifier: OperandQuantifier::$quant }
),*
],
}
}
}
pub struct InstructionTable;
impl InstructionTable {
pub fn lookup_opcode(opcode: u16) -> Option<&'static Instruction<'static>> {
INSTRUCTION_TABLE.iter().find(|&inst| (inst.opcode as u16) == opcode)
}
}
include!("table.rs");
pub struct GlslStd450InstructionTable;
impl GlslStd450InstructionTable {
pub fn lookup_opcode(opcode: u32)
-> Option<&'static ExtendedInstruction<'static>> {
GLSL_STD_450_INSTRUCTION_TABLE.iter()
.find(|&inst| inst.opcode == opcode)
}
}
include!("glsl_std_450.rs");