1#[derive(Clone, Copy, PartialEq, Eq)]
19pub enum Sizes {
20 None,
22 Probes,
25 PoolAndProbes,
27}
28
29pub struct SlangProgram {
32 pub file: &'static str,
35 pub entry: &'static str,
37 pub label: &'static str,
39 pub gates: &'static [&'static str],
43 pub sizes: Sizes,
45 pub msaa: bool,
49}
50
51pub static MAIN_BINDLESS_VERT: SlangProgram = SlangProgram {
53 file: "main_bindless.slang",
54 entry: "vertex_main_bindless",
55 label: "vert_bindless.slang",
56 gates: &[],
57 sizes: Sizes::PoolAndProbes,
58 msaa: false,
59};
60pub static MAIN_BINDLESS_FRAG: SlangProgram = SlangProgram {
62 file: "main_bindless.slang",
63 entry: "fragment_main_bindless",
64 label: "frag_bindless.slang",
65 gates: &[],
66 sizes: Sizes::PoolAndProbes,
67 msaa: false,
68};
69pub static CULL: SlangProgram = SlangProgram {
71 file: "cull.slang",
72 entry: "cull_kernel",
73 label: "cull.slang",
74 gates: &[],
75 sizes: Sizes::None,
76 msaa: false,
77};
78pub static CULL_PHASE2: SlangProgram = SlangProgram {
81 file: "cull.slang",
82 entry: "cull_kernel",
83 label: "cull_phase2.slang",
84 gates: &["CULL_PHASE2"],
85 sizes: Sizes::None,
86 msaa: false,
87};
88pub static CULL_SHADOW: SlangProgram = SlangProgram {
91 file: "cull.slang",
92 entry: "cull_kernel",
93 label: "cull_shadow.slang",
94 gates: &["SHADOW_CULL"],
95 sizes: Sizes::None,
96 msaa: false,
97};
98pub static LIGHT_CULL: SlangProgram = SlangProgram {
100 file: "light_cull.slang",
101 entry: "light_cull_kernel",
102 label: "light_cull.slang",
103 gates: &[],
104 sizes: Sizes::None,
105 msaa: false,
106};
107pub static HIZ_INIT_MSAA: SlangProgram = SlangProgram {
109 file: "hiz_build.slang",
110 entry: "hiz_init_msaa",
111 label: "hiz_init_msaa.slang",
112 gates: &["HIZ_INIT_MSAA"],
113 sizes: Sizes::None,
114 msaa: false,
115};
116pub static HIZ_INIT_SINGLE: SlangProgram = SlangProgram {
118 file: "hiz_build.slang",
119 entry: "hiz_init_single",
120 label: "hiz_init_single.slang",
121 gates: &["HIZ_INIT_SINGLE"],
122 sizes: Sizes::None,
123 msaa: false,
124};
125pub static HIZ_DOWNSAMPLE: SlangProgram = SlangProgram {
127 file: "hiz_build.slang",
128 entry: "hiz_downsample",
129 label: "hiz_downsample.slang",
130 gates: &["HIZ_DOWNSAMPLE"],
131 sizes: Sizes::None,
132 msaa: false,
133};
134
135pub static PROBE_MIP0: SlangProgram = SlangProgram {
137 file: "probe_prefilter.slang",
138 entry: "probe_mip0",
139 label: "probe_mip0.slang",
140 gates: &["PROBE_MIP0"],
141 sizes: Sizes::None,
142 msaa: false,
143};
144pub static PROBE_DOWNSAMPLE: SlangProgram = SlangProgram {
146 file: "probe_prefilter.slang",
147 entry: "probe_downsample",
148 label: "probe_downsample.slang",
149 gates: &["PROBE_DOWNSAMPLE"],
150 sizes: Sizes::None,
151 msaa: false,
152};
153pub static PROBE_GGX: SlangProgram = SlangProgram {
155 file: "probe_prefilter.slang",
156 entry: "probe_ggx",
157 label: "probe_ggx.slang",
158 gates: &["PROBE_GGX"],
159 sizes: Sizes::None,
160 msaa: false,
161};
162
163pub static GBUFFER_BINDLESS_VERT: SlangProgram = SlangProgram {
169 file: "gbuffer_prepass.slang",
170 entry: "gbuffer_prepass_vertex_bindless",
171 label: "gbuffer_prepass_vert_bindless.slang",
172 gates: &["GB_BINDLESS"],
173 sizes: Sizes::None,
174 msaa: false,
175};
176pub static GBUFFER_BINDLESS_FRAG: SlangProgram = SlangProgram {
178 file: "gbuffer_prepass.slang",
179 entry: "gbuffer_prepass_fragment_bindless",
180 label: "gbuffer_prepass_frag_bindless.slang",
181 gates: &["GB_FRAGMENT_BINDLESS"],
182 sizes: Sizes::None,
183 msaa: false,
184};
185pub static SHADOW_VERT: SlangProgram = SlangProgram {
187 file: "shadow.slang",
188 entry: "shadow_vertex_main",
189 label: "shadow_vert.slang",
190 gates: &["SHADOW_STATIC"],
191 sizes: Sizes::None,
192 msaa: false,
193};
194pub static SKINNED_SHADOW_VERT: SlangProgram = SlangProgram {
196 file: "shadow.slang",
197 entry: "shadow_vertex_main_skinned",
198 label: "shadow_vert_skinned.slang",
199 gates: &["SHADOW_SKINNED"],
200 sizes: Sizes::None,
201 msaa: false,
202};
203pub static SHADOW_BINDLESS_VERT: SlangProgram = SlangProgram {
205 file: "shadow.slang",
206 entry: "shadow_vertex_bindless",
207 label: "shadow_vert_bindless.slang",
208 gates: &["SHADOW_BINDLESS"],
209 sizes: Sizes::None,
210 msaa: false,
211};
212
213pub static FULLSCREEN_VERT: SlangProgram = SlangProgram {
217 file: "fullscreen.slang",
218 entry: "fullscreen_vertex",
219 label: "fullscreen_vert.slang",
220 gates: &[],
221 sizes: Sizes::None,
222 msaa: false,
223};
224pub static TAA_FRAG: SlangProgram = SlangProgram {
226 file: "taa.slang",
227 entry: "taa_fragment_main",
228 label: "taa_frag.slang",
229 gates: &[],
230 sizes: Sizes::None,
231 msaa: false,
232};
233pub static BLOOM_PREFILTER: SlangProgram = SlangProgram {
235 file: "bloom.slang",
236 entry: "bloom_prefilter_fragment",
237 label: "bloom_prefilter.slang",
238 gates: &["BLOOM_PREFILTER"],
239 sizes: Sizes::None,
240 msaa: false,
241};
242pub static BLOOM_DOWNSAMPLE: SlangProgram = SlangProgram {
244 file: "bloom.slang",
245 entry: "bloom_downsample_fragment",
246 label: "bloom_downsample.slang",
247 gates: &["BLOOM_DOWNSAMPLE"],
248 sizes: Sizes::None,
249 msaa: false,
250};
251pub static BLOOM_UPSAMPLE: SlangProgram = SlangProgram {
253 file: "bloom.slang",
254 entry: "bloom_upsample_fragment",
255 label: "bloom_upsample.slang",
256 gates: &["BLOOM_UPSAMPLE"],
257 sizes: Sizes::None,
258 msaa: false,
259};
260pub static COMPOSITE_FRAG: SlangProgram = SlangProgram {
262 file: "composite.slang",
263 entry: "composite_fragment",
264 label: "composite_frag.slang",
265 gates: &[],
266 sizes: Sizes::None,
267 msaa: false,
268};
269pub static SSAO_KERNEL: SlangProgram = SlangProgram {
271 file: "ssao.slang",
272 entry: "ssao_kernel_fragment",
273 label: "ssao_kernel.slang",
274 gates: &["SSAO_KERNEL"],
275 sizes: Sizes::None,
276 msaa: false,
277};
278pub static SSAO_BLUR: SlangProgram = SlangProgram {
280 file: "ssao.slang",
281 entry: "ssao_blur_fragment",
282 label: "ssao_blur.slang",
283 gates: &["SSAO_BLUR"],
284 sizes: Sizes::None,
285 msaa: false,
286};
287pub static SSR_RESOLVE: SlangProgram = SlangProgram {
289 file: "ssr.slang",
290 entry: "ssr_resolve_fragment",
291 label: "ssr_resolve.slang",
292 gates: &[],
293 sizes: Sizes::Probes,
294 msaa: false,
295};
296pub static SSGI_GATHER: SlangProgram = SlangProgram {
298 file: "ssgi.slang",
299 entry: "ssgi_gather_fragment",
300 label: "ssgi_gather.slang",
301 gates: &["SSGI_GATHER"],
302 sizes: Sizes::None,
303 msaa: false,
304};
305pub static SSGI_COMPOSITE: SlangProgram = SlangProgram {
307 file: "ssgi.slang",
308 entry: "ssgi_composite_fragment",
309 label: "ssgi_composite.slang",
310 gates: &["SSGI_COMPOSITE"],
311 sizes: Sizes::None,
312 msaa: false,
313};
314pub static REFLECTION_BLUR: SlangProgram = SlangProgram {
316 file: "reflection.slang",
317 entry: "reflection_blur_fragment",
318 label: "reflection_blur.slang",
319 gates: &["REFLECTION_BLUR"],
320 sizes: Sizes::None,
321 msaa: false,
322};
323pub static REFLECTION_COMPOSITE: SlangProgram = SlangProgram {
325 file: "reflection.slang",
326 entry: "reflection_composite_fragment",
327 label: "reflection_composite.slang",
328 gates: &["REFLECTION_COMPOSITE"],
329 sizes: Sizes::None,
330 msaa: false,
331};
332
333pub static FOG_FROXEL: SlangProgram = SlangProgram {
337 file: "fog.slang",
338 entry: "fog_froxel_kernel",
339 label: "fog_froxel.slang",
340 gates: &["FOG_FROXEL"],
341 sizes: Sizes::None,
342 msaa: false,
343};
344pub static FOG_FRAG: SlangProgram = SlangProgram {
346 file: "fog.slang",
347 entry: "fog_fragment",
348 label: "fog_frag.slang",
349 gates: &[],
350 sizes: Sizes::None,
351 msaa: true,
352};
353pub static AUTO_EXPOSURE_BUILD: SlangProgram = SlangProgram {
355 file: "auto_exposure.slang",
356 entry: "histogram_build",
357 label: "auto_exposure_build.slang",
358 gates: &["AE_BUILD"],
359 sizes: Sizes::None,
360 msaa: false,
361};
362pub static AUTO_EXPOSURE_AVERAGE: SlangProgram = SlangProgram {
364 file: "auto_exposure.slang",
365 entry: "histogram_average",
366 label: "auto_exposure_average.slang",
367 gates: &["AE_AVERAGE"],
368 sizes: Sizes::None,
369 msaa: false,
370};
371pub static RT_SKIN: SlangProgram = SlangProgram {
373 file: "rt_skin.slang",
374 entry: "rt_skin",
375 label: "rt_skin.slang",
376 gates: &[],
377 sizes: Sizes::None,
378 msaa: false,
379};
380pub static PARTICLE_SIMULATE: SlangProgram = SlangProgram {
382 file: "particle_simulate.slang",
383 entry: "particle_simulate",
384 label: "particle_simulate.slang",
385 gates: &[],
386 sizes: Sizes::None,
387 msaa: false,
388};
389
390pub static PARTICLE_VERT: SlangProgram = SlangProgram {
397 file: "particle.slang",
398 entry: "particle_vertex",
399 label: "particle_vert.slang",
400 gates: &[],
401 sizes: Sizes::None,
402 msaa: false,
403};
404pub static PARTICLE_FRAG: SlangProgram = SlangProgram {
406 file: "particle.slang",
407 entry: "particle_fragment",
408 label: "particle_frag.slang",
409 gates: &[],
410 sizes: Sizes::None,
411 msaa: false,
412};
413pub static DECAL_VERT: SlangProgram = SlangProgram {
415 file: "decal.slang",
416 entry: "decal_vertex",
417 label: "decal_vert.slang",
418 gates: &[],
419 sizes: Sizes::None,
420 msaa: false,
421};
422pub static DECAL_FRAG: SlangProgram = SlangProgram {
424 file: "decal.slang",
425 entry: "decal_fragment",
426 label: "decal_frag.slang",
427 gates: &[],
428 sizes: Sizes::None,
429 msaa: true,
430};
431pub static LINE_VERT: SlangProgram = SlangProgram {
433 file: "line.slang",
434 entry: "line_vertex",
435 label: "line_vert.slang",
436 gates: &[],
437 sizes: Sizes::None,
438 msaa: false,
439};
440pub static LINE_FRAG: SlangProgram = SlangProgram {
442 file: "line.slang",
443 entry: "line_fragment",
444 label: "line_frag.slang",
445 gates: &[],
446 sizes: Sizes::None,
447 msaa: true,
448};
449pub static TEXT_VERT: SlangProgram = SlangProgram {
451 file: "text.slang",
452 entry: "text_vertex_main",
453 label: "text_vert.slang",
454 gates: &[],
455 sizes: Sizes::None,
456 msaa: false,
457};
458pub static TEXT_FRAG: SlangProgram = SlangProgram {
460 file: "text.slang",
461 entry: "text_fragment_main",
462 label: "text_frag.slang",
463 gates: &[],
464 sizes: Sizes::None,
465 msaa: false,
466};
467
468pub static RT_REFLECTIONS_FRAG: SlangProgram = SlangProgram {
476 file: "rt_reflections.slang",
477 entry: "rt_reflections_fragment",
478 label: "rt_reflections.slang",
479 gates: &[],
480 sizes: Sizes::Probes,
481 msaa: false,
482};
483pub static RT_REFLECTIONS_FRAG_TEXTURED: SlangProgram = SlangProgram {
485 file: "rt_reflections.slang",
486 entry: "rt_reflections_fragment",
487 label: "rt_reflections_textured.slang",
488 gates: &["RT_TEXTURED"],
489 sizes: Sizes::PoolAndProbes,
490 msaa: false,
491};
492pub static GLASS_VERT: SlangProgram = SlangProgram {
494 file: "glass.slang",
495 entry: "glass_vertex",
496 label: "glass_vert.slang",
497 gates: &[],
498 sizes: Sizes::Probes,
499 msaa: true,
500};
501pub static GLASS_FRAG: SlangProgram = SlangProgram {
503 file: "glass.slang",
504 entry: "glass_fragment",
505 label: "glass_frag.slang",
506 gates: &[],
507 sizes: Sizes::Probes,
508 msaa: true,
509};
510pub static GLASS_FRAG_RT: SlangProgram = SlangProgram {
512 file: "glass.slang",
513 entry: "glass_rt_fragment",
514 label: "glass_frag_rt.slang",
515 gates: &["GLASS_RT"],
516 sizes: Sizes::Probes,
517 msaa: true,
518};
519pub static GLASS_FRAG_RT_TEXTURED: SlangProgram = SlangProgram {
521 file: "glass.slang",
522 entry: "glass_rt_fragment",
523 label: "glass_frag_rt_textured.slang",
524 gates: &["GLASS_RT", "RT_TEXTURED"],
525 sizes: Sizes::PoolAndProbes,
526 msaa: true,
527};
528
529pub static GLASS_MESH_VERT: SlangProgram = SlangProgram {
536 file: "glass_mesh.slang",
537 entry: "glass_mesh_vertex",
538 label: "glass_mesh_vert.slang",
539 gates: &[],
540 sizes: Sizes::Probes,
541 msaa: true,
542};
543pub static GLASS_MESH_FRAG_RT: SlangProgram = SlangProgram {
545 file: "glass_mesh.slang",
546 entry: "glass_mesh_rt_fragment",
547 label: "glass_mesh_frag_rt.slang",
548 gates: &[],
549 sizes: Sizes::Probes,
550 msaa: true,
551};
552pub static GLASS_MESH_FRAG_RT_TEXTURED: SlangProgram = SlangProgram {
554 file: "glass_mesh.slang",
555 entry: "glass_mesh_rt_fragment",
556 label: "glass_mesh_frag_rt_textured.slang",
557 gates: &["RT_TEXTURED"],
558 sizes: Sizes::PoolAndProbes,
559 msaa: true,
560};
561
562pub static WATER_VERT: SlangProgram = SlangProgram {
568 file: "water.slang",
569 entry: "water_vertex",
570 label: "water_vert.slang",
571 gates: &[],
572 sizes: Sizes::Probes,
573 msaa: true,
574};
575pub static WATER_FRAG: SlangProgram = SlangProgram {
577 file: "water.slang",
578 entry: "water_fragment",
579 label: "water_frag.slang",
580 gates: &[],
581 sizes: Sizes::Probes,
582 msaa: true,
583};
584pub static WATER_FRAG_RT: SlangProgram = SlangProgram {
586 file: "water.slang",
587 entry: "water_rt_fragment",
588 label: "water_frag_rt.slang",
589 gates: &["WATER_RT"],
590 sizes: Sizes::Probes,
591 msaa: true,
592};
593pub static WATER_FRAG_RT_TEXTURED: SlangProgram = SlangProgram {
595 file: "water.slang",
596 entry: "water_rt_fragment",
597 label: "water_frag_rt_textured.slang",
598 gates: &["WATER_RT", "RT_TEXTURED"],
599 sizes: Sizes::PoolAndProbes,
600 msaa: true,
601};
602
603pub static ALL: &[&SlangProgram] = &[
607 &MAIN_BINDLESS_VERT,
608 &MAIN_BINDLESS_FRAG,
609 &LIGHT_CULL,
610 &CULL,
611 &CULL_PHASE2,
612 &CULL_SHADOW,
613 &RT_SKIN,
614 &HIZ_INIT_MSAA,
615 &HIZ_INIT_SINGLE,
616 &HIZ_DOWNSAMPLE,
617 &PROBE_MIP0,
618 &PROBE_DOWNSAMPLE,
619 &PROBE_GGX,
620 &GBUFFER_BINDLESS_VERT,
621 &GBUFFER_BINDLESS_FRAG,
622 &SHADOW_VERT,
623 &SKINNED_SHADOW_VERT,
624 &SHADOW_BINDLESS_VERT,
625 &FULLSCREEN_VERT,
626 &TAA_FRAG,
627 &BLOOM_PREFILTER,
628 &BLOOM_DOWNSAMPLE,
629 &BLOOM_UPSAMPLE,
630 &COMPOSITE_FRAG,
631 &SSAO_KERNEL,
632 &SSAO_BLUR,
633 &SSR_RESOLVE,
634 &SSGI_GATHER,
635 &SSGI_COMPOSITE,
636 &REFLECTION_BLUR,
637 &REFLECTION_COMPOSITE,
638 &FOG_FROXEL,
639 &FOG_FRAG,
640 &AUTO_EXPOSURE_BUILD,
641 &AUTO_EXPOSURE_AVERAGE,
642 &PARTICLE_SIMULATE,
643 &PARTICLE_VERT,
644 &PARTICLE_FRAG,
645 &DECAL_VERT,
646 &DECAL_FRAG,
647 &LINE_VERT,
648 &LINE_FRAG,
649 &TEXT_VERT,
650 &TEXT_FRAG,
651 &RT_REFLECTIONS_FRAG,
652 &RT_REFLECTIONS_FRAG_TEXTURED,
653 &GLASS_VERT,
654 &GLASS_FRAG,
655 &GLASS_FRAG_RT,
656 &GLASS_FRAG_RT_TEXTURED,
657 &GLASS_MESH_VERT,
658 &GLASS_MESH_FRAG_RT,
659 &GLASS_MESH_FRAG_RT_TEXTURED,
660 &WATER_VERT,
661 &WATER_FRAG,
662 &WATER_FRAG_RT,
663 &WATER_FRAG_RT_TEXTURED,
664];
665
666#[cfg(test)]
667mod tests {
668 use super::*;
669 use alloc::vec::Vec;
670
671 #[test]
675 fn every_program_has_a_distinct_label() {
676 let mut labels: Vec<&str> = ALL.iter().map(|p| p.label).collect();
677 let declared = labels.len();
678 labels.sort_unstable();
679 labels.dedup();
680 assert_eq!(
681 labels.len(),
682 declared,
683 "two programs share a label, so they would share a precompiled artifact"
684 );
685 }
686
687 #[test]
688 fn every_program_names_an_embedded_shader() {
689 for p in ALL {
690 assert!(
691 crate::render::shaders::embedded(p.file).is_some(),
692 "{}: no embedded {}",
693 p.label,
694 p.file
695 );
696 }
697 }
698
699 #[test]
703 fn the_only_per_host_variant_is_the_sample_count() {
704 let sampled = ALL.iter().filter(|p| p.msaa).count();
705 assert!(sampled > 0, "the MSAA dimension went missing");
706 assert!(sampled < ALL.len(), "every program cannot read the depth");
707 for p in ALL {
708 assert!(!p.entry.is_empty(), "{}", p.label);
709 }
710 }
711}