diff --git a/CHANGELOG.md b/CHANGELOG.md index 36f88095f..dbd395822 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -127,6 +127,7 @@ By @ErichDonGubler in [#6456](https://github.com/gfx-rs/wgpu/pull/6456), [#6148] - Ensure that `Features::TIMESTAMP_QUERY` is set when using timestamp writes in render and compute passes. By @ErichDonGubler in [#6497](https://github.com/gfx-rs/wgpu/pull/6497). - Check for device mismatches when beginning render and compute passes. By @ErichDonGubler in [#6497](https://github.com/gfx-rs/wgpu/pull/6497). - Lower `QUERY_SET_MAX_QUERIES` (and enforced limits) from 8192 to 4096 to match WebGPU spec. By @ErichDonGubler in [#6525](https://github.com/gfx-rs/wgpu/pull/6525). +- Allow non-filterable float on texture bindings never used with samplers when using a derived bind group layout. By @ErichDonGubler in [#6531](https://github.com/gfx-rs/wgpu/pull/6531/). #### Naga diff --git a/wgpu-core/src/validation.rs b/wgpu-core/src/validation.rs index 13cf443d4..68a9288e0 100644 --- a/wgpu-core/src/validation.rs +++ b/wgpu-core/src/validation.rs @@ -497,7 +497,10 @@ impl Resource { Ok(()) } - fn derive_binding_type(&self) -> Result { + fn derive_binding_type( + &self, + is_reffed_by_sampler_in_entrypoint: bool, + ) -> Result { Ok(match self.ty { ResourceType::Buffer { size } => BindingType::Buffer { ty: match self.class { @@ -531,9 +534,9 @@ impl Resource { match class { naga::ImageClass::Sampled { multi, kind } => BindingType::Texture { sample_type: match kind { - naga::ScalarKind::Float => { - wgt::TextureSampleType::Float { filterable: true } - } + naga::ScalarKind::Float => wgt::TextureSampleType::Float { + filterable: is_reffed_by_sampler_in_entrypoint, + }, naga::ScalarKind::Sint => wgt::TextureSampleType::Sint, naga::ScalarKind::Uint => wgt::TextureSampleType::Uint, naga::ScalarKind::AbstractInt @@ -1009,7 +1012,12 @@ impl Interface { break 'err Err(BindingError::Missing); }; - let ty = match res.derive_binding_type() { + let ty = match res.derive_binding_type( + entry_point + .sampling_pairs + .iter() + .any(|&(im, _samp)| im == handle), + ) { Ok(ty) => ty, Err(error) => break 'err Err(error), };