M examples/rendy.rs +10 -22
@@ 38,7 38,8 @@ fn compile_shader() -> Vec<u8> {
}],
returns: Type("F32".into()),
//body: vec![Expr::Var("input".into())],
- body: vec![Expr::Literal(Lit::F32(0.5))],
+ body: vec![Expr::Literal(Lit::F32(0.1))],
+
});
let program = vec![vert, frag];
let ctx = ch::verify::verify(program).unwrap();
@@ 63,15 64,15 @@ lazy_static::lazy_static! {
SourceLanguage::GLSL,
"main",
).precompile().unwrap();
- //static ref FRAGMENT: SpirvShader = SpirvShader::new(SHADER.clone(), hal::pso::ShaderStageFlags::FRAGMENT, "_fragment_entry");
+ static ref FRAGMENT: SpirvShader = SpirvShader::new(SHADER.clone(), hal::pso::ShaderStageFlags::FRAGMENT, "_fragment_entry");
- static ref FRAGMENT: SpirvShader = SourceShaderInfo::new(
- include_str!("shader.frag"),
- concat!(env!("CARGO_MANIFEST_DIR"), "/examples/sprite/shader.frag").into(),
- ShaderKind::Fragment,
- SourceLanguage::GLSL,
- "main",
- ).precompile().unwrap();
+ // static ref FRAGMENT: SpirvShader = SourceShaderInfo::new(
+ // include_str!("shader.frag"),
+ // concat!(env!("CARGO_MANIFEST_DIR"), "/examples/sprite/shader.frag").into(),
+ // ShaderKind::Fragment,
+ // SourceLanguage::GLSL,
+ // "main",
+ // ).precompile().unwrap();
static ref SHADERS: rendy::shader::ShaderSetBuilder = rendy::shader::ShaderSetBuilder::default()
.with_vertex(&*VERTEX).unwrap()
@@ 228,22 229,11 @@ fn run(
let elapsed_ns = elapsed.as_secs() * 1_000_000_000 + elapsed.subsec_nanos() as u64;
- log::info!(
- "Elapsed: {:?}. Frames: {}. FPS: {}",
- elapsed,
- frames.start,
- frames.start * 1_000_000_000 / elapsed_ns
- );
-
graph.dispose(factory, &());
Ok(())
}
fn main() {
- env_logger::Builder::from_default_env()
- .filter_module("triangle", log::LevelFilter::Trace)
- .init();
-
let config: Config = Default::default();
let (mut factory, mut families): (Factory<Backend>, _) = rendy::factory::init(config).unwrap();
@@ 278,5 268,3 @@ fn main() {
run(&mut event_loop, &mut factory, &mut families, graph).unwrap();
}
-
-kk
M src/compile/mod.rs +8 -1
@@ 604,6 604,7 @@ impl CContext {
ctx: &verify::VContext,
name: &str,
) -> Result<(spirv::Word, Vec<spirv::Word>), crate::Error> {
+ use std::convert::TryFrom;
// Dig up the function def, and declare input/output global vars for it.
// TODO: Name strings for input/output vars?
let def = ctx.get_defined_function(name);
@@ 611,7 612,8 @@ impl CContext {
// Value, value type, pointer type.
let input_words: Vec<(spirv::Word, spirv::Word, spirv::Word)> = params
.iter()
- .map(|p| {
+ .enumerate()
+ .map(|(i, p)| {
let t_word = self.get_type(p);
// We don't bother storing pointer types in our typetable for now,
// this is basically the only place they're used.
@@ 621,6 623,9 @@ impl CContext {
let value_word =
self.b
.variable(t_ptr_word, None, spirv::StorageClass::Input, None);
+ // Gotta tell it what locations/etc the inputs are.
+ // FOR NOW we just enumerate the function args in order.
+ self.b.decorate(value_word, spirv::Decoration::Location, [rspirv::mr::Operand::LiteralInt32(u32::try_from(i).unwrap())]);
(value_word, t_word, t_ptr_word)
})
.collect();
@@ 633,6 638,8 @@ impl CContext {
let value_word =
self.b
.variable(t_ptr_word, None, spirv::StorageClass::Output, None);
+ // Output word is always just location=0
+ self.b.decorate(value_word, spirv::Decoration::Location, [rspirv::mr::Operand::LiteralInt32(0)]);
(value_word, t_word, t_ptr_word)
};