r600: Fix interpolateAtCentroid
authorGert Wollny <gert.wollny@collabora.com>
Wed, 28 Aug 2019 08:48:04 +0000 (10:48 +0200)
committerGert Wollny <gert.wollny@collabora.com>
Fri, 4 Oct 2019 08:09:01 +0000 (10:09 +0200)
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>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_shader.c
src/gallium/drivers/r600/r600_shader.h
src/gallium/drivers/r600/sb/sb_bc_parser.cpp

index cfeab815584cb5cbdbb077242cd87f16f292c7ea..b8315612fdd7b587a0a3ee6901edfcd75dfca4b1 100644 (file)
@@ -3364,6 +3364,12 @@ void evergreen_update_ps_state(struct pipe_context *ctx, struct r600_pipe_shader
                                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];
+                               }
                        }
                }
 
index fc826470d69962284bd9a00bfa1acb4bb0c04dfa..85e584baff50ee13a406a202344c072d9fb6d36c 100644 (file)
@@ -6973,6 +6973,7 @@ static int tgsi_interp_egcm(struct r600_shader_ctx *ctx)
        }
        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);
index 3b3e667ec567efa3b934e74bf62cdf63da47a35c..b7046b39d4c32a677fccbbd8513badd2cd0d697d 100644 (file)
@@ -54,6 +54,7 @@ struct r600_shader_io {
        unsigned                back_color_input;
        unsigned                write_mask;
        int                     ring_offset;
+       unsigned                uses_interpolate_at_centroid;
 };
 
 struct r600_shader_atomic {
index 90e6df745a75643d89d6ebf04ecd9c2ab580c781..6b19d61babeed4aa000b1c3177f3df44cef58dfe 100644 (file)
@@ -171,8 +171,13 @@ int bc_parser::parse_decls() {
                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;
+                               }
+                       }
                }
        }