radeonsi/gfx10: fix unnecessary LDS overallocation for NGG GS
authorMarek Olšák <marek.olsak@amd.com>
Sat, 6 Jul 2019 02:12:36 +0000 (22:12 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 20 Jul 2019 00:16:19 +0000 (20:16 -0400)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
src/gallium/drivers/radeonsi/gfx10_shader_ngg.c
src/gallium/drivers/radeonsi/si_shader.c

index e69bc810b632f69db070fe993aeb36b4c99affc5..de0299740f821114ce67945510af1654eb4663b4 100644 (file)
@@ -1279,17 +1279,11 @@ void gfx10_ngg_calculate_subgroup_info(struct si_shader *shader)
        /* We can't allow using the whole LDS, because GS waves compete with
         * other shader stages for LDS space.
         *
-        * Streamout can increase the ESGS buffer size later on, so be more
-        * conservative with streamout and use 4K dwords. This may be suboptimal.
-        *
-        * Otherwise, use the limit of 7K dwords. The reason is that we need
-        * to leave some headroom for the max_esverts increase at the end.
-        *
         * TODO: We should really take the shader's internal LDS use into
         *       account. The linker will fail if the size is greater than
         *       8K dwords.
         */
-       const unsigned max_lds_size = (gs_sel->so.num_outputs ? 4 : 7) * 1024 - 128;
+       const unsigned max_lds_size = 8 * 1024 - 768;
        const unsigned target_lds_size = max_lds_size;
        unsigned esvert_lds_size = 0;
        unsigned gsprim_lds_size = 0;
index f217abd1501cf7a622c96904615a1911b6882df0..8f392d640fe16d2bf6ebae03fc9ce84237bcb401 100644 (file)
@@ -5242,7 +5242,7 @@ static bool si_shader_binary_open(struct si_screen *screen,
        }
 
        if (sel && shader->key.as_ngg) {
-               if (sel->so.num_outputs) {
+               if (sel->type != PIPE_SHADER_GEOMETRY && sel->so.num_outputs) {
                        unsigned esgs_vertex_bytes = 4 * (4 * sel->info.num_outputs + 1);
                        esgs_ring_size = MAX2(esgs_ring_size,
                                              shader->ngg.max_out_verts * esgs_vertex_bytes);