From 792409145d5fec21ead4145215c42aa7b8406b85 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Sat, 14 Mar 2020 16:56:12 +0100 Subject: [PATCH] unhardcode shader descriptor layout --- engine/src/render/vulkan/pipeline.rs | 41 ++++++++++++++--- engine/src/render/vulkan/shaders.rs | 67 +++++++--------------------- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/engine/src/render/vulkan/pipeline.rs b/engine/src/render/vulkan/pipeline.rs index 80b1338..ce79294 100644 --- a/engine/src/render/vulkan/pipeline.rs +++ b/engine/src/render/vulkan/pipeline.rs @@ -2,6 +2,7 @@ use std::borrow::Cow; use std::sync::Arc; use vulkano::buffer as vb; +use vulkano::descriptor::descriptor as vdD; use vulkano::descriptor::descriptor_set as vdd; use vulkano::device as vd; use vulkano::format::Format; @@ -37,11 +38,34 @@ impl Forward { name: "forward_vert.spv".to_string(), ty: vps::GraphicsShaderType::Vertex, inputs: vec![ - vps::ShaderInterfaceDefEntry { location: 0..1, format: Format::R32G32B32Sfloat, name: Some(Cow::Borrowed("pos")) }, - vps::ShaderInterfaceDefEntry { location: 1..2, format: Format::R32G32B32Sfloat, name: Some(Cow::Borrowed("color")) }, + vps::ShaderInterfaceDefEntry { + location: 0..1, format: Format::R32G32B32Sfloat, + name: Some(Cow::Borrowed("pos")), + }, + vps::ShaderInterfaceDefEntry { + location: 1..2, format: Format::R32G32B32Sfloat, + name: Some(Cow::Borrowed("color")), + }, ], outputs: vec![ - vps::ShaderInterfaceDefEntry { location: 0..1, format: Format::R32G32B32Sfloat, name: Some(Cow::Borrowed("fragColor")) } + vps::ShaderInterfaceDefEntry { + location: 0..1, format: Format::R32G32B32Sfloat, + name: Some(Cow::Borrowed("fragColor")), + } + ], + uniforms: vec![ + vdD::DescriptorDesc { + ty: vdD::DescriptorDescTy::Buffer(vdD::DescriptorBufferDesc { + dynamic: Some(false), + storage: false, + }), + array_count: 1, + readonly: true, + stages: vdD::ShaderStages { + vertex: true, + ..vdD::ShaderStages::none() + }, + }, ], }.load_into(device.clone()).expect("could not load vertex shader"); @@ -49,11 +73,18 @@ impl Forward { name: "forward_frag.spv".to_string(), ty: vps::GraphicsShaderType::Fragment, inputs: vec![ - vps::ShaderInterfaceDefEntry { location: 0..1, format: Format::R32G32B32Sfloat, name: Some(Cow::Borrowed("fragColor")) } + vps::ShaderInterfaceDefEntry { + location: 0..1, format: Format::R32G32B32Sfloat, + name: Some(Cow::Borrowed("fragColor")), + } ], outputs: vec![ - vps::ShaderInterfaceDefEntry { location: 0..1, format: Format::R32G32B32A32Sfloat, name: Some(Cow::Borrowed("outColor")) } + vps::ShaderInterfaceDefEntry { + location: 0..1, format: Format::R32G32B32A32Sfloat, + name: Some(Cow::Borrowed("outColor")), + } ], + uniforms: vec![], }.load_into(device.clone()).expect("could not load fragment shader"); let dimensions = [viewport_dimensions[0] as f32, viewport_dimensions[1] as f32]; diff --git a/engine/src/render/vulkan/shaders.rs b/engine/src/render/vulkan/shaders.rs index f435196..3d4266f 100644 --- a/engine/src/render/vulkan/shaders.rs +++ b/engine/src/render/vulkan/shaders.rs @@ -15,6 +15,7 @@ pub struct ShaderDefinition { pub ty: vps::GraphicsShaderType, pub inputs: Vec, pub outputs: Vec, + pub uniforms: Vec, } impl ShaderDefinition { @@ -55,27 +56,7 @@ impl LoadedShader { } fn layout(&self) -> RuntimeShaderLayout { - let sets = vec![ - vec![ - vdd::DescriptorDesc { - ty: vdd::DescriptorDescTy::Buffer(vdd::DescriptorBufferDesc { - dynamic: Some(false), - storage: false, - }), - array_count: 1, - readonly: true, - stages: vdd::ShaderStages { - vertex: true, - ..vdd::ShaderStages::none() - }, - }, - ], - ]; - match self.def.ty { - vps::GraphicsShaderType::Vertex => RuntimeShaderLayout::vertex(sets.clone()), - vps::GraphicsShaderType::Fragment => RuntimeShaderLayout::fragment(sets.clone()), - _ => panic!("unknown shader type") - } + RuntimeShaderLayout{ descs: vec![self.def.uniforms.clone()], push_constants: vec![], } } pub fn entry_point<'a, S>(&'a self) -> vps::GraphicsEntryPoint<'a, S, ShaderInterface, ShaderInterface, RuntimeShaderLayout> { @@ -95,48 +76,34 @@ impl LoadedShader { #[derive (Debug, Clone)] pub struct RuntimeShaderLayout { - sets: Vec>, - - vertex: bool, - fragment: bool, -} - -impl RuntimeShaderLayout { - fn vertex(sets: Vec>) -> RuntimeShaderLayout { - RuntimeShaderLayout { - sets, - vertex: true, - fragment: false, - } - } - fn fragment(sets: Vec>) -> RuntimeShaderLayout { - RuntimeShaderLayout { - sets, - vertex: false, - fragment: true, - } - } + descs: Vec>, + push_constants: Vec, } unsafe impl vdp::PipelineLayoutDesc for RuntimeShaderLayout { - fn num_sets(&self) -> usize { self.sets.len() } + fn num_sets(&self) -> usize { self.descs.len() } fn num_bindings_in_set(&self, set: usize) -> Option { - if set >= self.sets.len() { + if set >= self.descs.len() { return None } - Some(self.sets[set].len()) + Some(self.descs[set].len()) } fn descriptor(&self, set: usize, binding: usize) -> Option { - if set >= self.sets.len() { + if set >= self.descs.len() { return None } - if binding >= self.sets[set].len() { + if binding >= self.descs[set].len() { return None } - Some(self.sets[set][binding].clone()) + Some(self.descs[set][binding].clone()) + } + fn num_push_constants_ranges(&self) -> usize { self.push_constants.len() } + fn push_constants_range(&self, num: usize) -> Option { + if num >= self.push_constants.len() { + return None + } + Some(self.push_constants[0].clone()) } - fn num_push_constants_ranges(&self) -> usize { 0 } - fn push_constants_range(&self, _num: usize) -> Option { None } //fn num_push_constants_ranges(&self) -> usize { 1 } //fn push_constants_range(&self, num: usize) -> Option { // match num {