fix: allow non-filterable float on derived BGLs for texture binding usage w/ no sampler (#6531)

This commit is contained in:
Erich Gubler 2024-11-13 07:20:02 -05:00 committed by GitHub
parent efc15ba03b
commit a2044aefe7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 5 deletions

View File

@ -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

View File

@ -497,7 +497,10 @@ impl Resource {
Ok(())
}
fn derive_binding_type(&self) -> Result<BindingType, BindingError> {
fn derive_binding_type(
&self,
is_reffed_by_sampler_in_entrypoint: bool,
) -> Result<BindingType, BindingError> {
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),
};