radeonsi: fix primitive ID in fragment shader when using tessellation
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 3 May 2017 09:40:07 +0000 (11:40 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 8 May 2017 15:42:17 +0000 (17:42 +0200)
In a VS->TCS->TES->PS pipeline, the primitive ID is read from TES exports,
so it is as if TES were using the primitive ID.

Specifically, this fixes a bug where the primitive ID is not reset at
the start of a new instance.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_state_shaders.c

index 8c09ff12687264caeeb7704cdede66fb5d83d422..9138706acd0d1203b46d52c64e1551194043eed1 100644 (file)
@@ -2138,6 +2138,17 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
        r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
 }
 
+static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx)
+{
+       sctx->ia_multi_vgt_param_key.u.tcs_tes_uses_prim_id =
+               (sctx->tes_shader.cso &&
+                sctx->tes_shader.cso->info.uses_primid) ||
+               (sctx->tcs_shader.cso &&
+                sctx->tcs_shader.cso->info.uses_primid) ||
+               (sctx->ps_shader.cso && !sctx->gs_shader.cso &&
+                sctx->ps_shader.cso->info.uses_primid);
+}
+
 static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
 {
        struct si_context *sctx = (struct si_context *)ctx;
@@ -2154,20 +2165,14 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
        si_mark_atom_dirty(sctx, &sctx->clip_regs);
        sctx->last_rast_prim = -1; /* reset this so that it gets updated */
 
-       if (enable_changed)
+       if (enable_changed) {
                si_shader_change_notify(sctx);
+               if (sctx->ia_multi_vgt_param_key.u.uses_tess)
+                       si_update_tcs_tes_uses_prim_id(sctx);
+       }
        r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx));
 }
 
-static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx)
-{
-       sctx->ia_multi_vgt_param_key.u.tcs_tes_uses_prim_id =
-               (sctx->tes_shader.cso &&
-                sctx->tes_shader.cso->info.uses_primid) ||
-               (sctx->tcs_shader.cso &&
-                sctx->tcs_shader.cso->info.uses_primid);
-}
-
 static void si_bind_tcs_shader(struct pipe_context *ctx, void *state)
 {
        struct si_context *sctx = (struct si_context *)ctx;
@@ -2222,6 +2227,8 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
        sctx->ps_shader.cso = sel;
        sctx->ps_shader.current = sel ? sel->first_variant : NULL;
        sctx->do_update_shaders = true;
+       if (sel && sctx->ia_multi_vgt_param_key.u.uses_tess)
+               si_update_tcs_tes_uses_prim_id(sctx);
        si_mark_atom_dirty(sctx, &sctx->cb_render_state);
 }