Added TextureFormatFeatures::filterable

Can overwrite TextureSampleType::Float.filterable
This commit is contained in:
Andreas Reich 2021-02-23 23:59:17 +01:00
parent 2d0142a2e7
commit dfe686bbc6
4 changed files with 25 additions and 11 deletions

View File

@ -1440,21 +1440,26 @@ impl<B: GfxBackend> Device<B> {
view_samples: view.samples as u32, view_samples: view.samples as u32,
}); });
} }
match (sample_type, format_info.sample_type) { match (sample_type, format_info.sample_type, view.format_features.filterable ) {
(Tst::Uint, Tst::Uint) | (Tst::Uint, Tst::Uint, ..) |
(Tst::Sint, Tst::Sint) | (Tst::Sint, Tst::Sint, ..) |
(Tst::Depth, Tst::Depth) | (Tst::Depth, Tst::Depth, ..) |
// if we expect non-fiterable, accept anything float // if we expect non-filterable, accept anything float
(Tst::Float { filterable: false }, Tst::Float { .. }) | (Tst::Float { filterable: false }, Tst::Float { .. }, ..) |
// if we expect fiterable, require it // if we expect filterable, require it
(Tst::Float { filterable: true }, Tst::Float { filterable: true }) | (Tst::Float { filterable: true }, Tst::Float { filterable: true }, ..) |
// if we expect filterable, also accept Float that is defined as unfilterable if filterable feature is explicitly enabled
// (only hit if wgt::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES is enabled)
(Tst::Float { filterable: true }, Tst::Float { .. }, true) |
// if we expect float, also accept depth // if we expect float, also accept depth
(Tst::Float { .. }, Tst::Depth) => {} (Tst::Float { .. }, Tst::Depth, ..) => {}
_ => return Err(Error::InvalidTextureSampleType { _ => {
return Err(Error::InvalidTextureSampleType {
binding, binding,
layout_sample_type: sample_type, layout_sample_type: sample_type,
view_format: view.format, view_format: view.format,
}), })
},
} }
if view_dimension != view.dimension { if view_dimension != view.dimension {
return Err(Error::InvalidTextureDimension { return Err(Error::InvalidTextureDimension {

View File

@ -329,9 +329,13 @@ impl<B: GfxBackend> Adapter<B> {
flags |= wgt::TextureFormatFeatureFlags::STORAGE_READ_WRITE; flags |= wgt::TextureFormatFeatureFlags::STORAGE_READ_WRITE;
} }
let filterable =
texture_format_properties.contains(hal::format::ImageFeature::SAMPLED_LINEAR);
wgt::TextureFormatFeatures { wgt::TextureFormatFeatures {
allowed_usages, allowed_usages,
flags, flags,
filterable,
} }
} }

View File

@ -187,6 +187,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
format_features: wgt::TextureFormatFeatures { format_features: wgt::TextureFormatFeatures {
allowed_usages: wgt::TextureUsage::RENDER_ATTACHMENT, allowed_usages: wgt::TextureUsage::RENDER_ATTACHMENT,
flags: wgt::TextureFormatFeatureFlags::empty(), flags: wgt::TextureFormatFeatureFlags::empty(),
filterable: false,
}, },
dimension: wgt::TextureViewDimension::D2, dimension: wgt::TextureViewDimension::D2,
extent: wgt::Extent3d { extent: wgt::Extent3d {

View File

@ -937,6 +937,9 @@ pub struct TextureFormatFeatures {
pub allowed_usages: TextureUsage, pub allowed_usages: TextureUsage,
/// Additional property flags for the format. /// Additional property flags for the format.
pub flags: TextureFormatFeatureFlags, pub flags: TextureFormatFeatureFlags,
/// If `filterable` is false, the texture can't be sampled with a filtering sampler.
/// This may overwrite TextureSampleType::Float.filterable
pub filterable: bool,
} }
/// Information about a texture format. /// Information about a texture format.
@ -1492,6 +1495,7 @@ impl TextureFormat {
guaranteed_format_features: TextureFormatFeatures { guaranteed_format_features: TextureFormatFeatures {
allowed_usages, allowed_usages,
flags: TextureFormatFeatureFlags::empty(), flags: TextureFormatFeatureFlags::empty(),
filterable: sample_type == TextureSampleType::Float { filterable: true },
}, },
} }
} }