r600: Fix interpolateAtCentroid

If the instruction interpolateAtCentroid is used the extra interpolator
must also be enabled in the state.

Fixes: fs-interpolateatcentroid-block

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index cfeab81..b831561 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -3364,6 +3364,12 @@
 				spi_baryc_cntl |= spi_baryc_enable_bit[k];
 				have_perspective |= k < 3;
 				have_linear |= !(k < 3);
+				if (rshader->input[i].uses_interpolate_at_centroid) {
+					k = eg_get_interpolator_index(
+						rshader->input[i].interpolate,
+						TGSI_INTERPOLATE_LOC_CENTROID);
+					spi_baryc_cntl |= spi_baryc_enable_bit[k];
+				}
 			}
 		}
 
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index fc82647..85e584b 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -6973,6 +6973,7 @@
 	}
 	else {
 		location = TGSI_INTERPOLATE_LOC_CENTROID;
+		ctx->shader->input[input].uses_interpolate_at_centroid = 1;
 	}
 
 	k = eg_get_interpolator_index(ctx->shader->input[input].interpolate, location);
diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h
index 3b3e667..b7046b3 100644
--- a/src/gallium/drivers/r600/r600_shader.h
+++ b/src/gallium/drivers/r600/r600_shader.h
@@ -54,6 +54,7 @@
 	unsigned		back_color_input;
 	unsigned		write_mask;
 	int			ring_offset;
+	unsigned		uses_interpolate_at_centroid;
 };
 
 struct r600_shader_atomic {
diff --git a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
index 90e6df7..6b19d61 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
@@ -171,8 +171,13 @@
 		sh->add_input(in.gpr, preloaded, /*in.write_mask*/ 0x0F);
 		if (ps_interp && in.spi_sid) {
 			int k = eg_get_interpolator_index(in.interpolate, in.interpolate_location);
-			if (k >= 0)
+			if (k >= 0) {
 				ij_interpolators[k] |= true;
+				if (in.uses_interpolate_at_centroid) {
+					k = eg_get_interpolator_index(in.interpolate, TGSI_INTERPOLATE_LOC_CENTROID);
+					ij_interpolators[k] |= true;
+				}
+			}
 		}
 	}