From 9b6342ecc2eba27b57e4ef53630a8019b7563a91 Mon Sep 17 00:00:00 2001 From: hodasemi Date: Sun, 16 Apr 2023 08:41:33 +0200 Subject: [PATCH] Fix allocating multiple sets from desc pool --- vulkan-rs/src/descriptorpool.rs | 39 ++++++++++++------- vulkan-rs/src/descriptorset.rs | 2 +- .../src/structs/core/descriptorpoolsize.rs | 2 +- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/vulkan-rs/src/descriptorpool.rs b/vulkan-rs/src/descriptorpool.rs index c7faa51..5a837cc 100644 --- a/vulkan-rs/src/descriptorpool.rs +++ b/vulkan-rs/src/descriptorpool.rs @@ -6,6 +6,7 @@ use std::sync::Arc; pub struct DescriptorPoolBuilder { layout: Option>, + descriptor_count: u32, flags: VkDescriptorPoolCreateFlagBits, } @@ -16,6 +17,12 @@ impl DescriptorPoolBuilder { self } + pub fn set_descriptor_set_count(mut self, count: u32) -> Self { + self.descriptor_count = count; + + self + } + pub fn set_layout(mut self, layout: Arc) -> Self { self.layout = Some(layout); @@ -27,24 +34,29 @@ impl DescriptorPoolBuilder { if self.layout.is_none() { panic!("no layout set!"); } - } - let layout = self.layout.expect("descriptor set layout was not set!"); - - let descriptor_count: u32 = layout - .pool_sizes() - .iter() - .map(|pool| pool.descriptorCount) - .sum(); - - if cfg!(debug_assertions) { - if descriptor_count == 0 { + if self.descriptor_count == 0 { panic!("descriptor count must be greater than 0"); } } - let descriptor_pool_ci = - VkDescriptorPoolCreateInfo::new(self.flags, descriptor_count, layout.pool_sizes()); + let layout = self.layout.expect("descriptor set layout was not set!"); + + let pool_sizes: Vec = layout + .pool_sizes() + .iter() + .cloned() + .map(|mut pool_size| { + pool_size.descriptorCount *= self.descriptor_count; + pool_size + }) + .collect(); + + let descriptor_pool_ci = VkDescriptorPoolCreateInfo::new( + self.flags, + self.descriptor_count, + pool_sizes.as_slice(), + ); let descriptor_pool = device.create_descriptor_pool(&descriptor_pool_ci)?; @@ -67,6 +79,7 @@ impl DescriptorPool { pub fn builder() -> DescriptorPoolBuilder { DescriptorPoolBuilder { layout: None, + descriptor_count: 1, flags: VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT.into(), } } diff --git a/vulkan-rs/src/descriptorset.rs b/vulkan-rs/src/descriptorset.rs index b96a615..a4ef432 100644 --- a/vulkan-rs/src/descriptorset.rs +++ b/vulkan-rs/src/descriptorset.rs @@ -359,11 +359,11 @@ mod test { VK_SHADER_STAGE_FRAGMENT_BIT, 0, ) - .change_descriptor_count(DESCRIPTOR_COUNT) .build(device.clone())?; let descriptor_pool = DescriptorPool::builder() .set_layout(descriptor_layout.clone()) + .set_descriptor_set_count(DESCRIPTOR_COUNT) .build(device.clone())?; let descriptors: Vec> = (0..DESCRIPTOR_COUNT) diff --git a/vulkan-sys/src/structs/core/descriptorpoolsize.rs b/vulkan-sys/src/structs/core/descriptorpoolsize.rs index 19d7003..ca7c613 100644 --- a/vulkan-sys/src/structs/core/descriptorpoolsize.rs +++ b/vulkan-sys/src/structs/core/descriptorpoolsize.rs @@ -1,7 +1,7 @@ use crate::prelude::*; #[repr(C)] -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct VkDescriptorPoolSize { pub ty: VkDescriptorType, pub descriptorCount: u32,