From d2f85fd2472ee2bb9a39158c44a8e35105e488a1 Mon Sep 17 00:00:00 2001 From: Facundo Villa Date: Wed, 21 Feb 2024 23:38:22 -0300 Subject: [PATCH] Updated binding shader generation. --- jspd/src/lexer.rs | 11 +++++- jspd/src/lib.rs | 1 + resource_management/src/shader_generation.rs | 37 +++++++++++++++----- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/jspd/src/lexer.rs b/jspd/src/lexer.rs index cc9ae9dc..fdf1fa05 100644 --- a/jspd/src/lexer.rs +++ b/jspd/src/lexer.rs @@ -145,11 +145,12 @@ impl Node { }) } - pub fn binding(name: String, set: u32, binding: u32, read: bool, write: bool) -> NodeReference { + pub fn binding(name: String, r#type: BindingTypes, set: u32, binding: u32, read: bool, write: bool) -> NodeReference { Self::internal_new(Node { parent: None, node: Nodes::Binding { name, + r#type, set, binding, read, @@ -294,6 +295,13 @@ impl Node { } } +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum BindingTypes { + Buffer, + CombinedImageSampler, + Image, +} + #[derive(Clone, Debug,)] pub enum Nodes { Null, @@ -329,6 +337,7 @@ pub enum Nodes { binding: u32, read: bool, write: bool, + r#type: BindingTypes, }, } diff --git a/jspd/src/lib.rs b/jspd/src/lib.rs index fd142ba1..90fc1a43 100644 --- a/jspd/src/lib.rs +++ b/jspd/src/lib.rs @@ -14,6 +14,7 @@ pub use lexer::Node; pub use lexer::Nodes; pub use crate::lexer::NodeReference; +pub use crate::lexer::BindingTypes; /// Compiles a BESL source code string into a JSPD. /// diff --git a/resource_management/src/shader_generation.rs b/resource_management/src/shader_generation.rs index 9833b2c8..f021f420 100644 --- a/resource_management/src/shader_generation.rs +++ b/resource_management/src/shader_generation.rs @@ -89,7 +89,7 @@ impl ShaderCompilation { if !self.minified { l_string.push_str(";\n"); } else { l_string.push(';'); } } - l_string.push_str("}\n"); + if self.minified { l_string.push('}') } else { l_string.push_str("}\n"); } string.insert_str(0, &l_string); @@ -176,9 +176,22 @@ impl ShaderCompilation { } } } - jspd::Nodes::Binding { name, set, binding, read, write, .. } => { + jspd::Nodes::Binding { name, set, binding, read, write, r#type, .. } => { let mut l_string = String::with_capacity(128); - l_string.push_str(&format!("layout(set={}, binding={}) uniform ", set, binding)); + + let binding_type = match r#type { + jspd::BindingTypes::Buffer => "buffer", + jspd::BindingTypes::Image => "image2D", + jspd::BindingTypes::CombinedImageSampler => "texture2D", + }; + + l_string.push_str(&format!("layout(set={},binding={}", set, binding)); + + if r#type == &jspd::BindingTypes::Buffer { + l_string.push_str(",scalar"); + } + + l_string.push_str(&format!(") {} ", binding_type)); if *read && !*write { l_string.push_str("readonly "); } if *write && !*read { l_string.push_str("writeonly "); } l_string.push_str(&name); @@ -256,24 +269,30 @@ mod tests { } #[test] - fn binding() { + fn bindings() { let script = r#" main: fn () -> void { - buffer; + Buffer; + image; + texture; } "#; - let root_node = jspd::Node::scope("root".to_string(), vec![jspd::Node::binding("buffer".to_string(), 0, 0, true, false)]); + let root_node = jspd::Node::scope("root".to_string(), vec![ + jspd::Node::binding("Buffer".to_string(), jspd::BindingTypes::Buffer, 0, 0, true, true), + jspd::Node::binding("image".to_string(), jspd::BindingTypes::Image, 0, 1, false, true), + jspd::Node::binding("texture".to_string(), jspd::BindingTypes::CombinedImageSampler, 1, 0, true, false), + ]); let script_node = jspd::compile_to_jspd(&script, Some(root_node)).unwrap(); let main = RefCell::borrow(&script_node).get_child("main").unwrap(); - let shader_generator = ShaderGenerator::new(); + let shader_generator = ShaderGenerator::new().minified(true); let shader = shader_generator.compilation().generate_shader(&main); - println!("{}", shader); + assert_eq!(shader, "layout(set=1,binding=0) texture2D readonly texture;layout(set=0,binding=1) image2D writeonly image;layout(set=0,binding=0,scalar) buffer Buffer;void main(){Buffer;image;texture;}"); } #[test] @@ -298,7 +317,7 @@ mod tests { let shader = shader_generator.compilation().generate_shader(&main); - assert_eq!(shader, "void main(){vec3f albedo=vec3f(1.0,0.0,0.0);}\n"); + assert_eq!(shader, "void main(){vec3f albedo=vec3f(1.0,0.0,0.0);}"); } #[test]