radeonsi: fix a badly implemented GS bug workaround
authorMarek Olšák <marek.olsak@amd.com>
Tue, 23 Aug 2016 15:58:22 +0000 (17:58 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 5 Sep 2016 16:01:15 +0000 (18:01 +0200)
Limit it to geometry shaders and Hawaii.

Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state_draw.c

index bcf1104b4c16fdd789aaa73bcf57bde0a395c629..60cc3f05dfaf50ba295d4972fe25aedde01eb6fe 100644 (file)
@@ -344,6 +344,19 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
                    (info->indirect || info->instance_count > 1))
                        partial_vs_wave = true;
 
+               /* GS hw bug with single-primitive instances and SWITCH_ON_EOI.
+                * The hw doc says all multi-SE chips are affected, but Vulkan
+                * only applies it to Hawaii. Do what Vulkan does.
+                */
+               if (sctx->b.family == CHIP_HAWAII &&
+                   sctx->gs_shader.cso &&
+                   ia_switch_on_eoi &&
+                   (info->indirect ||
+                    (info->instance_count > 1 &&
+                     si_num_prims_for_vertices(info) <= 1)))
+                       sctx->b.flags |= SI_CONTEXT_VGT_FLUSH;
+
+
                /* If the WD switch is false, the IA switch must be false too. */
                assert(wd_switch_on_eop || !ia_switch_on_eop);
        }
@@ -356,14 +369,6 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
        if (SI_GS_PER_ES / primgroup_size >= sctx->screen->gs_table_depth - 3)
                partial_es_wave = true;
 
-       /* Hw bug with single-primitive instances and SWITCH_ON_EOI
-        * on multi-SE chips. */
-       if (sctx->b.screen->info.max_se >= 2 && ia_switch_on_eoi &&
-           (info->indirect ||
-            (info->instance_count > 1 &&
-             si_num_prims_for_vertices(info) <= 1)))
-               sctx->b.flags |= SI_CONTEXT_VGT_FLUSH;
-
        return S_028AA8_SWITCH_ON_EOP(ia_switch_on_eop) |
                S_028AA8_SWITCH_ON_EOI(ia_switch_on_eoi) |
                S_028AA8_PARTIAL_VS_WAVE_ON(partial_vs_wave) |