readme and first steps for storage buffer raytracing
This commit is contained in:
parent
912659bb52
commit
534f1a109a
7 changed files with 424 additions and 44 deletions
src
|
@ -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],
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue