readme and first steps for storage buffer raytracing

This commit is contained in:
zomseffen 2024-10-18 17:15:33 +02:00
parent 912659bb52
commit 534f1a109a
7 changed files with 424 additions and 44 deletions

View file

@ -199,8 +199,14 @@ pub unsafe fn create_descriptor_set_layout(
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.descriptor_count(1)
.stage_flags(vk::ShaderStageFlags::FRAGMENT);
let storage_binding = vk::DescriptorSetLayoutBinding::builder()
.binding(2)
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
.descriptor_count(1)
.stage_flags(vk::ShaderStageFlags::FRAGMENT);
let bindings = &[ubo_binding, sampler_binding];
let bindings = &[ubo_binding, sampler_binding, storage_binding];
let info = vk::DescriptorSetLayoutCreateInfo::builder()
.bindings(bindings);
@ -234,6 +240,31 @@ pub unsafe fn create_uniform_buffers(
Ok(())
}
pub unsafe fn create_storage_buffers(
instance: &Instance,
device: &Device,
data: &mut app_data::AppData,
) -> Result<()> {
data.storage_buffers.clear();
data.storage_buffers_memory.clear();
for _ in 0..data.swapchain_images.len() {
let (storage_buffer, storage_buffer_memory) = create_buffer(
instance,
device,
data,
size_of::<UniformBufferObject>() as u64,
vk::BufferUsageFlags::STORAGE_BUFFER,
vk::MemoryPropertyFlags::HOST_COHERENT | vk::MemoryPropertyFlags::HOST_VISIBLE,
)?;
data.storage_buffers.push(storage_buffer);
data.storage_buffers_memory.push(storage_buffer_memory);
}
Ok(())
}
pub unsafe fn create_descriptor_pool(device: &Device, data: &mut app_data::AppData) -> Result<()> {
let ubo_size = vk::DescriptorPoolSize::builder()
.type_(vk::DescriptorType::UNIFORM_BUFFER)
@ -242,8 +273,12 @@ pub unsafe fn create_descriptor_pool(device: &Device, data: &mut app_data::AppDa
let sampler_size = vk::DescriptorPoolSize::builder()
.type_(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.descriptor_count(data.swapchain_images.len() as u32);
let storage_size = vk::DescriptorPoolSize::builder()
.type_(vk::DescriptorType::STORAGE_BUFFER)
.descriptor_count(data.swapchain_images.len() as u32);
let pool_sizes = &[ubo_size, sampler_size];
let pool_sizes = &[ubo_size, sampler_size, storage_size];
let info = vk::DescriptorPoolCreateInfo::builder()
.pool_sizes(pool_sizes)
.max_sets(data.swapchain_images.len() as u32);
@ -286,8 +321,21 @@ pub unsafe fn create_descriptor_sets(device: &Device, data: &mut app_data::AppDa
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.image_info(image_info);
let info = vk::DescriptorBufferInfo::builder()
.buffer(data.storage_buffers[i])
.offset(0)
.range(size_of::<UniformBufferObject>() as u64);
let storage_info = &[info];
let storage_write = vk::WriteDescriptorSet::builder()
.dst_set(data.descriptor_sets[i])
.dst_binding(2)
.dst_array_element(0)
.descriptor_type(vk::DescriptorType::STORAGE_BUFFER)
.buffer_info(storage_info);
device.update_descriptor_sets(
&[ubo_write, sampler_write],
&[ubo_write, sampler_write, storage_write],
&[] as &[vk::CopyDescriptorSet],
);
}