diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 059d4b77717..e2912809bb0 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2801,9 +2801,18 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp opcode, if (sampler && (access & ACCESS_NON_UNIFORM)) instr->sampler_non_uniform = true; - /* for non-query ops, get dest_type from sampler type */ + /* for non-query ops, get dest_type from SPIR-V return type */ if (dest_type == nir_type_invalid) { - switch (glsl_get_sampler_result_type(image->type)) { + /* the return type should match the image type, unless the image type is + * VOID (CL image), in which case the return type dictates the sampler + */ + enum glsl_base_type sampler_base = + glsl_get_sampler_result_type(image->type); + enum glsl_base_type ret_base = glsl_get_base_type(ret_type->type); + vtn_fail_if(sampler_base != ret_base && sampler_base != GLSL_TYPE_VOID, + "SPIR-V return type mismatches image type. This is only valid " + "for untyped images (OpenCL)."); + switch (ret_base) { case GLSL_TYPE_FLOAT: dest_type = nir_type_float; break; case GLSL_TYPE_INT: dest_type = nir_type_int; break; case GLSL_TYPE_UINT: dest_type = nir_type_uint; break;