+ case nir_intrinsic_load_var: {
+ nir_variable *var = intr->variables[0]->var;
+ nir_variable_mode mode = var->data.mode;
+ enum glsl_base_type base_type =
+ glsl_get_base_type(glsl_without_array(var->type));
+
+ if (mode == nir_var_shader_in) {
+ switch (var->data.interpolation) {
+ case INTERP_MODE_NONE:
+ if (glsl_base_type_is_integer(base_type))
+ break;
+
+ /* fall-through */
+ case INTERP_MODE_SMOOTH:
+ if (var->data.sample)
+ info->uses_persp_sample = true;
+ else if (var->data.centroid)
+ info->uses_persp_centroid = true;
+ else
+ info->uses_persp_center = true;
+ break;
+
+ case INTERP_MODE_NOPERSPECTIVE:
+ if (var->data.sample)
+ info->uses_linear_sample = true;
+ else if (var->data.centroid)
+ info->uses_linear_centroid = true;
+ else
+ info->uses_linear_center = true;
+ break;
+ }
+ }
+ break;
+ }
+ case nir_intrinsic_interp_var_at_centroid:
+ case nir_intrinsic_interp_var_at_sample:
+ case nir_intrinsic_interp_var_at_offset: {
+ enum glsl_interp_mode interp =
+ intr->variables[0]->var->data.interpolation;
+ switch (interp) {
+ case INTERP_MODE_SMOOTH:
+ case INTERP_MODE_NONE:
+ if (intr->intrinsic == nir_intrinsic_interp_var_at_centroid)
+ info->uses_persp_opcode_interp_centroid = true;
+ else if (intr->intrinsic == nir_intrinsic_interp_var_at_sample)
+ info->uses_persp_opcode_interp_sample = true;
+ else
+ info->uses_persp_opcode_interp_offset = true;
+ break;
+ case INTERP_MODE_NOPERSPECTIVE:
+ if (intr->intrinsic == nir_intrinsic_interp_var_at_centroid)
+ info->uses_linear_opcode_interp_centroid = true;
+ else if (intr->intrinsic == nir_intrinsic_interp_var_at_sample)
+ info->uses_linear_opcode_interp_sample = true;
+ else
+ info->uses_linear_opcode_interp_offset = true;
+ break;
+ case INTERP_MODE_FLAT:
+ break;
+ default:
+ unreachable("Unsupported interpoation type");
+ }
+ break;
+ }