6
6
7
7
namespace Shader ::Backend::SPIRV {
8
8
9
- Id EmitCompositeConstructU32x2 (EmitContext& ctx, Id e1 , Id e2 ) {
10
- return ctx.OpCompositeConstruct (ctx.U32 [2 ], e1 , e2 );
9
+ template <typename ... Args>
10
+ Id EmitCompositeConstruct (EmitContext& ctx, IR::Inst* inst, Args&&... args) {
11
+ return inst->AreAllArgsImmediates () ? ctx.ConstantComposite (args...)
12
+ : ctx.OpCompositeConstruct (args...);
11
13
}
12
14
13
- Id EmitCompositeConstructU32x3 (EmitContext& ctx, Id e1 , Id e2 , Id e3 ) {
14
- return ctx. OpCompositeConstruct (ctx.U32 [3 ], e1 , e2 , e3 );
15
+ Id EmitCompositeConstructU32x2 (EmitContext& ctx, IR::Inst* inst , Id e1 , Id e2 ) {
16
+ return EmitCompositeConstruct (ctx, inst, ctx .U32 [2 ], e1 , e2 );
15
17
}
16
18
17
- Id EmitCompositeConstructU32x4 (EmitContext& ctx, Id e1 , Id e2 , Id e3 , Id e4 ) {
18
- return ctx.OpCompositeConstruct (ctx.U32 [4 ], e1 , e2 , e3 , e4 );
19
+ Id EmitCompositeConstructU32x3 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 ) {
20
+ return EmitCompositeConstruct (ctx, inst, ctx.U32 [3 ], e1 , e2 , e3 );
21
+ }
22
+
23
+ Id EmitCompositeConstructU32x4 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 , Id e4 ) {
24
+ return EmitCompositeConstruct (ctx, inst, ctx.U32 [4 ], e1 , e2 , e3 , e4 );
19
25
}
20
26
21
27
Id EmitCompositeExtractU32x2 (EmitContext& ctx, Id composite, u32 index) {
@@ -42,16 +48,30 @@ Id EmitCompositeInsertU32x4(EmitContext& ctx, Id composite, Id object, u32 index
42
48
return ctx.OpCompositeInsert (ctx.U32 [4 ], object, composite, index);
43
49
}
44
50
45
- Id EmitCompositeConstructF16x2 (EmitContext& ctx, Id e1 , Id e2 ) {
46
- return ctx.OpCompositeConstruct (ctx.F16 [2 ], e1 , e2 );
51
+ Id EmitCompositeShuffleU32x2 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) {
52
+ return ctx.OpVectorShuffle (ctx.U32 [2 ], composite1, composite2, comp0, comp1);
53
+ }
54
+
55
+ Id EmitCompositeShuffleU32x3 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
56
+ u32 comp2) {
57
+ return ctx.OpVectorShuffle (ctx.U32 [3 ], composite1, composite2, comp0, comp1, comp2);
47
58
}
48
59
49
- Id EmitCompositeConstructF16x3 (EmitContext& ctx, Id e1 , Id e2 , Id e3 ) {
50
- return ctx.OpCompositeConstruct (ctx.F16 [3 ], e1 , e2 , e3 );
60
+ Id EmitCompositeShuffleU32x4 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
61
+ u32 comp2, u32 comp3) {
62
+ return ctx.OpVectorShuffle (ctx.U32 [4 ], composite1, composite2, comp0, comp1, comp2, comp3);
51
63
}
52
64
53
- Id EmitCompositeConstructF16x4 (EmitContext& ctx, Id e1 , Id e2 , Id e3 , Id e4 ) {
54
- return ctx.OpCompositeConstruct (ctx.F16 [4 ], e1 , e2 , e3 , e4 );
65
+ Id EmitCompositeConstructF16x2 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 ) {
66
+ return EmitCompositeConstruct (ctx, inst, ctx.F16 [2 ], e1 , e2 );
67
+ }
68
+
69
+ Id EmitCompositeConstructF16x3 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 ) {
70
+ return EmitCompositeConstruct (ctx, inst, ctx.F16 [3 ], e1 , e2 , e3 );
71
+ }
72
+
73
+ Id EmitCompositeConstructF16x4 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 , Id e4 ) {
74
+ return EmitCompositeConstruct (ctx, inst, ctx.F16 [4 ], e1 , e2 , e3 , e4 );
55
75
}
56
76
57
77
Id EmitCompositeExtractF16x2 (EmitContext& ctx, Id composite, u32 index) {
@@ -78,16 +98,30 @@ Id EmitCompositeInsertF16x4(EmitContext& ctx, Id composite, Id object, u32 index
78
98
return ctx.OpCompositeInsert (ctx.F16 [4 ], object, composite, index);
79
99
}
80
100
81
- Id EmitCompositeConstructF32x2 (EmitContext& ctx, Id e1 , Id e2 ) {
82
- return ctx.OpCompositeConstruct (ctx.F32 [2 ], e1 , e2 );
101
+ Id EmitCompositeShuffleF16x2 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) {
102
+ return ctx.OpVectorShuffle (ctx.F16 [2 ], composite1, composite2, comp0, comp1);
103
+ }
104
+
105
+ Id EmitCompositeShuffleF16x3 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
106
+ u32 comp2) {
107
+ return ctx.OpVectorShuffle (ctx.F16 [3 ], composite1, composite2, comp0, comp1, comp2);
108
+ }
109
+
110
+ Id EmitCompositeShuffleF16x4 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
111
+ u32 comp2, u32 comp3) {
112
+ return ctx.OpVectorShuffle (ctx.F16 [4 ], composite1, composite2, comp0, comp1, comp2, comp3);
113
+ }
114
+
115
+ Id EmitCompositeConstructF32x2 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 ) {
116
+ return EmitCompositeConstruct (ctx, inst, ctx.F32 [2 ], e1 , e2 );
83
117
}
84
118
85
- Id EmitCompositeConstructF32x3 (EmitContext& ctx, Id e1 , Id e2 , Id e3 ) {
86
- return ctx. OpCompositeConstruct ( ctx.F32 [3 ], e1 , e2 , e3 );
119
+ Id EmitCompositeConstructF32x3 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 ) {
120
+ return EmitCompositeConstruct (ctx, inst, ctx.F32 [3 ], e1 , e2 , e3 );
87
121
}
88
122
89
- Id EmitCompositeConstructF32x4 (EmitContext& ctx, Id e1 , Id e2 , Id e3 , Id e4 ) {
90
- return ctx. OpCompositeConstruct ( ctx.F32 [4 ], e1 , e2 , e3 , e4 );
123
+ Id EmitCompositeConstructF32x4 (EmitContext& ctx, IR::Inst* inst, Id e1 , Id e2 , Id e3 , Id e4 ) {
124
+ return EmitCompositeConstruct (ctx, inst, ctx.F32 [4 ], e1 , e2 , e3 , e4 );
91
125
}
92
126
93
127
Id EmitCompositeExtractF32x2 (EmitContext& ctx, Id composite, u32 index) {
@@ -114,6 +148,20 @@ Id EmitCompositeInsertF32x4(EmitContext& ctx, Id composite, Id object, u32 index
114
148
return ctx.OpCompositeInsert (ctx.F32 [4 ], object, composite, index);
115
149
}
116
150
151
+ Id EmitCompositeShuffleF32x2 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) {
152
+ return ctx.OpVectorShuffle (ctx.F32 [2 ], composite1, composite2, comp0, comp1);
153
+ }
154
+
155
+ Id EmitCompositeShuffleF32x3 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
156
+ u32 comp2) {
157
+ return ctx.OpVectorShuffle (ctx.F32 [3 ], composite1, composite2, comp0, comp1, comp2);
158
+ }
159
+
160
+ Id EmitCompositeShuffleF32x4 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
161
+ u32 comp2, u32 comp3) {
162
+ return ctx.OpVectorShuffle (ctx.F32 [4 ], composite1, composite2, comp0, comp1, comp2, comp3);
163
+ }
164
+
117
165
void EmitCompositeConstructF64x2 (EmitContext&) {
118
166
UNREACHABLE_MSG (" SPIR-V Instruction" );
119
167
}
@@ -150,4 +198,18 @@ Id EmitCompositeInsertF64x4(EmitContext& ctx, Id composite, Id object, u32 index
150
198
return ctx.OpCompositeInsert (ctx.F64 [4 ], object, composite, index);
151
199
}
152
200
201
+ Id EmitCompositeShuffleF64x2 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1) {
202
+ return ctx.OpVectorShuffle (ctx.F64 [2 ], composite1, composite2, comp0, comp1);
203
+ }
204
+
205
+ Id EmitCompositeShuffleF64x3 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
206
+ u32 comp2) {
207
+ return ctx.OpVectorShuffle (ctx.F64 [3 ], composite1, composite2, comp0, comp1, comp2);
208
+ }
209
+
210
+ Id EmitCompositeShuffleF64x4 (EmitContext& ctx, Id composite1, Id composite2, u32 comp0, u32 comp1,
211
+ u32 comp2, u32 comp3) {
212
+ return ctx.OpVectorShuffle (ctx.F64 [4 ], composite1, composite2, comp0, comp1, comp2, comp3);
213
+ }
214
+
153
215
} // namespace Shader::Backend::SPIRV
0 commit comments