From 701cb9d60c0350b0134e52cb1b51eefbbf27bd22 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Wed, 6 May 2020 17:20:26 -0700 Subject: [PATCH] nir/vtn: Handle integer sampling coordinates Reviewed-by: Jason Ekstrand Part-of: --- src/compiler/spirv/spirv_to_nir.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index e291280..8067c41 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2632,9 +2632,21 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode, if (is_array && texop != nir_texop_lod) coord_components++; - coord = vtn_get_nir_ssa(b, w[idx++]); + struct vtn_ssa_value *coord_val = vtn_ssa_value(b, w[idx++]); + coord = coord_val->def; p->src = nir_src_for_ssa(nir_channels(&b->nb, coord, (1 << coord_components) - 1)); + + /* OpenCL allows integer sampling coordinates */ + if (glsl_type_is_integer(coord_val->type) && + opcode == SpvOpImageSampleExplicitLod) { + vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL, + "Unless the Kernel capability is being used, the coordinate parameter " + "OpImageSampleExplicitLod must be floating point."); + + p->src = nir_src_for_ssa(nir_i2f32(&b->nb, p->src.ssa)); + } + p->src_type = nir_tex_src_coord; p++; break; -- 2.7.4