mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-12-08 21:26:17 +00:00
[core] Don't skip binding index checks for derived layouts. (#8325)
When deriving a bind group layout for a pipeline, bother to enforce `wgpu_types::Limits::max_bindings_per_bind_group`. Move the check: - from `wgpu_core::device::bgl::EntryMap::from_entries`, which is only used for explicit bind group creation - into `wgpu_core::device::Device::create_bind_group_layout`, which is used for all bind group layout creation.
This commit is contained in:
parent
2e48faf95d
commit
1cbebdcffe
@ -84,6 +84,7 @@ SamplerDescriptor {
|
|||||||
|
|
||||||
- Reject fragment shader output `location`s > `max_color_attachments` limit. By @ErichDonGubler in [#8316](https://github.com/gfx-rs/wgpu/pull/8316).
|
- Reject fragment shader output `location`s > `max_color_attachments` limit. By @ErichDonGubler in [#8316](https://github.com/gfx-rs/wgpu/pull/8316).
|
||||||
- WebGPU device requests now support the required limits `maxColorAttachments` and `maxColorAttachmentBytesPerSample`. By @evilpie in [#8328](https://github.com/gfx-rs/wgpu/pull/8328)
|
- WebGPU device requests now support the required limits `maxColorAttachments` and `maxColorAttachmentBytesPerSample`. By @evilpie in [#8328](https://github.com/gfx-rs/wgpu/pull/8328)
|
||||||
|
- Reject binding indices that exceed `wgpu_types::Limits::max_bindings_per_bind_group` when deriving a bind group layout for a pipeline. By @jimblandy in [#8325](https://github.com/gfx-rs/wgpu/pull/8325).
|
||||||
|
|
||||||
## v27.0.2 (2025-10-03)
|
## v27.0.2 (2025-10-03)
|
||||||
|
|
||||||
|
|||||||
@ -63,19 +63,10 @@ impl EntryMap {
|
|||||||
/// Errors if there are duplicate bindings or if any binding index is greater than
|
/// Errors if there are duplicate bindings or if any binding index is greater than
|
||||||
/// the device's limits.
|
/// the device's limits.
|
||||||
pub fn from_entries(
|
pub fn from_entries(
|
||||||
device_limits: &wgt::Limits,
|
|
||||||
entries: &[wgt::BindGroupLayoutEntry],
|
entries: &[wgt::BindGroupLayoutEntry],
|
||||||
) -> Result<Self, binding_model::CreateBindGroupLayoutError> {
|
) -> Result<Self, binding_model::CreateBindGroupLayoutError> {
|
||||||
let mut inner = FastIndexMap::with_capacity_and_hasher(entries.len(), Default::default());
|
let mut inner = FastIndexMap::with_capacity_and_hasher(entries.len(), Default::default());
|
||||||
for entry in entries {
|
for entry in entries {
|
||||||
if entry.binding >= device_limits.max_bindings_per_bind_group {
|
|
||||||
return Err(
|
|
||||||
binding_model::CreateBindGroupLayoutError::InvalidBindingIndex {
|
|
||||||
binding: entry.binding,
|
|
||||||
maximum: device_limits.max_bindings_per_bind_group,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if inner.insert(entry.binding, *entry).is_some() {
|
if inner.insert(entry.binding, *entry).is_some() {
|
||||||
return Err(binding_model::CreateBindGroupLayoutError::ConflictBinding(
|
return Err(binding_model::CreateBindGroupLayoutError::ConflictBinding(
|
||||||
entry.binding,
|
entry.binding,
|
||||||
|
|||||||
@ -693,7 +693,7 @@ impl Global {
|
|||||||
break 'error e.into();
|
break 'error e.into();
|
||||||
}
|
}
|
||||||
|
|
||||||
let entry_map = match bgl::EntryMap::from_entries(&device.limits, &desc.entries) {
|
let entry_map = match bgl::EntryMap::from_entries(&desc.entries) {
|
||||||
Ok(map) => map,
|
Ok(map) => map,
|
||||||
Err(e) => break 'error e,
|
Err(e) => break 'error e,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2292,6 +2292,15 @@ impl Device {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for entry in entry_map.values() {
|
for entry in entry_map.values() {
|
||||||
|
if entry.binding >= self.limits.max_bindings_per_bind_group {
|
||||||
|
return Err(
|
||||||
|
binding_model::CreateBindGroupLayoutError::InvalidBindingIndex {
|
||||||
|
binding: entry.binding,
|
||||||
|
maximum: self.limits.max_bindings_per_bind_group,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
use wgt::BindingType as Bt;
|
use wgt::BindingType as Bt;
|
||||||
|
|
||||||
let mut required_features = wgt::Features::empty();
|
let mut required_features = wgt::Features::empty();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user