mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Fix HAL binding for Vulkan.
This commit is contained in:
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user