vk: pipeline layout stuff

also ringbuffer fixes
This commit is contained in:
chyyran 2022-12-06 01:38:21 -05:00
parent e7351207cf
commit 2baeae494d
5 changed files with 81 additions and 13 deletions

View file

@ -531,6 +531,7 @@ where
SemanticsErrorKind::InvalidBinding(binding), SemanticsErrorKind::InvalidBinding(binding),
)); ));
} }
Ok(TextureData { Ok(TextureData {
id: texture.id, id: texture.id,
name: &texture.name, name: &texture.name,

View file

@ -11,7 +11,7 @@ use librashader_reflect::reflect::ReflectShader;
use librashader_reflect::reflect::semantics::{Semantic, ShaderSemantics, TextureSemantics, UniformBinding, UniformSemantic, UniqueSemantics}; use librashader_reflect::reflect::semantics::{Semantic, ShaderSemantics, TextureSemantics, UniformBinding, UniformSemantic, UniqueSemantics};
use librashader_runtime::uniforms::UniformStorage; use librashader_runtime::uniforms::UniformStorage;
use crate::error; use crate::error;
use crate::filter_pass::FilterPass; use crate::filter_pass::{FilterPass, PipelineDescriptors};
pub struct Vulkan { pub struct Vulkan {
physical_device: vk::PhysicalDevice, physical_device: vk::PhysicalDevice,
@ -134,6 +134,7 @@ impl FilterChainVulkan {
fn init_passes( fn init_passes(
passes: Vec<ShaderPassMeta>, passes: Vec<ShaderPassMeta>,
semantics: &ShaderSemantics, semantics: &ShaderSemantics,
images: u32,
) -> error::Result<Box<[FilterPass]>> { ) -> error::Result<Box<[FilterPass]>> {
let mut filters = Vec::new(); let mut filters = Vec::new();
@ -156,6 +157,7 @@ impl FilterChainVulkan {
); );
let mut uniform_bindings = FxHashMap::default(); let mut uniform_bindings = FxHashMap::default();
for param in reflection.meta.parameter_meta.values() { for param in reflection.meta.parameter_meta.values() {
uniform_bindings.insert(UniformBinding::Parameter(param.id.clone()), param.offset); uniform_bindings.insert(UniformBinding::Parameter(param.id.clone()), param.offset);
} }
@ -168,6 +170,10 @@ impl FilterChainVulkan {
uniform_bindings.insert(UniformBinding::TextureSize(*semantics), param.offset); uniform_bindings.insert(UniformBinding::TextureSize(*semantics), param.offset);
} }
let mut pipeline = PipelineDescriptors::new(images);
pipeline.add_ubo_binding(reflection.ubo.as_ref());
pipeline.add_texture_bindings(reflection.meta.texture_meta.values());
// shader_vulkan 1927 (pipeline_layout)
filters.push(FilterPass { filters.push(FilterPass {
compiled: spirv_words, compiled: spirv_words,
uniform_storage, uniform_storage,

View file

@ -2,8 +2,9 @@ use rustc_hash::FxHashMap;
use librashader_preprocess::ShaderSource; use librashader_preprocess::ShaderSource;
use librashader_presets::ShaderPassConfig; use librashader_presets::ShaderPassConfig;
use librashader_reflect::back::ShaderCompilerOutput; use librashader_reflect::back::ShaderCompilerOutput;
use librashader_reflect::reflect::semantics::{MemberOffset, UniformBinding}; use librashader_reflect::reflect::semantics::{BindingStage, MemberOffset, TextureBinding, UboReflection, UniformBinding};
use librashader_runtime::uniforms::UniformStorage; use librashader_runtime::uniforms::UniformStorage;
use ash::vk;
pub struct FilterPass { pub struct FilterPass {
pub(crate) compiled: ShaderCompilerOutput<Vec<u32>>, pub(crate) compiled: ShaderCompilerOutput<Vec<u32>>,
@ -12,3 +13,70 @@ pub struct FilterPass {
pub source: ShaderSource, pub source: ShaderSource,
pub config: ShaderPassConfig, pub config: ShaderPassConfig,
} }
pub struct PipelineDescriptors {
pub replicas: u32,
pub layout_bindings: Vec<vk::DescriptorSetLayoutBinding>,
pub pool_sizes: Vec<vk::DescriptorPoolSize>
}
impl PipelineDescriptors {
pub fn new(duplicates: u32) -> Self {
Self {
replicas: duplicates,
layout_bindings: vec![],
pool_sizes: vec![],
}
}
pub fn add_ubo_binding(&mut self, ubo_meta: Option<&UboReflection>) {
if let Some(ubo_meta) = ubo_meta && !ubo_meta.stage_mask.is_empty() {
let mut ubo_mask = vk::ShaderStageFlags::default();
if ubo_meta.stage_mask.contains(BindingStage::VERTEX) {
ubo_mask |= vk::ShaderStageFlags::VERTEX;
}
if ubo_meta.stage_mask.contains(BindingStage::FRAGMENT) {
ubo_mask |= vk::ShaderStageFlags::FRAGMENT;
}
self.layout_bindings.push(vk::DescriptorSetLayoutBinding {
binding: ubo_meta.binding,
descriptor_type: vk::DescriptorType::UNIFORM_BUFFER,
descriptor_count: 1,
stage_flags: ubo_mask,
p_immutable_samplers: std::ptr::null(),
});
self.pool_sizes.push(vk::DescriptorPoolSize {
ty: vk::DescriptorType::UNIFORM_BUFFER,
descriptor_count: self.replicas,
})
}
}
pub fn add_texture_bindings<'a>(&mut self, textures: impl Iterator<Item = &'a TextureBinding>) {
let mut texture_mask = vk::ShaderStageFlags::FRAGMENT;
for texture in textures {
self.layout_bindings.push(vk::DescriptorSetLayoutBinding {
binding: texture.binding,
descriptor_type: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
descriptor_count: 1,
stage_flags: texture_mask,
p_immutable_samplers: std::ptr::null(),
});
self.pool_sizes.push(vk::DescriptorPoolSize {
ty: vk::DescriptorType::COMBINED_IMAGE_SAMPLER,
descriptor_count: self.replicas,
})
}
}
pub fn binding_count(&self) -> usize {
self.layout_bindings.len()
}
pub fn bindings(&self) -> &[vk::DescriptorSetLayoutBinding] {
self.layout_bindings.as_ref()
}
}

View file

@ -1,4 +1,5 @@
#![feature(type_alias_impl_trait)] #![feature(type_alias_impl_trait)]
#![feature(let_chains)]
mod hello_triangle; mod hello_triangle;
mod filter_chain; mod filter_chain;

View file

@ -79,16 +79,6 @@ impl<T> BoxRingBuffer<T>
index: 0, index: 0,
} }
} }
/// Get a borrow to all the items in this ring buffer.
pub fn items(&self) -> &[T; SIZE] {
&self.items
}
/// Get a mutable borrow to all the items in this ring buffer.
pub fn items_mut(&mut self) -> &mut [T; SIZE] {
&mut self.items
}
} }
@ -100,10 +90,12 @@ impl<T> BoxRingBuffer<T> {
} }
} }
/// Get a borrow to all the items in this ring buffer.
pub fn items(&self) -> &[T] { pub fn items(&self) -> &[T] {
&self.items &self.items
} }
/// Get a mutable borrow to all the items in this ring buffer.
pub fn items_mut(&mut self) -> &mut [T] { pub fn items_mut(&mut self) -> &mut [T] {
&mut self.items &mut self.items
} }
@ -126,7 +118,7 @@ impl<T> RingBuffer<T> for BoxRingBuffer<T> {
fn next(&mut self) { fn next(&mut self) {
self.index += 1; self.index += 1;
if self.index >= SIZE { if self.index >= self.items.len() {
self.index = 0 self.index = 0
} }
} }