srs2dge-core 0.2.0

Simple Rust 2D Game Engine
Documentation
use crate::{label, target::Target};
use std::borrow::Cow;
use wgpu::ShaderModuleDescriptor;

//

pub use naga::{FastHashMap, ShaderStage};
pub use wgpu::ShaderSource;

//

pub struct ShaderModule<'a> {
    pub(crate) inner: wgpu::ShaderModule,
    pub(crate) source: ShaderSource<'a>,
}

//

impl<'a> ShaderModule<'a> {
    pub fn new_wgsl_source(target: &Target, source: Cow<'a, str>) -> Result<Self, String> {
        Self::new(target, ShaderSource::Wgsl(source))
    }

    #[cfg(feature = "glsl")]
    pub fn new_glsl_source(
        target: &Target,
        source: Cow<'a, str>,
        stage: ShaderStage,
        defines: FastHashMap<String, String>,
    ) -> Result<Self, String> {
        Self::new(
            target,
            ShaderSource::Glsl {
                shader: source,
                stage,
                defines,
            },
        )
    }

    #[cfg(feature = "spirv")]
    pub fn new_spirv_source(target: &Target, source: &'a [u32]) -> Result<Self, String> {
        Self::new(target, ShaderSource::SpirV(Cow::Borrowed(source)))
    }

    pub fn new(target: &Target, source: ShaderSource<'a>) -> Result<Self, String> {
        Self::from_descriptor(
            target,
            ShaderModuleDescriptor {
                label: label!(),
                source,
            },
        )
    }

    fn from_descriptor(
        target: &Target,
        descriptor: ShaderModuleDescriptor<'a>,
    ) -> Result<Self, String> {
        Ok(Self {
            inner: target.catch_error(|engine| engine.device.create_shader_module(&descriptor))?,
            source: descriptor.source,
        })
    }
}