spirv-tools 0.9.0

Wrapper crate for SPIRV-Tools
Documentation
use spirv_tools as spv;
use spv::{assembler::Assembler, opt::Optimizer, val::Validator};

const CONTENT: &str = r#"OpCapability Shader
               OpMemoryModel Logical Simple
               OpEntryPoint Fragment %main "main"
               OpExecutionMode %main OriginUpperLeft
       %file = OpString "file"
       %void = OpTypeVoid
          %3 = OpTypeFunction %void
       %main = OpFunction %void None %3
          %5 = OpLabel
               OpLine %file 1 1
               OpReturn
               OpFunctionEnd"#;

#[test]
fn issue() {
    let cas = spv::assembler::compiled::CompiledAssembler::default();
    let assembled = cas
        .assemble(CONTENT, spv::assembler::AssemblerOptions::default())
        .expect("compiled failed to assemble");

    let val = spv::val::create(None);
    val.validate(&assembled, None)
        .expect("failed to validate input assembly");

    let mut iopt = spv::opt::tool::ToolOptimizer::default();
    iopt.register_pass(spv::opt::Passes::StripDebugInfo);
    let mut copt = spv::opt::compiled::CompiledOptimizer::default();
    copt.register_pass(spv::opt::Passes::StripDebugInfo);

    let iopt_output = iopt
        .optimize(
            &assembled,
            &mut |msg| {
                eprintln!("[tool] optimizer message: {:#?}", msg);
            },
            None,
        )
        .expect("failed to run tool optimizer");

    let copt_output = copt
        .optimize(
            &assembled,
            &mut |msg| {
                eprintln!("[compiled] optimizer message: {:#?}", msg);
            },
            None,
        )
        .expect("failed to run compiled optimizer");

    val.validate(iopt_output, None)
        .expect("failed to validate tool output");
    val.validate(copt_output, None)
        .expect("failed to validate compiled output");
}