7 releases

0.3.0-pre.3 Oct 19, 2022
0.3.0-pre.2 Sep 30, 2022
0.3.0-pre.1 Jan 19, 2022
0.2.0 Dec 11, 2018
0.1.2 Dec 2, 2018

#453 in Graphics APIs

Download history 3365/week @ 2024-07-19 2146/week @ 2024-07-26 1540/week @ 2024-08-02 3027/week @ 2024-08-09 1135/week @ 2024-08-16 1308/week @ 2024-08-23 1844/week @ 2024-08-30 2117/week @ 2024-09-06 2069/week @ 2024-09-13 2312/week @ 2024-09-20 3399/week @ 2024-09-27 5556/week @ 2024-10-04 7818/week @ 2024-10-11 6669/week @ 2024-10-18 9325/week @ 2024-10-25 9700/week @ 2024-11-01

34,234 downloads per month

MIT license

37KB
725 lines

🥽 shader-prepper

Crates.io Docs

shader-prepper is a shader include parser and crawler. It is mostly aimed at GLSL which doesn't provide include directive support out of the box.

This crate does not implement a full C-like preprocessor, only #include scanning. Other directives are instead copied into the expanded code, so they can be subsequently handled by the shader compiler.

The API supports user-driven include file providers, which enable custom virtual file systems, include paths, and allow build systems to track dependencies.

Source files are not concatenated together, but returned as a Vec of SourceChunk. If a single string is needed, a join over the source strings can be used. Otherwise, the individual chunks can be passed to the graphics API, and source info contained within SourceChunk can then remap the compiler's errors back to the original code.

Example

struct FileIncludeProvider;
impl shader_prepper::IncludeProvider for FileIncludeProvider {
    type IncludeContext = ();

    fn get_include(
        &mut self,
        path: &str,
        _context: &Self::IncludeContext,
    ) -> Result<(String, Self::IncludeContext), crate::BoxedIncludeProviderError> {
        Ok((std::fs::read_to_string(path)?, ()))
    }
}

// ...

let chunks = shader_prepper::process_file("myfile.glsl", &mut FileIncludeProvider, ());

License: MIT

Dependencies

~0.3–1.2MB
~25K SLoC