// Mipmap generation: each level is a bilinear 2×2 average of the one above. @group(0) @binding(0) var src: texture_2d; @group(0) @binding(1) var samp: sampler; struct VOut { @builtin(position) pos: vec4, @location(0) uv: vec2, }; @vertex fn vs(@builtin(vertex_index) i: u32) -> VOut { // One oversized triangle covering the target. let uv = vec2(f32((i << 1u) & 2u), f32(i & 2u)); var out: VOut; out.pos = vec4(uv.x * 2.0 - 1.0, 1.0 - uv.y * 2.0, 0.0, 1.0); out.uv = uv; return out; } @fragment fn fs(in: VOut) -> @location(0) vec4 { return textureSample(src, samp, in.uv); }