382d3478fd0b — icefox@dreamquest.io 5 years ago
Add location annotations to inputs/outputs.
2 files changed, 18 insertions(+), 23 deletions(-)

M examples/rendy.rs
M src/compile/mod.rs
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)
             };