Fix HAL binding for Vulkan.

This commit is contained in:
Alex S
2021-06-19 23:07:30 +03:00
parent a8be371acf
commit dd4c681a2f
4 changed files with 41 additions and 22 deletions

View File

@@ -1216,7 +1216,7 @@ impl<A: HalApi> Device<A> {
.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<A: HalApi> Device<A> {
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<A: HalApi> Device<A> {
)?;
hal_buffers.push(bb);
}
res_index
(res_index, bindings_array.len())
}
Br::Sampler(id) => {
match decl.ty {
@@ -1293,7 +1293,7 @@ impl<A: HalApi> Device<A> {
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<A: HalApi> Device<A> {
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<A: HalApi> Device<A> {
});
}
res_index
(res_index, bindings_array.len())
}
};
hal_entries.push(hal::BindGroupEntry {
binding,
resource_index: res_index as u32,
size: size as u32,
});
}

View File

@@ -396,14 +396,17 @@ impl<A: hal::Api> Example<A> {
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<A: hal::Api> Example<A> {
entries: &[hal::BindGroupEntry {
binding: 0,
resource_index: 0,
size: 1,
}],
};
unsafe { device.create_bind_group(&local_group_desc).unwrap() }

View File

@@ -803,6 +803,7 @@ impl<A: Api> Clone for TextureBinding<'_, A> {
pub struct BindGroupEntry {
pub binding: u32,
pub resource_index: u32,
pub size: u32,
}
/// BindGroup descriptor.

View File

@@ -1014,7 +1014,7 @@ impl crate::Device<super::Api> 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<super::Api> 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());
}