pub struct SlangProgram {
pub file: &'static str,
pub entry: &'static str,
pub profile: &'static str,
pub label: &'static str,
pub defines: &'static [(&'static str, &'static str)],
}
const MAIN_DEFINES: &[(&str, &str)] = &[("DXIL_ABI", "1"), ("MAX_PROBES", "8")];
const SSR_DEFINES: &[(&str, &str)] = &[("MAX_PROBES", "8"), ("SPLIT_PROBE_SAMPLER", "1")];
pub static MAIN_BINDLESS_VERT: SlangProgram = SlangProgram {
file: "main_bindless.slang",
entry: "vertex_main_bindless",
profile: "vs_6_0",
label: "vert_bindless.slang",
defines: MAIN_DEFINES,
};
pub static MAIN_BINDLESS_FRAG: SlangProgram = SlangProgram {
file: "main_bindless.slang",
entry: "fragment_main_bindless",
profile: "ps_6_0",
label: "frag_bindless.slang",
defines: MAIN_DEFINES,
};
pub static LIGHT_CULL: SlangProgram = SlangProgram {
file: "light_cull.slang",
entry: "light_cull_kernel",
profile: "cs_6_0",
label: "light_cull.slang",
defines: &[],
};
pub static HIZ_INIT_SINGLE: SlangProgram = SlangProgram {
file: "hiz_build.slang",
entry: "hiz_init_single",
profile: "cs_6_0",
label: "hiz_init_single.slang",
defines: &[("HIZ_INIT_SINGLE", "1")],
};
pub static HIZ_INIT_MSAA: SlangProgram = SlangProgram {
file: "hiz_build.slang",
entry: "hiz_init_msaa",
profile: "cs_6_0",
label: "hiz_init_msaa.slang",
defines: &[("HIZ_INIT_MSAA", "1")],
};
pub static HIZ_DOWNSAMPLE: SlangProgram = SlangProgram {
file: "hiz_build.slang",
entry: "hiz_downsample",
profile: "cs_6_0",
label: "hiz_downsample.slang",
defines: &[("HIZ_DOWNSAMPLE", "1")],
};
const GB_STATIC: &[(&str, &str)] = &[("GB_STATIC", "1"), ("DXIL_ABI", "1")];
const GB_INSTANCED: &[(&str, &str)] = &[("GB_INSTANCED", "1"), ("DXIL_ABI", "1")];
const GB_SKINNED: &[(&str, &str)] = &[("GB_SKINNED", "1"), ("DXIL_ABI", "1")];
const GB_BINDLESS: &[(&str, &str)] = &[("GB_BINDLESS", "1"), ("DXIL_ABI", "1")];
const GB_FRAGMENT: &[(&str, &str)] = &[("GB_FRAGMENT", "1"), ("DXIL_ABI", "1")];
const GB_FRAGMENT_BINDLESS: &[(&str, &str)] = &[("GB_FRAGMENT_BINDLESS", "1"), ("DXIL_ABI", "1")];
const SHADOW_STATIC: &[(&str, &str)] = &[("SHADOW_STATIC", "1"), ("DXIL_ABI", "1")];
const SHADOW_SKINNED: &[(&str, &str)] = &[("SHADOW_SKINNED", "1"), ("DXIL_ABI", "1")];
const SHADOW_BINDLESS: &[(&str, &str)] = &[("SHADOW_BINDLESS", "1"), ("DXIL_ABI", "1")];
pub static GBUFFER_PREPASS_VERT: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_vertex",
profile: "vs_6_0",
label: "gbuffer_prepass_vert.slang",
defines: GB_STATIC,
};
pub static GBUFFER_PREPASS_VERT_INSTANCED: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_vertex_instanced",
profile: "vs_6_0",
label: "gbuffer_prepass_vert_instanced.slang",
defines: GB_INSTANCED,
};
pub static GBUFFER_PREPASS_VERT_SKINNED: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_vertex_skinned",
profile: "vs_6_0",
label: "gbuffer_prepass_vert_skinned.slang",
defines: GB_SKINNED,
};
pub static GBUFFER_BINDLESS_VERT: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_vertex_bindless",
profile: "vs_6_0",
label: "gbuffer_prepass_vert_bindless.slang",
defines: GB_BINDLESS,
};
pub static GBUFFER_PREPASS_FRAG: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_fragment",
profile: "ps_6_0",
label: "gbuffer_prepass_frag.slang",
defines: GB_FRAGMENT,
};
pub static GBUFFER_BINDLESS_FRAG: SlangProgram = SlangProgram {
file: "gbuffer_prepass.slang",
entry: "gbuffer_prepass_fragment_bindless",
profile: "ps_6_0",
label: "gbuffer_prepass_frag_bindless.slang",
defines: GB_FRAGMENT_BINDLESS,
};
pub static SHADOW_VERT: SlangProgram = SlangProgram {
file: "shadow.slang",
entry: "shadow_vertex_main",
profile: "vs_6_0",
label: "shadow_vert.slang",
defines: SHADOW_STATIC,
};
pub static SKINNED_SHADOW_VERT: SlangProgram = SlangProgram {
file: "shadow.slang",
entry: "shadow_vertex_main_skinned",
profile: "vs_6_0",
label: "shadow_vert_skinned.slang",
defines: SHADOW_SKINNED,
};
pub static SHADOW_BINDLESS_VERT: SlangProgram = SlangProgram {
file: "shadow.slang",
entry: "shadow_vertex_bindless",
profile: "vs_6_0",
label: "shadow_vert_bindless.slang",
defines: SHADOW_BINDLESS,
};
const FOG_FROXEL_DEFINES: &[(&str, &str)] = &[("FOG_FROXEL", "1"), ("DXIL_SPLIT", "1")];
pub static FOG_FROXEL: SlangProgram = SlangProgram {
file: "fog.slang",
entry: "fog_froxel_kernel",
profile: "cs_6_0",
label: "fog_froxel.slang",
defines: FOG_FROXEL_DEFINES,
};
pub static FOG_FRAG: SlangProgram = SlangProgram {
file: "fog.slang",
entry: "fog_fragment",
profile: "ps_6_0",
label: "fog_frag.slang",
defines: &[("USE_MSAA", "0"), ("DXIL_STAGE_PACKING", "1")],
};
pub static FOG_FRAG_MSAA: SlangProgram = SlangProgram {
file: "fog.slang",
entry: "fog_fragment",
profile: "ps_6_0",
label: "fog_frag_msaa.slang",
defines: &[("USE_MSAA", "1"), ("DXIL_STAGE_PACKING", "1")],
};
pub static AUTO_EXPOSURE_BUILD: SlangProgram = SlangProgram {
file: "auto_exposure.slang",
entry: "histogram_build",
profile: "cs_6_0",
label: "auto_exposure_build.slang",
defines: &[("AE_BUILD", "1")],
};
pub static AUTO_EXPOSURE_AVERAGE: SlangProgram = SlangProgram {
file: "auto_exposure.slang",
entry: "histogram_average",
profile: "cs_6_0",
label: "auto_exposure_average.slang",
defines: &[("AE_AVERAGE", "1")],
};
pub static RT_SKIN: SlangProgram = SlangProgram {
file: "rt_skin.slang",
entry: "rt_skin",
profile: "cs_6_5",
label: "rt_skin.slang",
defines: &[],
};
pub static PARTICLE_SIMULATE: SlangProgram = SlangProgram {
file: "particle_simulate.slang",
entry: "particle_simulate",
profile: "cs_6_0",
label: "particle_simulate.slang",
defines: &[],
};
pub static FULLSCREEN_VERT: SlangProgram = SlangProgram {
file: "fullscreen.slang",
entry: "fullscreen_vertex",
profile: "vs_6_0",
label: "fullscreen_vert.slang",
defines: &[],
};
pub static TAA_FRAG: SlangProgram = SlangProgram {
file: "taa.slang",
entry: "taa_fragment_main",
profile: "ps_6_0",
label: "taa_frag.slang",
defines: &[],
};
pub static BLOOM_PREFILTER: SlangProgram = SlangProgram {
file: "bloom.slang",
entry: "bloom_prefilter_fragment",
profile: "ps_6_0",
label: "bloom_prefilter.slang",
defines: &[("BLOOM_PREFILTER", "1")],
};
pub static BLOOM_DOWNSAMPLE: SlangProgram = SlangProgram {
file: "bloom.slang",
entry: "bloom_downsample_fragment",
profile: "ps_6_0",
label: "bloom_downsample.slang",
defines: &[("BLOOM_DOWNSAMPLE", "1")],
};
pub static BLOOM_UPSAMPLE: SlangProgram = SlangProgram {
file: "bloom.slang",
entry: "bloom_upsample_fragment",
profile: "ps_6_0",
label: "bloom_upsample.slang",
defines: &[("BLOOM_UPSAMPLE", "1")],
};
pub static COMPOSITE_FRAG: SlangProgram = SlangProgram {
file: "composite.slang",
entry: "composite_fragment",
profile: "ps_6_0",
label: "composite_frag.slang",
defines: &[],
};
pub static SSAO_KERNEL: SlangProgram = SlangProgram {
file: "ssao.slang",
entry: "ssao_kernel_fragment",
profile: "ps_6_0",
label: "ssao_kernel.slang",
defines: &[("SSAO_KERNEL", "1")],
};
pub static SSAO_BLUR: SlangProgram = SlangProgram {
file: "ssao.slang",
entry: "ssao_blur_fragment",
profile: "ps_6_0",
label: "ssao_blur.slang",
defines: &[("SSAO_BLUR", "1")],
};
pub static SSR_RESOLVE: SlangProgram = SlangProgram {
file: "ssr.slang",
entry: "ssr_resolve_fragment",
profile: "ps_6_0",
label: "ssr_resolve.slang",
defines: SSR_DEFINES,
};
pub static SSGI_GATHER: SlangProgram = SlangProgram {
file: "ssgi.slang",
entry: "ssgi_gather_fragment",
profile: "ps_6_0",
label: "ssgi_gather.slang",
defines: &[("SSGI_GATHER", "1")],
};
pub static SSGI_COMPOSITE: SlangProgram = SlangProgram {
file: "ssgi.slang",
entry: "ssgi_composite_fragment",
profile: "ps_6_0",
label: "ssgi_composite.slang",
defines: &[("SSGI_COMPOSITE", "1")],
};
pub static REFLECTION_BLUR: SlangProgram = SlangProgram {
file: "reflection.slang",
entry: "reflection_blur_fragment",
profile: "ps_6_0",
label: "reflection_blur.slang",
defines: &[("REFLECTION_BLUR", "1")],
};
pub static REFLECTION_COMPOSITE: SlangProgram = SlangProgram {
file: "reflection.slang",
entry: "reflection_composite_fragment",
profile: "ps_6_0",
label: "reflection_composite.slang",
defines: &[("REFLECTION_COMPOSITE", "1")],
};
pub static RT_REFLECTIONS_FRAG: SlangProgram = SlangProgram {
file: "rt_reflections.slang",
entry: "rt_reflections_fragment",
profile: "ps_6_5",
label: "rt_reflections.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8")],
};
pub static RT_REFLECTIONS_FRAG_TEXTURED: SlangProgram = SlangProgram {
file: "rt_reflections.slang",
entry: "rt_reflections_fragment",
profile: "ps_6_5",
label: "rt_reflections_textured.slang",
defines: &[("DXIL_ABI", "1"), ("RT_TEXTURED", "1"), ("MAX_PROBES", "8")],
};
pub static GLASS_VERT: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_vertex",
profile: "vs_6_0",
label: "glass_vert.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8")],
};
pub static GLASS_FRAG: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_fragment",
profile: "ps_6_0",
label: "glass_frag.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "0")],
};
pub static GLASS_FRAG_MSAA: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_fragment",
profile: "ps_6_0",
label: "glass_frag_msaa.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "1")],
};
pub static GLASS_RT_FRAG: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_rt_fragment",
profile: "ps_6_5",
label: "glass_frag_rt.slang",
defines: &[
("DXIL_ABI", "1"),
("GLASS_RT", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "0"),
],
};
pub static GLASS_RT_FRAG_MSAA: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_rt_fragment",
profile: "ps_6_5",
label: "glass_frag_rt_msaa.slang",
defines: &[
("DXIL_ABI", "1"),
("GLASS_RT", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "1"),
],
};
pub static GLASS_RT_FRAG_TEXTURED: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_rt_fragment",
profile: "ps_6_5",
label: "glass_frag_rt_textured.slang",
defines: &[
("DXIL_ABI", "1"),
("GLASS_RT", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "0"),
],
};
pub static GLASS_RT_FRAG_TEXTURED_MSAA: SlangProgram = SlangProgram {
file: "glass.slang",
entry: "glass_rt_fragment",
profile: "ps_6_5",
label: "glass_frag_rt_textured_msaa.slang",
defines: &[
("DXIL_ABI", "1"),
("GLASS_RT", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "1"),
],
};
const GLASS_MESH_DEFINES: &[(&str, &str)] =
&[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "0")];
const GLASS_MESH_MSAA_DEFINES: &[(&str, &str)] =
&[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "1")];
const GLASS_MESH_TEXTURED_DEFINES: &[(&str, &str)] = &[
("DXIL_ABI", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "0"),
];
const GLASS_MESH_TEXTURED_MSAA_DEFINES: &[(&str, &str)] = &[
("DXIL_ABI", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "1"),
];
pub static GLASS_MESH_VERT: SlangProgram = SlangProgram {
file: "glass_mesh.slang",
entry: "glass_mesh_vertex",
profile: "vs_6_0",
label: "glass_mesh_vert.slang",
defines: GLASS_MESH_DEFINES,
};
pub static GLASS_MESH_RT_FRAG: SlangProgram = SlangProgram {
file: "glass_mesh.slang",
entry: "glass_mesh_rt_fragment",
profile: "ps_6_5",
label: "glass_mesh_frag_rt.slang",
defines: GLASS_MESH_DEFINES,
};
pub static GLASS_MESH_RT_FRAG_MSAA: SlangProgram = SlangProgram {
file: "glass_mesh.slang",
entry: "glass_mesh_rt_fragment",
profile: "ps_6_5",
label: "glass_mesh_frag_rt_msaa.slang",
defines: GLASS_MESH_MSAA_DEFINES,
};
pub static GLASS_MESH_RT_FRAG_TEXTURED: SlangProgram = SlangProgram {
file: "glass_mesh.slang",
entry: "glass_mesh_rt_fragment",
profile: "ps_6_5",
label: "glass_mesh_frag_rt_textured.slang",
defines: GLASS_MESH_TEXTURED_DEFINES,
};
pub static GLASS_MESH_RT_FRAG_TEXTURED_MSAA: SlangProgram = SlangProgram {
file: "glass_mesh.slang",
entry: "glass_mesh_rt_fragment",
profile: "ps_6_5",
label: "glass_mesh_frag_rt_textured_msaa.slang",
defines: GLASS_MESH_TEXTURED_MSAA_DEFINES,
};
pub static WATER_VERT: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_vertex",
profile: "vs_6_0",
label: "water_vert.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8")],
};
pub static WATER_FRAG: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_fragment",
profile: "ps_6_0",
label: "water_frag.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "0")],
};
pub static WATER_FRAG_MSAA: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_fragment",
profile: "ps_6_0",
label: "water_frag_msaa.slang",
defines: &[("DXIL_ABI", "1"), ("MAX_PROBES", "8"), ("USE_MSAA", "1")],
};
pub static WATER_RT_FRAG: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_rt_fragment",
profile: "ps_6_5",
label: "water_frag_rt.slang",
defines: &[
("DXIL_ABI", "1"),
("WATER_RT", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "0"),
],
};
pub static WATER_RT_FRAG_MSAA: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_rt_fragment",
profile: "ps_6_5",
label: "water_frag_rt_msaa.slang",
defines: &[
("DXIL_ABI", "1"),
("WATER_RT", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "1"),
],
};
pub static WATER_RT_FRAG_TEXTURED: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_rt_fragment",
profile: "ps_6_5",
label: "water_frag_rt_textured.slang",
defines: &[
("DXIL_ABI", "1"),
("WATER_RT", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "0"),
],
};
pub static WATER_RT_FRAG_TEXTURED_MSAA: SlangProgram = SlangProgram {
file: "water.slang",
entry: "water_rt_fragment",
profile: "ps_6_5",
label: "water_frag_rt_textured_msaa.slang",
defines: &[
("DXIL_ABI", "1"),
("WATER_RT", "1"),
("RT_TEXTURED", "1"),
("MAX_PROBES", "8"),
("USE_MSAA", "1"),
],
};
const PARTICLE_ABI: &[(&str, &str)] = &[("DXIL_ABI", "1")];
pub static PARTICLE_VERT: SlangProgram = SlangProgram {
file: "particle.slang",
entry: "particle_vertex",
profile: "vs_6_0",
label: "particle_vert.slang",
defines: PARTICLE_ABI,
};
pub static PARTICLE_FRAG: SlangProgram = SlangProgram {
file: "particle.slang",
entry: "particle_fragment",
profile: "ps_6_0",
label: "particle_frag.slang",
defines: PARTICLE_ABI,
};
pub static DECAL_VERT: SlangProgram = SlangProgram {
file: "decal.slang",
entry: "decal_vertex",
profile: "vs_6_0",
label: "decal_vert.slang",
defines: &[],
};
pub static DECAL_FRAG: SlangProgram = SlangProgram {
file: "decal.slang",
entry: "decal_fragment",
profile: "ps_6_0",
label: "decal_frag.slang",
defines: &[("USE_MSAA", "0")],
};
pub static DECAL_FRAG_MSAA: SlangProgram = SlangProgram {
file: "decal.slang",
entry: "decal_fragment",
profile: "ps_6_0",
label: "decal_frag_msaa.slang",
defines: &[("USE_MSAA", "1")],
};
pub static LINE_VERT: SlangProgram = SlangProgram {
file: "line.slang",
entry: "line_vertex",
profile: "vs_6_0",
label: "line_vert.slang",
defines: &[],
};
pub static LINE_FRAG: SlangProgram = SlangProgram {
file: "line.slang",
entry: "line_fragment",
profile: "ps_6_0",
label: "line_frag.slang",
defines: &[("USE_MSAA", "0")],
};
pub static LINE_FRAG_MSAA: SlangProgram = SlangProgram {
file: "line.slang",
entry: "line_fragment",
profile: "ps_6_0",
label: "line_frag_msaa.slang",
defines: &[("USE_MSAA", "1")],
};
pub static TEXT_VERT: SlangProgram = SlangProgram {
file: "text.slang",
entry: "text_vertex_main",
profile: "vs_6_0",
label: "text_vert.slang",
defines: &[],
};
pub static TEXT_FRAG: SlangProgram = SlangProgram {
file: "text.slang",
entry: "text_fragment_main",
profile: "ps_6_0",
label: "text_frag.slang",
defines: &[],
};
pub static ALL: &[&SlangProgram] = &[
&MAIN_BINDLESS_VERT,
&MAIN_BINDLESS_FRAG,
&LIGHT_CULL,
&RT_SKIN,
&HIZ_INIT_SINGLE,
&HIZ_INIT_MSAA,
&HIZ_DOWNSAMPLE,
&GBUFFER_PREPASS_VERT,
&GBUFFER_PREPASS_VERT_INSTANCED,
&GBUFFER_PREPASS_VERT_SKINNED,
&GBUFFER_BINDLESS_VERT,
&GBUFFER_PREPASS_FRAG,
&GBUFFER_BINDLESS_FRAG,
&SHADOW_VERT,
&SKINNED_SHADOW_VERT,
&SHADOW_BINDLESS_VERT,
&FOG_FROXEL,
&FOG_FRAG,
&FOG_FRAG_MSAA,
&AUTO_EXPOSURE_BUILD,
&AUTO_EXPOSURE_AVERAGE,
&PARTICLE_SIMULATE,
&FULLSCREEN_VERT,
&TAA_FRAG,
&BLOOM_PREFILTER,
&BLOOM_DOWNSAMPLE,
&BLOOM_UPSAMPLE,
&COMPOSITE_FRAG,
&SSAO_KERNEL,
&SSAO_BLUR,
&SSR_RESOLVE,
&SSGI_GATHER,
&SSGI_COMPOSITE,
&REFLECTION_BLUR,
&REFLECTION_COMPOSITE,
&RT_REFLECTIONS_FRAG,
&RT_REFLECTIONS_FRAG_TEXTURED,
&GLASS_VERT,
&GLASS_FRAG,
&GLASS_FRAG_MSAA,
&GLASS_RT_FRAG,
&GLASS_RT_FRAG_MSAA,
&GLASS_RT_FRAG_TEXTURED,
&GLASS_RT_FRAG_TEXTURED_MSAA,
&GLASS_MESH_VERT,
&GLASS_MESH_RT_FRAG,
&GLASS_MESH_RT_FRAG_MSAA,
&GLASS_MESH_RT_FRAG_TEXTURED,
&GLASS_MESH_RT_FRAG_TEXTURED_MSAA,
&WATER_VERT,
&WATER_FRAG,
&WATER_FRAG_MSAA,
&WATER_RT_FRAG,
&WATER_RT_FRAG_MSAA,
&WATER_RT_FRAG_TEXTURED,
&WATER_RT_FRAG_TEXTURED_MSAA,
&PARTICLE_VERT,
&PARTICLE_FRAG,
&DECAL_VERT,
&DECAL_FRAG,
&DECAL_FRAG_MSAA,
&LINE_VERT,
&LINE_FRAG,
&LINE_FRAG_MSAA,
&TEXT_VERT,
&TEXT_FRAG,
];
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec::Vec;
#[test]
fn every_program_has_a_distinct_label() {
let mut labels: Vec<&str> = ALL.iter().map(|p| p.label).collect();
let declared = labels.len();
labels.sort_unstable();
labels.dedup();
assert_eq!(
labels.len(),
declared,
"two programs share a label, so they would share a precompiled artifact"
);
}
#[test]
fn every_program_names_an_embedded_shader() {
for p in ALL {
assert!(
crate::shaders::embedded(p.file).is_some(),
"{}: no embedded {}",
p.label,
p.file
);
}
}
#[test]
fn the_table_carries_every_declared_program() {
for p in ALL {
assert!(!p.entry.is_empty() && !p.profile.is_empty(), "{}", p.label);
}
assert!(
ALL.len() >= 60,
"the DirectX program set shrank unexpectedly"
);
}
}