diff --git a/crates/spirv-std/src/image.rs b/crates/spirv-std/src/image.rs index 361cd1cf29..f110a1dfba 100644 --- a/crates/spirv-std/src/image.rs +++ b/crates/spirv-std/src/image.rs @@ -162,6 +162,35 @@ impl< } result.truncate_into() } + + /// Fetch a single texel at a mipmap `level` with a sampler set at compile time + #[crate::macros::gpu_only] + #[doc(alias = "OpImageFetch")] + pub fn fetch_with_level( + &self, + coordinate: impl ImageCoordinate, + level: u32, + ) -> SampledType::SampleResult + where + I: Integer, + { + let mut result = SampledType::Vec4::default(); + unsafe { + asm! { + "OpDecorate %image NonUniform", + "OpDecorate %result NonUniform", + "%image = OpLoad _ {this}", + "%coordinate = OpLoad _ {coordinate}", + "%result = OpImageFetch typeof*{result} %image %coordinate Lod {level}", + "OpStore {result} %result", + result = in(reg) &mut result, + this = in(reg) self, + coordinate = in(reg) &coordinate, + level = in(reg) level, + } + } + result.truncate_into() + } } impl< diff --git a/tests/compiletests/ui/image/fetch_with_level.rs b/tests/compiletests/ui/image/fetch_with_level.rs new file mode 100644 index 0000000000..34ddb41ace --- /dev/null +++ b/tests/compiletests/ui/image/fetch_with_level.rs @@ -0,0 +1,13 @@ +// build-pass + +use spirv_std::spirv; +use spirv_std::{Image, arch}; + +#[spirv(fragment)] +pub fn main( + #[spirv(descriptor_set = 0, binding = 0)] image: &Image!(2D, type=f32, sampled), + output: &mut glam::Vec4, +) { + let texel = image.fetch_with_level(glam::IVec2::new(0, 1), 0); + *output = texel; +}