1use super::request::{Dim, ImageAtomicOp, QueryKind};
5use iridia::ResourceId;
6
7pub(super) type Reg = [u32; 4];
8
9#[derive(Clone, Copy, Debug, PartialEq)]
10pub(super) enum BinOp {
11 AddF,
12 SubF,
13 MulF,
14 DivF,
15 ModF,
16 AddU,
17 SubU,
18 MulU,
19 DivU,
20 ModU,
21 And,
22 Or,
23 Xor,
24 Shl,
25 ShrU,
26 ShrI,
27 EqW,
28 NeW,
29 EqF,
30 NeF,
31 LtF,
32 LeF,
33 GtF,
34 GeF,
35 LtU,
36 LeU,
37 GtU,
38 GeU,
39 LtI,
40 LeI,
41 GtI,
42 GeI,
43 LAnd,
44 LOr,
45}
46#[derive(Clone, Copy, Debug, PartialEq)]
47pub(super) enum UnOp {
48 NegF,
49 NegI,
50 Not,
51 BitNot,
52}
53#[derive(Clone, Copy, Debug, PartialEq)]
54pub(super) enum CvtOp {
55 F2I,
56 F2U,
57 I2F,
58 U2F,
59 B2F,
61 B2U,
62}
63#[derive(Clone, Copy, Debug, PartialEq)]
64pub(super) enum MathOp {
65 AbsF,
66 AbsI,
67 MinF,
68 MaxF,
69 MinU,
70 MaxU,
71 MinI,
72 MaxI,
73 ClampF,
74 SatF,
75 Floor,
76 Ceil,
77 Trunc,
78 Round,
79 Fract,
80 Exp2,
81 Log2,
82 Sin,
83 Cos,
84 QuantizeF16,
85 Tan,
86 Asin,
87 Acos,
88 Atan,
89 Sinh,
90 Cosh,
91 Tanh,
92 Fma,
93 Sqrt,
94 Rsqrt,
95 Dot,
96 Popcnt,
97 RevBits,
98 Clz,
99 Ctz,
100 PackHalf,
101 UnpackHalf,
102 Mix,
104 Normalize,
106 Pow,
108 SignF,
109 SignI,
110 All,
113 Any,
114 IsNan,
115 IsInf,
116}
117
118#[derive(Clone, Copy, Debug)]
119pub(super) enum Loc {
120 Local(u32),
121 Global(u32, u32),
122 Elem(u32, u32, Pick),
125}
126impl Loc {
127 pub(super) fn slot(&self) -> Option<u32> {
129 match self {
130 Loc::Elem(_, _, Pick::Slot(s)) => Some(*s),
131 _ => None,
132 }
133 }
134}
135#[derive(Clone, Copy, Debug)]
136pub(super) struct Ptr {
137 pub loc: Loc,
138 pub dynamic: Option<(u32, u32, u32)>,
140}
141
142#[derive(Clone, Debug)]
143pub(super) enum Op {
144 Swizzle {
145 src: u32,
146 pat: [u8; 4],
147 n: u8,
148 },
149 Splat {
150 src: u32,
151 n: u8,
152 },
153 Compose {
154 parts: [(u32, u8); 4],
155 np: u8,
156 },
157 Lane {
158 src: u32,
159 i: u8,
160 },
161 Load {
162 loc: Loc,
163 n: u8,
164 },
165 LoadLanes {
166 loc: Loc,
167 offs: [u8; 4],
168 n: u8,
169 },
170 LoadDyn {
171 ptr: Ptr,
172 n: u8,
173 },
174 Un {
175 op: UnOp,
176 src: u32,
177 n: u8,
178 },
179 Bin {
180 op: BinOp,
181 a: u32,
182 b: u32,
183 n: u8,
184 a1: bool,
185 b1: bool,
186 },
187 Select {
188 c: u32,
189 a: u32,
190 b: u32,
191 n: u8,
192 c1: bool,
193 },
194 Cvt {
195 op: CvtOp,
196 src: u32,
197 n: u8,
198 },
199 Math {
200 f: MathOp,
201 a: u32,
202 b: u32,
203 c: u32,
204 n: u8,
205 c1: bool,
207 },
208 Deriv {
209 src: u32,
210 axis: u8,
211 fine: bool,
212 n: u8,
213 prov: Option<[(u32, u8); 4]>,
214 },
215 Sample {
216 tex: Res,
217 smp: Res,
218 coord: u32,
219 cn: u8,
220 layer: Option<u32>,
221 level: LevelOp,
222 dim: Dim,
223 offset: [i32; 3],
224 gather: Option<u8>,
225 depth_ref: Option<u32>,
226 depth: bool,
227 },
228 Texel {
229 tex: Res,
230 coord: u32,
231 cn: u8,
232 dim: Dim,
233 storage: bool,
234 layer: Option<u32>,
235 sample: Option<u32>,
236 mip: Option<u32>,
237 },
238 Query {
239 tex: Res,
240 dim: Dim,
241 kind: QueryKind,
242 level: Option<u32>,
243 },
244 CopyWords {
246 src: Loc,
247 dst: u32,
248 words: u32,
249 },
250 RqHit {
254 q: u32,
255 committed: bool,
256 first: u32,
257 },
258 ArrLen {
259 gid: u32,
260 elem_words: u32,
261 pick: Option<Pick>,
263 },
264}
265#[derive(Clone, Copy, Debug)]
267pub(super) enum Pick {
268 One,
270 Fixed(u32),
271 Slot(u32),
273}
274#[derive(Clone, Copy, Debug)]
276pub(super) struct Res {
277 pub id: ResourceId,
278 pub pick: Pick,
279 pub count: u32,
280}
281impl Res {
282 pub(super) fn slot(&self) -> Option<u32> {
284 match self.pick {
285 Pick::Slot(s) => Some(s),
286 _ => None,
287 }
288 }
289}
290#[derive(Clone, Copy, Debug)]
291pub(super) enum LevelOp {
292 Auto,
293 Zero,
294 Exact(u32),
295 Bias(u32),
296 Gradient(u32, u32),
297}
298
299#[derive(Clone, Copy, Debug)]
302pub(super) enum Member {
303 Reg(u32, u8),
304 Mem {
306 word: u32,
307 count: u32,
308 width: u8,
309 keep: Option<u32>,
310 },
311}
312
313#[derive(Clone, Debug)]
314pub(super) enum St {
315 Run(u32, u32),
316 Store {
317 loc: Loc,
318 src: u32,
319 n: u8,
320 },
321 StoreDyn {
322 ptr: Ptr,
323 src: u32,
324 n: u8,
325 },
326 ImageStore {
327 tex: Res,
328 dim: Dim,
329 coord: u32,
330 cn: u8,
331 layer: Option<u32>,
332 value: u32,
333 vn: u8,
334 },
335 ImageAtomic {
336 tex: Res,
337 dim: Dim,
338 coord: u32,
339 cn: u8,
340 layer: Option<u32>,
341 op: ImageAtomicOp,
342 signed: bool,
343 value: u32,
344 result: Option<u32>,
346 },
347 Atomic {
348 ptr: Ptr,
349 fun: AtomOp,
350 signed: bool,
352 value: u32,
353 compare: Option<u32>,
355 result: Option<u32>,
357 exchanged: Option<u32>,
358 },
359 Barrier,
361 StoreAgg {
363 loc: Loc,
364 members: Vec<(u32, u8)>,
365 },
366 RqInit {
368 q: u32,
369 scene: ResourceId,
370 flags: u32,
371 mask: u32,
372 tmin: u32,
373 tmax: u32,
374 origin: u32,
375 direction: u32,
376 },
377 RqProceed {
378 q: u32,
379 result: u32,
380 },
381 RqConfirm {
382 q: u32,
383 },
384 RtTrace {
387 scene: ResourceId,
388 operands: [u32; 9],
389 payload: (u32, u32),
390 },
391 RtReport {
394 t: u32,
395 kind: u32,
396 attributes: (u32, u32),
397 result: Option<u32>,
398 },
399 RtCall {
401 index: u32,
402 parameter: (u32, u32),
403 },
404 RtDecide(super::run::Decision),
406 RqGenerate {
408 q: u32,
409 t: u32,
410 },
411 RqTerminate {
412 q: u32,
413 },
414 WaveBallot {
416 predicate: Option<u32>,
417 result: u32,
418 },
419 WaveGather {
421 mode: WaveGather,
422 value: u32,
423 n: u8,
424 result: u32,
425 },
426 WaveOp {
428 op: WaveOp,
429 scan: WaveScan,
430 value: u32,
431 n: u8,
432 kind: WaveKind,
433 result: u32,
434 },
435 If {
436 c: u32,
437 a: Vec<St>,
438 r: Vec<St>,
439 },
440 Loop {
441 body: Vec<St>,
442 cont: Vec<St>,
443 break_if: Option<u32>,
444 },
445 Switch {
446 sel: u32,
447 cases: Vec<(Option<u32>, bool, Vec<St>)>,
448 },
449 Break,
450 Continue,
451 Return(Vec<Member>),
453 Kill,
454}
455
456#[derive(Clone, Copy, Debug, PartialEq)]
458pub(super) enum WaveGather {
459 First,
460 Lane(u32),
461 Shuffle(u32),
462 Down(u32),
463 Up(u32),
464 Xor(u32),
465 QuadLane(u32),
466 QuadSwap(u32),
468}
469#[derive(Clone, Copy, Debug, PartialEq)]
470pub(super) enum WaveOp {
471 All,
472 Any,
473 Add,
474 Mul,
475 Min,
476 Max,
477 And,
478 Or,
479 Xor,
480}
481#[derive(Clone, Copy, Debug, PartialEq)]
482pub(super) enum WaveScan {
483 Reduce,
484 Inclusive,
485 Exclusive,
486}
487#[derive(Clone, Copy, Debug, PartialEq)]
488pub(super) enum WaveKind {
489 F,
490 U,
491 I,
492}
493
494#[derive(Clone, Copy, Debug, PartialEq)]
495pub(super) enum AtomOp {
496 Add,
497 Sub,
498 And,
499 Or,
500 Xor,
501 Min,
502 Max,
503 Exchange,
504 CompareExchange,
505}
506
507#[derive(Clone, Debug)]
508pub(super) enum GlobalKind {
509 Constants(ResourceId),
511 ConstantsArray(ResourceId, u32),
512 Private(Vec<u32>),
514 Storage(ResourceId),
516 StorageArray(ResourceId, u32),
518 Workgroup(u32),
520}
521#[derive(Clone, Debug)]
522pub(super) struct GlobalDesc {
523 pub kind: GlobalKind,
524 pub elem_words: u32,
526}
527
528#[derive(Debug)]
531pub struct Executable {
532 pub(super) ops: Vec<(u32, Op)>,
533 pub(super) body: Vec<St>,
534 pub(super) slots: usize,
535 pub(super) inits: Vec<(u32, Reg)>,
536 pub(super) args: Vec<(u32, u8)>,
538 pub(super) arg_at: Vec<usize>,
541 pub(super) arg_len: usize,
542 pub(super) pointer_args: Vec<(usize, u32, u32)>,
545 pub(super) array_args: Vec<(usize, u32, u32, u8)>,
548 pub(super) local_words: usize,
549 pub(super) globals: Vec<GlobalDesc>,
550 pub(super) flush_denormals: bool,
552 pub(super) workgroup: Option<[u32; 3]>,
554 pub(super) mesh_output: Option<(usize, u32)>,
556 pub(super) builtins: Vec<Option<naga::BuiltIn>>,
558}