radeonsi: add one more SWITCH_ON_EOI requirement for Hawaii and VI
authorMarek Olšák <marek.olsak@amd.com>
Sun, 18 Oct 2015 20:07:01 +0000 (22:07 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 23 Oct 2015 22:01:20 +0000 (00:01 +0200)
The VI condition depends on geometry shaders and MAX_PRIMGRP_IN_WAVE.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeonsi/si_state_draw.c

index 1aa5456f6a143c95e3212fcd328e1c733f1696b9..3b606b2c7dcf60dc9f98f78e2e1cd566aa630839 100644 (file)
@@ -223,6 +223,7 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
        struct si_state_rasterizer *rs = sctx->queued.named.rasterizer;
        unsigned prim = info->mode;
        unsigned primgroup_size = 128; /* recommended without a GS */
+       unsigned max_primgroup_in_wave = 2;
 
        /* SWITCH_ON_EOP(0) is always preferable. */
        bool wd_switch_on_eop = false;
@@ -296,6 +297,13 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
                if (sctx->b.screen->info.max_se > 2 && !wd_switch_on_eop)
                        ia_switch_on_eoi = true;
 
+               /* Required by Hawaii and, for some special cases, by VI. */
+               if (ia_switch_on_eoi &&
+                   (sctx->b.family == CHIP_HAWAII ||
+                    (sctx->b.chip_class == VI &&
+                     (sctx->gs_shader.cso || max_primgroup_in_wave != 2))))
+                       partial_vs_wave = true;
+
                /* Instancing bug on Bonaire. */
                if (sctx->b.family == CHIP_BONAIRE && ia_switch_on_eoi &&
                    (info->indirect || info->instance_count > 1))
@@ -319,7 +327,8 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
                S_028AA8_PARTIAL_ES_WAVE_ON(partial_es_wave) |
                S_028AA8_PRIMGROUP_SIZE(primgroup_size - 1) |
                S_028AA8_WD_SWITCH_ON_EOP(sctx->b.chip_class >= CIK ? wd_switch_on_eop : 0) |
-               S_028AA8_MAX_PRIMGRP_IN_WAVE(sctx->b.chip_class >= VI ? 2 : 0);
+               S_028AA8_MAX_PRIMGRP_IN_WAVE(sctx->b.chip_class >= VI ?
+                                            max_primgroup_in_wave : 0);
 }
 
 static unsigned si_get_ls_hs_config(struct si_context *sctx,