pub(crate) fn world_pool_size(texture_count: usize) -> usize {
texture_count.max(1) + crate::gfx::render_types::FALLBACK_TEXTURE_COUNT
}
pub(crate) fn bindless_pool_size(texture_count: usize, ceiling_fits: bool) -> usize {
if ceiling_fits {
concinnity_core::render::uniforms::BINDLESS_POOL_SIZE
} else {
world_pool_size(texture_count)
}
}
pub(crate) struct Ctx {
pub hot_reload: bool,
pub msaa: bool,
pub pool_size: usize,
pub probe_count: usize,
}
impl Ctx {
pub(crate) fn plain(hot_reload: bool) -> Self {
Self {
hot_reload,
msaa: false,
pool_size: 0,
probe_count: 0,
}
}
}
pub(crate) fn precompile(
bundle: &mut concinnity_host::store::cache::Segment,
report: &mut crate::precompile::Report,
) {
let pool_size = concinnity_core::render::uniforms::BINDLESS_POOL_SIZE;
for program in super::slang_builtins::ALL {
let msaa_variants: &[bool] = if program.msaa {
&[false, true]
} else {
&[false]
};
for &msaa in msaa_variants {
let ctx = Ctx {
hot_reload: false,
msaa,
pool_size,
probe_count: concinnity_core::render::uniforms::MAX_PROBES,
};
let source = program.source(&ctx);
let key = program.cache_key(&source);
report.record(
program.label,
crate::shader_cache::ensure_in(bundle, &key, || {
super::slang_builtins::compile_uncached(program, &source)
}),
);
}
}
}
use crate::vulkan::slang_builtins::SlangCompile;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pool_size_counts_fallbacks() {
assert_eq!(world_pool_size(0), 3);
assert_eq!(world_pool_size(1), 3);
assert_eq!(world_pool_size(7), 9);
}
#[test]
fn world_pool_size_matches_the_uploaded_image_counts() {
for texture_count in [0usize, 1, 7, 64] {
let gpu_textures = texture_count.max(1);
assert_eq!(
world_pool_size(texture_count),
gpu_textures + crate::gfx::render_types::FALLBACK_TEXTURE_COUNT
);
assert!(world_pool_size(texture_count) > texture_count);
}
}
#[test]
fn the_ceiling_makes_the_pool_length_independent_of_the_world() {
let ceiling = concinnity_core::render::uniforms::BINDLESS_POOL_SIZE;
for texture_count in [0usize, 1, 7, 64] {
assert_eq!(bindless_pool_size(texture_count, true), ceiling);
assert_eq!(
bindless_pool_size(texture_count, false),
world_pool_size(texture_count)
);
}
}
#[test]
fn a_world_that_fits_the_ceiling_leaves_room_to_pad() {
let ceiling = concinnity_core::render::uniforms::BINDLESS_POOL_SIZE;
assert!(world_pool_size(ceiling - 3) <= ceiling);
assert!(world_pool_size(ceiling) > ceiling);
}
}