diff --git a/src/valid/interface.rs b/src/valid/interface.rs index fdc1cf43ed..67130ddc68 100644 --- a/src/valid/interface.rs +++ b/src/valid/interface.rs @@ -435,6 +435,35 @@ impl super::Validator { return Err(GlobalVariableError::InvalidType(var.space)); } }; + let inner_ty = match &types[var.ty].inner { + &crate::TypeInner::BindingArray { base, .. } => &types[base].inner, + ty => ty, + }; + if let crate::TypeInner::Image { + class: + crate::ImageClass::Storage { + format: + crate::StorageFormat::R16Unorm + | crate::StorageFormat::R16Snorm + | crate::StorageFormat::Rg16Unorm + | crate::StorageFormat::Rg16Snorm + | crate::StorageFormat::Rgba16Unorm + | crate::StorageFormat::Rgba16Snorm, + .. + }, + .. + } = *inner_ty + { + if !self + .capabilities + .contains(Capabilities::STORAGE_TEXTURE_16BIT_NORM_FORMATS) + { + return Err(GlobalVariableError::UnsupportedCapability( + Capabilities::STORAGE_TEXTURE_16BIT_NORM_FORMATS, + )); + } + } + (TypeFlags::empty(), true) } crate::AddressSpace::Private | crate::AddressSpace::WorkGroup => { diff --git a/src/valid/mod.rs b/src/valid/mod.rs index 7679223f03..25fdf20ccc 100644 --- a/src/valid/mod.rs +++ b/src/valid/mod.rs @@ -87,7 +87,7 @@ bitflags::bitflags! { #[derive(Default)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] - pub struct Capabilities: u8 { + pub struct Capabilities: u16 { /// Support for [`AddressSpace:PushConstant`]. const PUSH_CONSTANT = 0x1; /// Float values with width = 8. @@ -104,6 +104,8 @@ bitflags::bitflags! { const CLIP_DISTANCE = 0x40; /// Support for [`Builtin::CullDistance`]. const CULL_DISTANCE = 0x80; + /// Support for 16-bit normalized storage texture formats. + const STORAGE_TEXTURE_16BIT_NORM_FORMATS = 0x100; } }