mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-25 00:03:29 +00:00
Transpiler skeleton and first bits of MSL support
This commit is contained in:
parent
d39bb42f9a
commit
ed96c2b8e0
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
/target
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
||||
.DS_Store
|
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "javelin"
|
||||
version = "0.1.0"
|
||||
authors = ["Dzmitry Malyshau <kvarkus@gmail.com>"]
|
||||
|
||||
[dependencies]
|
||||
rspirv = "0.5"
|
||||
spirv_headers = "1"
|
||||
|
||||
[dev-dependencies]
|
||||
env_logger = "0.5"
|
19
examples/convert.rs
Normal file
19
examples/convert.rs
Normal file
@ -0,0 +1,19 @@
|
||||
extern crate env_logger;
|
||||
extern crate javelin;
|
||||
|
||||
use std::{env, fs};
|
||||
|
||||
fn main() {
|
||||
env_logger::init();
|
||||
|
||||
let args = env::args().collect::<Vec<_>>();
|
||||
let input = fs::read(&args[1]).unwrap();
|
||||
|
||||
let mut transpiler = javelin::Transpiler::new();
|
||||
let module = transpiler.load(&input).unwrap();
|
||||
|
||||
let options = javelin::msl::Options {};
|
||||
let msl = module.to_msl(&options).unwrap();
|
||||
println!("{}", msl);
|
||||
}
|
||||
|
69
src/lib.rs
Normal file
69
src/lib.rs
Normal file
@ -0,0 +1,69 @@
|
||||
extern crate rspirv;
|
||||
extern crate spirv_headers;
|
||||
|
||||
pub mod msl;
|
||||
|
||||
use std::collections::HashMap;
|
||||
|
||||
|
||||
pub struct Transpiler {
|
||||
}
|
||||
|
||||
pub struct Module {
|
||||
raw: rspirv::mr::Module,
|
||||
entry_points: HashMap<String, EntryPoint>,
|
||||
}
|
||||
|
||||
pub struct EntryPoint {
|
||||
pub cleansed_name: String,
|
||||
pub exec_model: spirv_headers::ExecutionModel,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
pub enum LoadError {
|
||||
Parsing,
|
||||
}
|
||||
|
||||
impl Transpiler {
|
||||
pub fn new() -> Self {
|
||||
Transpiler {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn load(&mut self, spv: &[u8]) -> Result<Module, LoadError> {
|
||||
let mut loader = rspirv::mr::Loader::new();
|
||||
rspirv::binary::Parser::new(spv, &mut loader)
|
||||
.parse()
|
||||
.map_err(|_| LoadError::Parsing)?;
|
||||
let raw = loader.module();
|
||||
|
||||
let entry_points = raw.entry_points
|
||||
.iter()
|
||||
.map(|ep| {
|
||||
let name = match ep.operands[2] {
|
||||
rspirv::mr::Operand::LiteralString(ref name) => name.to_string(),
|
||||
ref other => panic!("Unexpected entry point operand {:?}", other),
|
||||
};
|
||||
let ep = EntryPoint {
|
||||
cleansed_name: name.clone(), //TODO
|
||||
exec_model: match ep.operands[0] {
|
||||
rspirv::mr::Operand::ExecutionModel(model) => model,
|
||||
ref other => panic!("Unexpected execution model operand {:?}", other),
|
||||
},
|
||||
};
|
||||
(name, ep)
|
||||
})
|
||||
.collect();
|
||||
|
||||
Ok(Module {
|
||||
raw,
|
||||
entry_points,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Module {
|
||||
pub fn entry_points(&self) -> &HashMap<String, EntryPoint> {
|
||||
&self.entry_points
|
||||
}
|
||||
}
|
30
src/msl.rs
Normal file
30
src/msl.rs
Normal file
@ -0,0 +1,30 @@
|
||||
use std::fmt::{Error as FmtError, Write};
|
||||
|
||||
use Module;
|
||||
|
||||
|
||||
pub struct Options {
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Error {
|
||||
Format(FmtError)
|
||||
}
|
||||
|
||||
impl From<FmtError> for Error {
|
||||
fn from(e: FmtError) -> Self {
|
||||
Error::Format(e)
|
||||
}
|
||||
}
|
||||
|
||||
impl Module {
|
||||
pub fn to_msl(&self, _options: &Options) -> Result<String, Error> {
|
||||
let mut out = String::new();
|
||||
|
||||
writeln!(out, "#include <metal_stdlib>")?;
|
||||
writeln!(out, "#include <simd/simd.h>")?;
|
||||
writeln!(out, "using namespace metal;")?;
|
||||
|
||||
Ok(out)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user