mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-22 06:44:14 +00:00
Allow non-filtering integer texture sampling (#3362)
* Allow non-filtering integer texture sampling * Add changelog entry
This commit is contained in:
parent
a06ef71fd7
commit
ad4dac87fb
@ -173,6 +173,7 @@ Additionally `Surface::get_default_config` now returns an Option and returns Non
|
||||
- Check for invalid bitflag bits in wgpu-core and allow them to be captured/replayed by @nical in (#3229)[https://github.com/gfx-rs/wgpu/pull/3229]
|
||||
- Evaluate `gfx_select!`'s `#[cfg]` conditions at the right time. By @jimblandy in [#3253](https://github.com/gfx-rs/wgpu/pull/3253)
|
||||
- Improve error messages when binding bind group with dynamic offsets. By @cwfitzgerald in [#3294](https://github.com/gfx-rs/wgpu/pull/3294)
|
||||
- Allow non-filtering sampling of integer textures. By @JMS55 in [#3362](https://github.com/gfx-rs/wgpu/pull/3362).
|
||||
|
||||
#### Metal
|
||||
- Fix texture view creation with full-resource views when using an explicit `mip_level_count` or `array_layer_count`. By @cwfitzgerald in [#3323](https://github.com/gfx-rs/wgpu/pull/3323)
|
||||
|
@ -212,10 +212,10 @@ pub enum BindingError {
|
||||
|
||||
#[derive(Clone, Debug, Error)]
|
||||
pub enum FilteringError {
|
||||
#[error("integer textures can't be sampled")]
|
||||
#[error("integer textures can't be sampled with a filtering sampler")]
|
||||
Integer,
|
||||
#[error("non-filterable float texture")]
|
||||
NonFilterable,
|
||||
#[error("non-filterable float textures can't be sampled with a filtering sampler")]
|
||||
Float,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Error)]
|
||||
@ -1049,27 +1049,22 @@ impl Interface {
|
||||
assert!(texture_layout.visibility.contains(stage_bit));
|
||||
assert!(sampler_layout.visibility.contains(stage_bit));
|
||||
|
||||
let error = match texture_layout.ty {
|
||||
wgt::BindingType::Texture {
|
||||
sample_type: wgt::TextureSampleType::Float { filterable },
|
||||
..
|
||||
} => match sampler_layout.ty {
|
||||
let sampler_filtering = matches!(
|
||||
sampler_layout.ty,
|
||||
wgt::BindingType::Sampler(wgt::SamplerBindingType::Filtering)
|
||||
if !filterable =>
|
||||
{
|
||||
Some(FilteringError::NonFilterable)
|
||||
);
|
||||
let texture_sample_type = match texture_layout.ty {
|
||||
BindingType::Texture { sample_type, .. } => sample_type,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
let error = match (sampler_filtering, texture_sample_type) {
|
||||
(true, wgt::TextureSampleType::Float { filterable: false }) => {
|
||||
Some(FilteringError::Float)
|
||||
}
|
||||
(true, wgt::TextureSampleType::Sint) => Some(FilteringError::Integer),
|
||||
(true, wgt::TextureSampleType::Uint) => Some(FilteringError::Integer),
|
||||
_ => None,
|
||||
},
|
||||
wgt::BindingType::Texture {
|
||||
sample_type: wgt::TextureSampleType::Sint,
|
||||
..
|
||||
}
|
||||
| wgt::BindingType::Texture {
|
||||
sample_type: wgt::TextureSampleType::Uint,
|
||||
..
|
||||
} => Some(FilteringError::Integer),
|
||||
_ => None, // unreachable, really
|
||||
};
|
||||
|
||||
if let Some(error) = error {
|
||||
|
Loading…
Reference in New Issue
Block a user