From dd4c681a2fa884a07bc54e6d87ffe5376abffc96 Mon Sep 17 00:00:00 2001 From: Alex S Date: Sat, 19 Jun 2021 23:07:30 +0300 Subject: [PATCH] Fix HAL binding for Vulkan. --- wgpu-core/src/device/mod.rs | 13 ++++----- wgpu-hal/examples/halmark/main.rs | 4 +++ wgpu-hal/src/lib.rs | 1 + wgpu-hal/src/vulkan/device.rs | 45 ++++++++++++++++++++----------- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/wgpu-core/src/device/mod.rs b/wgpu-core/src/device/mod.rs index 39a9ea0ba9..962c535c94 100644 --- a/wgpu-core/src/device/mod.rs +++ b/wgpu-core/src/device/mod.rs @@ -1216,7 +1216,7 @@ impl Device { .entries .get(&binding) .ok_or(Error::MissingBindingDeclaration(binding))?; - let res_index = match entry.resource { + let (res_index, size) = match entry.resource { Br::Buffer(ref bb) => { let bb = Self::create_buffer_binding( &bb, @@ -1231,7 +1231,7 @@ impl Device { let res_index = hal_buffers.len(); hal_buffers.push(bb); - res_index + (res_index, 1) } Br::BufferArray(ref bindings_array) => { if let Some(count) = decl.count { @@ -1261,7 +1261,7 @@ impl Device { )?; hal_buffers.push(bb); } - res_index + (res_index, bindings_array.len()) } Br::Sampler(id) => { match decl.ty { @@ -1293,7 +1293,7 @@ impl Device { let res_index = hal_samplers.len(); hal_samplers.push(&sampler.raw); - res_index + (res_index, 1) } _ => { return Err(Error::WrongBindingType { @@ -1341,7 +1341,7 @@ impl Device { view: &view.raw, usage: internal_use, }); - res_index + (res_index, 1) } Br::TextureViewArray(ref bindings_array) => { if let Some(count) = decl.count { @@ -1394,13 +1394,14 @@ impl Device { }); } - res_index + (res_index, bindings_array.len()) } }; hal_entries.push(hal::BindGroupEntry { binding, resource_index: res_index as u32, + size: size as u32, }); } diff --git a/wgpu-hal/examples/halmark/main.rs b/wgpu-hal/examples/halmark/main.rs index d3cea796a5..98839ee2f9 100644 --- a/wgpu-hal/examples/halmark/main.rs +++ b/wgpu-hal/examples/halmark/main.rs @@ -396,14 +396,17 @@ impl Example { hal::BindGroupEntry { binding: 0, resource_index: 0, + size: 1, }, hal::BindGroupEntry { binding: 1, resource_index: 0, + size: 1, }, hal::BindGroupEntry { binding: 2, resource_index: 0, + size: 1, }, ], }; @@ -425,6 +428,7 @@ impl Example { entries: &[hal::BindGroupEntry { binding: 0, resource_index: 0, + size: 1, }], }; unsafe { device.create_bind_group(&local_group_desc).unwrap() } diff --git a/wgpu-hal/src/lib.rs b/wgpu-hal/src/lib.rs index 4142406737..cc96f1da56 100644 --- a/wgpu-hal/src/lib.rs +++ b/wgpu-hal/src/lib.rs @@ -803,6 +803,7 @@ impl Clone for TextureBinding<'_, A> { pub struct BindGroupEntry { pub binding: u32, pub resource_index: u32, + pub size: u32, } /// BindGroup descriptor. diff --git a/wgpu-hal/src/vulkan/device.rs b/wgpu-hal/src/vulkan/device.rs index 8657d40cf9..f7ae1e4401 100644 --- a/wgpu-hal/src/vulkan/device.rs +++ b/wgpu-hal/src/vulkan/device.rs @@ -1014,7 +1014,7 @@ impl crate::Device for super::Device { write = match ty { vk::DescriptorType::SAMPLER => { let index = sampler_infos.len(); - let binding = desc.samplers[index]; + let binding = desc.samplers[entry.resource_index as usize]; let vk_info = vk::DescriptorImageInfo::builder() .sampler(binding.raw) .build(); @@ -1023,26 +1023,39 @@ impl crate::Device for super::Device { } vk::DescriptorType::SAMPLED_IMAGE | vk::DescriptorType::STORAGE_IMAGE => { let index = image_infos.len(); - let binding = &desc.textures[index]; - let layout = conv::derive_image_layout(binding.usage, binding.view.aspects()); - let vk_info = vk::DescriptorImageInfo::builder() - .image_view(binding.view.raw) - .image_layout(layout) - .build(); - image_infos.push(vk_info); + let start = entry.resource_index; + let end = entry.resource_index + entry.size; + image_infos.extend(desc.textures[start as usize..end as usize].iter().map( + |binding| { + let layout = + conv::derive_image_layout(binding.usage, binding.view.aspects()); + vk::DescriptorImageInfo::builder() + .image_view(binding.view.raw) + .image_layout(layout) + .build() + }, + )); write.image_info(&image_infos[index..]) } - _ => { + vk::DescriptorType::UNIFORM_BUFFER + | vk::DescriptorType::UNIFORM_BUFFER_DYNAMIC + | vk::DescriptorType::STORAGE_BUFFER + | vk::DescriptorType::STORAGE_BUFFER_DYNAMIC => { let index = buffer_infos.len(); - let binding = &desc.buffers[index]; - let vk_info = vk::DescriptorBufferInfo::builder() - .buffer(binding.buffer.raw) - .offset(binding.offset) - .range(binding.size.map_or(vk::WHOLE_SIZE, wgt::BufferSize::get)) - .build(); - buffer_infos.push(vk_info); + let start = entry.resource_index; + let end = entry.resource_index + entry.size; + buffer_infos.extend(desc.buffers[start as usize..end as usize].iter().map( + |binding| { + vk::DescriptorBufferInfo::builder() + .buffer(binding.buffer.raw) + .offset(binding.offset) + .range(binding.size.map_or(vk::WHOLE_SIZE, wgt::BufferSize::get)) + .build() + }, + )); write.buffer_info(&buffer_infos[index..]) } + _ => unreachable!(), }; writes.push(write.build()); }