diff --git a/naga/src/back/spv/writer.rs b/naga/src/back/spv/writer.rs index 3e66a1c43f..b8e3625fed 100644 --- a/naga/src/back/spv/writer.rs +++ b/naga/src/back/spv/writer.rs @@ -892,9 +892,10 @@ impl Writer { .. } | crate::TypeInner::Scalar(crate::Scalar::F16) => { + self.require_any("16 bit floating-point", &[spirv::Capability::Float16])?; self.require_any( - "16 bit floating-point", - &[spirv::Capability::Float16, spirv::Capability::Float16Buffer], + "16 bit floating-point in buffers", + &[spirv::Capability::Float16Buffer], )?; self.use_extension("SPV_KHR_16bit_storage"); } diff --git a/naga/tests/out/spv/f16.spvasm b/naga/tests/out/spv/f16.spvasm index a279582ef8..bef1526fca 100644 --- a/naga/tests/out/spv/f16.spvasm +++ b/naga/tests/out/spv/f16.spvasm @@ -4,6 +4,7 @@ ; Bound: 159 OpCapability Shader OpCapability Float16 +OpCapability Float16Buffer OpCapability StorageBuffer16BitAccess OpCapability UniformAndStorageBuffer16BitAccess OpCapability StorageInputOutput16 diff --git a/naga/tests/spirv_capabilities.rs b/naga/tests/spirv_capabilities.rs index f221c7896e..b96b3d1327 100644 --- a/naga/tests/spirv_capabilities.rs +++ b/naga/tests/spirv_capabilities.rs @@ -208,3 +208,11 @@ fn int64() { "#, ); } + +#[test] +fn float16() { + require( + &[Ca::Float16, Ca::Float16Buffer], + "enable f16; fn f(x: f16) { }", + ); +} diff --git a/naga/tests/wgsl_errors.rs b/naga/tests/wgsl_errors.rs index d9ab1d7ae3..850acc1cdd 100644 --- a/naga/tests/wgsl_errors.rs +++ b/naga/tests/wgsl_errors.rs @@ -982,7 +982,8 @@ fn float16_in_push_constant() { "enable f16; var input: f16;", "enable f16; var input: vec2;", "enable f16; var input: mat4x4;", - "enable f16; struct S { a: f16 }; var input: S;": + "enable f16; struct S { a: f16 }; var input: S;", + "enable f16; struct S1 { a: f16 }; struct S2 { a : S1 } var input: S2;": Err(naga::valid::ValidationError::GlobalVariable { source: naga::valid::GlobalVariableError::InvalidPushConstantType( naga::valid::PushConstantError::InvalidScalar(