From 97248e5e9f200527c39ae137b8dd8b7b8b947221 Mon Sep 17 00:00:00 2001 From: Tom Gowan Date: Mon, 29 Apr 2019 09:38:24 +1000 Subject: [PATCH] added vertex layouts --- src/layouts.rs | 41 +++++++++++++++++----------- src/reflection.rs | 12 ++++++--- tests/tests.rs | 68 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 86 insertions(+), 35 deletions(-) diff --git a/src/layouts.rs b/src/layouts.rs index f315047..10f6266 100644 --- a/src/layouts.rs +++ b/src/layouts.rs @@ -113,27 +113,38 @@ unsafe impl ShaderInterfaceDef for VertOutput { pub type VertOutputIter = std::vec::IntoIter; // This structure describes layout of this stage. -#[derive(Debug, Copy, Clone)] -pub struct VertLayout(pub ShaderStages); +#[derive(Debug, Clone)] +pub struct VertLayout { + pub stages: ShaderStages, + pub layout_data: LayoutData, +} unsafe impl PipelineLayoutDesc for VertLayout { - // Number of descriptor sets it takes. fn num_sets(&self) -> usize { - 0 + self.layout_data.num_sets } - // Number of entries (bindings) in each set. - fn num_bindings_in_set(&self, _set: usize) -> Option { - None + fn num_bindings_in_set(&self, set: usize) -> Option { + self.layout_data.num_bindings.get(&set).map(|&i| i) } - // Descriptor descriptions. - fn descriptor(&self, _set: usize, _binding: usize) -> Option { - None + fn descriptor(&self, set: usize, binding: usize) -> Option { + self.layout_data.descriptions.get(&set) + .and_then(|s|s.get(&binding)) + .map(|desc| { + let mut desc = desc.clone(); + desc.stages = self.stages.clone(); + desc + }) + } - // Number of push constants ranges (think: number of push constants). fn num_push_constants_ranges(&self) -> usize { - 0 + self.layout_data.num_constants } - // Each push constant range in memory. - fn push_constants_range(&self, _num: usize) -> Option { - None + fn push_constants_range(&self, num: usize) -> Option { + self.layout_data.pc_ranges.get(num) + .map(|desc| { + let mut desc = desc.clone(); + desc.stages = self.stages.clone(); + desc + }) + } } diff --git a/src/reflection.rs b/src/reflection.rs index 113daab..1940e30 100644 --- a/src/reflection.rs +++ b/src/reflection.rs @@ -24,6 +24,7 @@ pub struct LayoutData { pub fn create_entry(shaders: &CompiledShaders) -> Entry { let vertex_interfaces = create_interfaces(&shaders.vertex); + let vertex_layout = create_layouts(&shaders.vertex); let fragment_interfaces = create_interfaces(&shaders.fragment); let fragment_layout = create_layouts(&shaders.fragment); let frag_input = FragInput { @@ -45,10 +46,13 @@ pub fn create_entry(shaders: &CompiledShaders) -> Entry { let vert_output = VertOutput { outputs: vertex_interfaces.outputs, }; - let vert_layout = VertLayout(ShaderStages { - vertex: true, - ..ShaderStages::none() - }); + let vert_layout = VertLayout { + stages: ShaderStages { + vertex: true, + ..ShaderStages::none() + }, + layout_data: vertex_layout, + }; Entry { frag_input, frag_output, diff --git a/tests/tests.rs b/tests/tests.rs index 904858d..187a5ec 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -112,10 +112,19 @@ fn test_shade1() { vert_output: VertOutput { outputs: Vec::new(), }, - vert_layout: VertLayout(ShaderStages { - vertex: true, - ..ShaderStages::none() - }), + vert_layout: VertLayout { + stages: ShaderStages { + vertex: true, + ..ShaderStages::none() + }, + layout_data: LayoutData { + num_sets: 0, + num_bindings: HashMap::new(), + descriptions: HashMap::new(), + num_constants: 0, + pc_ranges: Vec::new(), + }, + }, }; let entry = parse("vert1.glsl", "frag1.glsl"); do_test(&entry, &target); @@ -190,10 +199,19 @@ fn test_shade2() { }, ], }, - vert_layout: VertLayout(ShaderStages { - vertex: true, - ..ShaderStages::none() - }), + vert_layout: VertLayout { + stages: ShaderStages { + vertex: true, + ..ShaderStages::none() + }, + layout_data: LayoutData { + num_sets: 0, + num_bindings: HashMap::new(), + descriptions: HashMap::new(), + num_constants: 0, + pc_ranges: Vec::new(), + }, + }, }; let entry = parse("vert2.glsl", "frag2.glsl"); do_test(&entry, &target); @@ -258,10 +276,19 @@ fn test_shade3() { vert_output: VertOutput { outputs: Vec::new(), }, - vert_layout: VertLayout(ShaderStages { - vertex: true, - ..ShaderStages::none() - }), + vert_layout: VertLayout { + stages: ShaderStages { + vertex: true, + ..ShaderStages::none() + }, + layout_data: LayoutData { + num_sets: 0, + num_bindings: HashMap::new(), + descriptions: HashMap::new(), + num_constants: 0, + pc_ranges: Vec::new(), + }, + }, }; let entry = parse("vert3.glsl", "frag3.glsl"); do_test(&entry.frag_input, &target.frag_input); @@ -320,10 +347,19 @@ fn test_shade4() { vert_output: VertOutput { outputs: Vec::new(), }, - vert_layout: VertLayout(ShaderStages { - vertex: true, - ..ShaderStages::none() - }), + vert_layout: VertLayout { + stages: ShaderStages { + vertex: true, + ..ShaderStages::none() + }, + layout_data: LayoutData { + num_sets: 0, + num_bindings: HashMap::new(), + descriptions: HashMap::new(), + num_constants: 0, + pc_ranges: Vec::new(), + }, + }, }; let entry = parse("vert4.glsl", "frag4.glsl"); do_test(&entry.frag_input, &target.frag_input);