basalt 0.21.0

A window/ui framework built upon vulkan.
Documentation
use std::collections::BTreeMap;
use std::sync::{Arc, OnceLock};

use vulkano::descriptor_set::layout::{
    DescriptorBindingFlags, DescriptorSetLayoutBinding, DescriptorSetLayoutCreateFlags,
    DescriptorSetLayoutCreateInfo, DescriptorType,
};
use vulkano::device::Device;
use vulkano::pipeline::layout::{PipelineDescriptorSetLayoutCreateInfo, PipelineLayoutCreateFlags};
use vulkano::shader::{ShaderModule, ShaderStages};

static UI_VS_MODULE: OnceLock<Arc<ShaderModule>> = OnceLock::new();

pub fn ui_vs_sm(device: Arc<Device>) -> Arc<ShaderModule> {
    UI_VS_MODULE
        .get_or_init(move || ui_vs::load(device).unwrap())
        .clone()
}

pub mod ui_vs {
    vulkano_shaders::shader! {
        ty: "vertex",
        vulkan_version: "1.2",
        spirv_version: "1.5",
        path: "./src/render/shaders/ui.vs"
    }
}

static UI_FS_MODULE: OnceLock<Arc<ShaderModule>> = OnceLock::new();

pub fn ui_fs_sm(device: Arc<Device>) -> Arc<ShaderModule> {
    UI_FS_MODULE
        .get_or_init(move || ui_fs::load(device).unwrap())
        .clone()
}

pub mod ui_fs {
    vulkano_shaders::shader! {
        ty: "fragment",
        vulkan_version: "1.2",
        spirv_version: "1.5",
        path: "./src/render/shaders/ui.fs"
    }
}

pub fn pipeline_descriptor_set_layout_create_info(
    image_capacity: u32,
) -> PipelineDescriptorSetLayoutCreateInfo {
    PipelineDescriptorSetLayoutCreateInfo {
        flags: PipelineLayoutCreateFlags::empty(),
        set_layouts: vec![DescriptorSetLayoutCreateInfo {
            flags: DescriptorSetLayoutCreateFlags::empty(),
            bindings: BTreeMap::from([
                (
                    0,
                    DescriptorSetLayoutBinding {
                        binding_flags: DescriptorBindingFlags::empty(),
                        descriptor_count: 1,
                        stages: ShaderStages::FRAGMENT,
                        immutable_samplers: Vec::new(),
                        ..DescriptorSetLayoutBinding::descriptor_type(DescriptorType::Sampler)
                    },
                ),
                (
                    1,
                    DescriptorSetLayoutBinding {
                        binding_flags: DescriptorBindingFlags::VARIABLE_DESCRIPTOR_COUNT,
                        descriptor_count: image_capacity,
                        stages: ShaderStages::FRAGMENT,
                        immutable_samplers: Vec::new(),
                        ..DescriptorSetLayoutBinding::descriptor_type(DescriptorType::SampledImage)
                    },
                ),
            ]),
            ..DescriptorSetLayoutCreateInfo::default()
        }],
        push_constant_ranges: Vec::new(),
    }
}

static FINAL_VS_MODULE: OnceLock<Arc<ShaderModule>> = OnceLock::new();

pub fn final_vs_sm(device: Arc<Device>) -> Arc<ShaderModule> {
    FINAL_VS_MODULE
        .get_or_init(move || final_vs::load(device).unwrap())
        .clone()
}

pub mod final_vs {
    vulkano_shaders::shader! {
        ty: "vertex",
        vulkan_version: "1.2",
        spirv_version: "1.5",
        path: "./src/render/shaders/final.vs"
    }
}

static FINAL_FS_MODULE: OnceLock<Arc<ShaderModule>> = OnceLock::new();

pub fn final_fs_sm(device: Arc<Device>) -> Arc<ShaderModule> {
    FINAL_FS_MODULE
        .get_or_init(move || final_fs::load(device).unwrap())
        .clone()
}

pub mod final_fs {
    vulkano_shaders::shader! {
        ty: "fragment",
        vulkan_version: "1.2",
        spirv_version: "1.5",
        path: "./src/render/shaders/final.fs"
    }
}